时间:2023-09-02 22:24:02 | 来源:网站运营
时间:2023-09-02 22:24:02 来源:网站运营
HTML & CSS - 如何让页面成为响应式设计?:现在的用户会用不同的设备来浏览同一个页面,所以如何让页面适应不同的屏幕尺寸是很重要的一件事。本文将会介绍如何让页面成为响应式设计。@media
all
: 适用于所有媒体类型。print
: 适用于打印预览模式。screen
: 适用于电脑屏幕、平板、手机等。speech
: 适用于读出页面内容的屏幕阅读器。width
、 min-width
、 max-width
)、高(height
、 min-height
、 max-height
)和宽高比(aspect-ratio
、 min-aspect-ratio
、 max-aspect-ratio
)。一旦屏幕尺寸满足了宽和高的规则,在其中定义的样式就会被应用。orientation
(朝向): orientation
属性可以检测设备是 portrait
(竖放,高 >= 宽)或 landscape
(横放, 宽 >= 高)。resolution
、 min-resolution
、 max-resolution
): 这个特征可以用来测试输出设备的像素密度。像素密度的单位是 dpi
(每英寸点数),你可以用 DPI I love 或 DPI Checker 来查看你当前设备的像素密度。 hover
可以根据用户的主要输入机制是否可以在元素上悬停, any-hover
可以用来测试是否有任意可用的输入机制可以在元素上悬停,它们的值可以是 none
(没有输入机制可以方便地悬浮,或不存在定点输入机制)或 hover
(输入机制可以方便地在元素上悬浮)。这两个媒体特征适用于移动端和 PC 端通用一个按钮,但 PC 端需要一个悬停效果。 pointer
可以测试用户的主要输入机制是否拥有定点装置以及它的精确度, any-pointer
可以测试用户是否用于任意定点装饰以及它的精确度,它们的值可以是 none
(没有可用的定点设备)、 coarse
(有一个精度有限的定点装置) 或 fine
(有一个精确的定点装置)。prefers-color-scheme
: prefers-color-scheme
可以检测用户是否有将系统的主题色设置为 light
(亮色)或 dark
(暗色)。 and
: 结合多个媒体查询,需要每个媒体查询都返回 true
。not
: 反转整个媒体查询的含义。⚠️ 如果用到了 not
,需要同时定义一个媒体类型。only
: 只有整个查询符合时才会应用样式。 ⚠️ 如果用套了 only
,需要同时定义一个媒体类型。,
(逗号): 将多个媒体查询结合成一个用逗号分隔的列表,只要列表中的之中一个媒体查询返回 true
,整个媒体查询就会返回 true
。/* 屏幕宽度 >= 600px */@media screen and (min-width: 600px) { div { background: lightblue; }}/* 只在打印预览模式 */@media only print { h1 { font-size: 30px; }}
如果想要看更多关于媒体查询的示例代码,可以戳我的 CodePen。<meta>
标签name=viewport
的 <meta>
标签可以控制视口的尺寸。<meta>
标签是:<meta name="viewport" content="width=device-width, initial-scale=1.0">
上面代码中告诉浏览器页面的宽度和设备宽度一致(通过 width=device-width
),且设置页面初始加载的缩放比为 1 (通过 initial-scale=1.0
)。content
属性里的属性有:width
: width
属性设置了视口的宽度。它的值可以是一个特定的数字(1
到 10000
之间)或 device-width
。height
: height
属性设置了视口的高度。它的值可以是一个特定的数字(1
到 10000
之间)或 device-height
。initial-scale
: initial-scale
属性设置也页面初始加载的缩放比。它的值是 0.1
到 10
之间的特定数字。minimum-scale
: minimum-scale
属性设置了页面最小的缩放比。 它的值是 0.1
到 10
之间的特定数字。maximum-scale
: maximum-scale
属性设置了页面最大的缩放比。它的值是 0.1
到 10
之间的特定数字。user-scalable
: user-scalable
属性控制了页面是否允许放大和缩小的操作。它的值可以是 yes
(允许放大和缩小的操作)或 no
(不允许放大和缩小的操作)。<meta>
标签,可以看看 MDN - Viewport meta tag 和 W3Schools - Responsive Web Design - The Viewport。 在弹性布局模型中,弹性容器的子元素可以在任何方向上排布,也可以“弹性伸缩”其尺寸,既可以增加尺寸以填满未使用的空间,也可以收缩尺寸以避免父元素溢出。定义一个弹性盒子需要:
display: flex;
。flex-direction
: flex-direction
属性定义了主轴的方向。它的值可以是 row
(如果是 ltr
就是从左到右,如果是 rtl
就是从右到左)、 row-reverse
、 column
(如果是 ltr
就是从上到下,如果是 rtl
就是从下到上)或 column-reverse
。flex-wrap
: flex-wrap
属性指定了 flex 元素单行显示(no-wrap
)还是多行显示(wrap
或 wrap-reverse
)。justify-content
: justify-content
属性定义了如何分配顺着弹性容器主轴的元素之间及其周围的空间。它的值可以是 flex-start
(根据 flex-direction
定义的方向,从行首开始排列) 、 flex-end
、 center
、 space-between
(在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素与行首对齐,每行最后一个元素与行尾对齐)、 space-around
(在每行上均匀分配弹性元素。相邻元素间距离相同。每行第一个元素到行首的距离和每行最后一个元素到行尾的距离将会是相邻元素之间距离的一半)或 space-evenly
(flex 项都沿着主轴均匀分布在指定的对齐容器中。相邻 flex 项之间的间距,主轴起始位置到第一个 flex 项的间距,主轴结束位置到最后一个 flex 项的间距,都完全一样)。 align-items
: align-items
属性设置弹性项目在其包含块中在交叉轴方向上的对齐方式。flex-basis
: flex-basis
属性指定了 flex 元素在主轴方向上的初始大小。flex-grow
: flex-grow
属性设置了 flex 项主尺寸的 flex 增长系数。flex-shrink
: flex-shrink
属性指定了 flex 元素的收缩规则。<div class="flex-container"> <div class="flex-item">1</div> <div class="flex-item">2</div> <div class="flex-item">3</div> <div class="flex-item">4</div> <div class="flex-item">5</div> <div class="flex-item">6</div></div>
.flex-container { width: 200px; border: 1px solid blue; display: flex; flex-wrap: wrap; justify-content: center;}.flex-item { width: 50px; height: 50px; background: pink; margin: 10px;}
如果想要看关于弹性盒子布局的示例代码,可以戳我的 CodePen - flex 和 CodePen - flex-flow。网格是由一系列水平及垂直的线构成的一种布局模式。根据网格,我们能够将设计元素进行排列,帮助我们设计一系列具有固定位置以及宽度的元素的页面,使我们的网站页面更加统一。定义一个网格布局需要:
一个网格通常具有许多的列(column)与行(row),以及行与行、列与列之间的间隙,这个间隙一般被称为沟槽(gutter)。
display: grid;
。grid-template
: grid-template
是 grid-template-rows
(基于网格行,定义网格线的名称和网格轨道的尺寸大小)、 grid-template-columns
(基于网格列,定义网格线的名称和网格轨道的尺寸大小)和 grid-template-areas
(网格区域在 CSS 中的特定命名)属性的简写属性。 gap
: gap
是 row-gap
(设置行元素之间的间隙大小)和 column-gap
(设置元素列之间的间隙大小)属性的简写属性。 justify-items
: justify-items
属性定义了元素沿行轴线的对齐方式。它的值可以是 start
(与单元格的起始边缘对齐所有项)、 end
、 center
或 stretch
(填满单元格的全部宽度)。align-items
: align-items
属性定义了元素沿列轴线的对齐方式。它的值可以是 start
、 end
、 center
、 stretch
或 baseline
。 grid-column
: grid-column
是 grid-column-start
和 grid-column-end
属性的简写属性,通过 <start-line> / <end-line>
定义了网格元素的位置。grid-row
: grid-row
是 grid-row-start
和 grid-row-end
属性的简写属性,通过 <start-line> / <end-line>
定义了网格元素的位置。grid-area
: grid-area
属性定义了网格元素的名字,这样 grid-template-area
属性可以通过这个名字引用这个元素。<div class="grid-container"> <div class="grid-item1">1</div> <div class="grid-item2">2</div> <div class="grid-item3">3</div></div>
.grid-container { display: grid; border: 1px solid red; padding: 10px; grid-template: "a a ." 50px "a a ." 1fr ". b c" 70px ". b ." 20px / 150px 1fr 50px; /* grid-template-rows: 50px 1fr 70px 20px; grid-template-columns: 150px 1fr 50px; grid-template-areas: "a a ." "a a ." ". b c" ". b ."; */}.grid-item1 { grid-area: a; background: lightblue;}.grid-item2 { grid-area: b; background: orange;}.grid-item3 { grid-area: c; background: lightgreen;}
想要看更多关于网格布局的示例代码,可以戳我的 CodePen - grid-template、 CodePen - grid-area, grid-column, grid-row 和 CodePen - grid。columns
: columns
是 column-count
(定义元素的列数)和 column-width
(定义每一列的理想宽度)属性的简写属性。column-gap
: column-gap
属性设置了元素列之间的间隔大小。column-rule
: column-rule
是 column-rule-width
(设置两列之间的线条宽度)、 column-rule-style
(设置两列之间的线条样式)和 column-rule-color
(设置两列之间的线条颜色)属性的简写属性。 .article { columns: 3; /* column-count: 3; */ column-rule: 3px dotted blue; /* column-rule-width: 3px; column-rule-style: dotted; column-rule-color: blue; */ column-gap: 20px;}
如果想看更多关于多列布局的示例代码,可以戳我的 CodePen。px
, 是浏览器中准确的绝对长度单位。响应式排版会使用到相对长度单位让长度可以响应不同的字体大小或视口大小。em
: 在 font-size
中使用是相对于父元素的字体大小,在其他属性中使用是相对于自身的字体大小。rem
: 根元素的字体大小。vw
: 视窗宽度的 1%。vh
: 视窗高度的 1%。px
转化为 rem
的有效工具:srcset
属性或 CSS image-set()
函数 <img>
标签支持 srcset
属性来为不同像素的设备加载不同的图片资源。srcset
属性的值是以逗号分隔的一个或多个字符串,每一个字符串的组杭州是:w
)。该整数宽度处以 sizes
属性给出的资源大小来计算得到的有效的像素密度,即换算成和 x
描述符等价的值。x
)。 你可以用 JavaScript 的 window.devicePixelRatio
来查看你设备的像素密度。<img src="https://www.shareicon.net/data/512x512/2016/06/01/576694_background_600x600.png" srcset="https://www.shareicon.net/data/64x64/2016/06/01/576694_background_600x600.png, https://www.shareicon.net/data/256x256/2016/06/01/576694_background_600x600.png 1.5x, https://www.shareicon.net/data/512x512/2016/06/01/576694_background_600x600.png 2x" alt="Blue Background"/>
CSS 的 image-set()
函数让浏览器从一组图片资源中选择最合适当前像素屏幕的图片。.image { width: 100px; height: 100px; background-image: image-set( url("https://www.shareicon.net/data/64x64/2016/06/01/576694_background_600x600.png") 1x, url("https://www.shareicon.net/data/256x256/2016/06/01/576694_background_600x600.png") 1.5x, url("https://www.shareicon.net/data/512x512/2016/06/01/576694_background_600x600.png") 2x);}
srcset
和 sizes
属性srcset
和 sizes
属性结合,我们可以定义在不同的屏幕下哪张图片会是最适合被展示的。sizes
属性的值是以逗号分隔的一个或多个字符串,每一个资源大小包括:<img src="https://www.shareicon.net/data/512x512/2016/06/01/576694_background_600x600.png" srcset="https://www.shareicon.net/data/64x64/2016/06/01/576694_background_600x600.png 100w, https://www.shareicon.net/data/256x256/2016/06/01/576694_background_600x600.png 200w" sizes="(max-width: 600px) 100px, 200px" alt="Blue Background"/>
padding
和 background
属性来按宽高比来裁剪图片padding
和 background
属性。<div class="image-continer"> <!-- 1:1 --> <div id="one-to-one"/></div><div class="image-container"> <!-- 3:4 --> <div id="three-to-four"/></div><div class="image-container"> <!-- 4:3 --> <div id="four-to-three"/></div>
.image-container { width: 200px;}/* 1:1 */#one-to-one { width: 100%; height: 0; padding-bottom: 100%; overflow: hidden; background: url(https://www.androidfreeware.net/img2/com-aestheticwallpaper-girlywallpaper-cute-panda-butterflies-kawaii-offlinewallpaper.jpg) center / cover no-repeat;}/* 3:4 */#three-to-four { width: 100%; height: 0; padding-bottom: 133.33%; overflow: hidden; background: url(https://www.androidfreeware.net/img2/com-aestheticwallpaper-girlywallpaper-cute-panda-butterflies-kawaii-offlinewallpaper.jpg) center / cover no-repeat;}/* 4:3 */#four-to-three { width: 100%; height: 0; padding-bottom: 75%; overflow: hidden; background: url(https://www.androidfreeware.net/img2/com-aestheticwallpaper-girlywallpaper-cute-panda-butterflies-kawaii-offlinewallpaper.jpg) center / cover no-repeat;}
按比例展示图片:因为按照百分比来设置 CSS padding
属性的值时,百分比是相对于包含款的宽度,所以我们将宽度 width
设置成了想要的值,并将高度 height
设为了0,然后我们可以根据指定的宽高比将 padding
属性设置成相应的百分比值。<div>
标签来展示图片,所以图片资源被放在了 background
属性里。我们可以使用 background-size
和 background-position
属性来定义我们想展示图片的哪一部分。aspect-ratio
和 object-fit
属性来按宽高比来裁剪图片aspect-ratio
和 object-fit
属性。aspect-ratio
属性允许我们将图片规定为任何纵横比,而 object-fit
属性允许我们在宽高比内展示图片的任何部分。<!-- 16:9 --><img id="sixteen-to-nine" src="https://images.unsplash.com/photo-1554629947-334ff61d85dc?ixid=MnwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8&ixlib=rb-1.2.1&auto=format&fit=crop&w=256&h=256&q=80" />
/* 16:9 */#sixteen-to-nine { width: 200px; aspect-ratio: 16 / 9; object-fit: cover;}
如果想要更完整地了解这两个属性,可以看看 MDN - aspec-ratio 和 MDN - object-fit。关键词:响应,设计