像素思维
这一小节,我们将介绍 px(Pixel)
。
逻辑像素而不是物理像素
px 从字面上来看是像素的意思,很多新手一上来可能会认为它的物理像素。
这里必须要澄清,px一般是指逻辑像素,它会根据浏览器、操作系统、硬件设备做适当的缩放。
但是,通常96px对应了一个物理英寸。
像素级的完美与响应式布局
最开始,px 被设计出来的时候所奉行的哲学就是提供像素级别的完美。
早期的网页设计者会在一个固定大小的页面中设计网页,一般是 800px,你的浏览器如果超过来这个尺寸,必须用水平或者上下滚轮来浏览。每一个元素都是以像素为单位,被精确和巧妙地安排在这个页面中。
随着高清显示屏的出现,人们开始考虑把网页调大到 1024px,甚至是 1280px,
设备的种类越来越多,尺寸、像素等等都难以兼容。
响应式布局
是一种能根据屏幕的大小动态调整的布局方式,如今大部分网页都是响应式的,你几乎看不到非响应式的网页了,记得我小时候冲浪就经常遇到那种网页大小不兼容的。
相对字号的大小单位
em 是一个非常有意思的属性。它是一个相对长度单位,相对于当前元素的字号,也就是相对于 font-size
的大小。
计算方法
例如,假设已定义当前的 font-size
的大小为 16px
,padding
的大小为 1.2em
,则 padding
的实际大小是多少 px?
|
|
这是一道简单的计算题,padding
的实际大小应该是 $16\times1.2=19.2(px)$。
字体大小相对于字体的大小
这是一个有趣的问题,既然 em 是相对于字体的大小单位,那么如果 字体font-size
的大小单位也是 em
会发生什么?
这种情况下,参照对象不再是元素自身,而是父元素。
|
|
|
|
假如父元素的 font-size
是 16px
,子元素的 font-size
为 2em
,则子元素的实际 font-size
应该为 32px
。
如果父元素没有特别说明,则会一直沿着 DOM树 向上,直到找到一个定义的字体大小为止,你始终可以找到一个定义的字体大小,因为浏览器会给根元素设置一个默认的固定的字体大小。
浏览器默认字号
对每一个网页的根节点,我们一般使用 伪类选择器:root
来表示,也可以使用 html
来表示。
大多数浏览器都定义了这个根元素的默认 font-size
为 16px
。
|
|
字体缩小问题
关于 font-size
使用 em
,你应当尽量避免使用,这会造成一个问题,这里有一个比较有趣的例子。
先做一个无序列表出来:
|
|
设置无序列表的字体为 0.8em
,根据计算,无序列表里面的字体大小应该是 12.8px
。
|
|
效果:
为什么字体越来越小了?
我们可以想象,根元素的字体大小是 16px,所以第一级无序列表是 12.8px 没问题,但是第二级无序列表的父元素是第一级无序列表,所以它的字体大小变成了 $12.8\times0.8=10.24(px)$ 。第三极无序列表的字体大小: $10.24\times0.8=8.192(px)$。
字体随着层级越来越多,变得越来越失控。
正式因为如此,我们一般不推荐使用 em 来定义字体大小,如果你一不小心,就可能造成这种悲剧。
相对根元素字号的大小单位
根元素伪类选择器
伪类选择器:root
,在 HTML 中对应的是 html
标签。
设置默认字号
以前,网页设计者们为了方便计算,很喜欢利用这个伪类选择器这样写:
|
|
这是因为 $16\times0.875=10(px)$,通过这种方式把根元素字号定义为 10px
后,接下来,基于根元素的字号计算可以变得简单一些。
自定义属性
这是 CSS3 非常重要的一个特性,不过大多数人都会忽略,事实上,我们习惯了使用 SASS/Scss、Less 等等CSS预处理器之后,这个特性已经比较鸡肋了。
|
|
如果 var() 函数计算出来的是一个非法值,会设置成对应属性的初始值。
rem-低复杂度的em
rem 是 root rm 的缩写,前面已经介绍过 ,rem 是相对于根元素的字号大小,根元素也就是 :root
,或者说是 html
。
|
|
ul 的 font-size
大小经过计算是 12.8px。
这个 css 代码可以解决上面我们的字体缩小问题。
因为 rem
是相对于根元素字体的大小,就不会引起因为父子元素嵌套而造成的递推缩小现象。
故此,rem 可以被认为是一种低复杂度的 em 。
相对视图窗口的大小单位
视图窗口指的是浏览器视图的大小,在桌面端的浏览器中,你可以随意拖动鼠标来调节这个窗口的大小。
主要涉及的元素是 vh
和 vw
,很显然,他们分别是 visual hight
和 visual width
的缩写。
单位 | 作用 | 备注 |
---|---|---|
vh | 视图窗口高度的$\frac{1}{100}$ | |
vw | 视图窗口宽度的$\frac{1}{100}$ | |
vmin | 视图窗口高度、宽度中较小一方的$\frac{1}{100}$ | 部分浏览器不支持 |
vmax | 视图窗口高度、宽度中较大一方的$\frac{1}{100}$ | 部分浏览器不支持 |
你可以认为这些是百分比单位,他们的原子单位都是 1%
。
使用 vh 和 vw 定义字号
|
|
假设这是在一个 1200px 的显示屏上,字体的大小经过计算是 24px。
而在一个 768px 的显示屏上,计算值是 15px。
这实在是太棒了,这是动态可调节的字号。
但是,如果你把浏览器的宽度放到很小,这太糟糕了,有没有可能设置一个最小值和最大值来限制这种现象?
使用 calc() 函数
|
|
这个设计的巧妙之处在于,当你缩小到一定程度,1vw 的计算值几乎不可见的时候,0.5em 依然可以保证它至少有 8px 的大小,不至于小到看不见。
响应式布局入门
响应式布局的精髓是对不同屏幕的适配,我们可以通过媒体查询来定义不同屏幕下的差异。
媒体查询应当规定一些固定的值,作为后面所有元素的参照,后面所有的元素都应该使用相对单位,除了一些线条可以使用 px,其他一律不建议使用。
这里只简单谈一些博主的经验,具体还要靠你们实践。
媒体查询
在 CSS 中,也叫 @meida
规则,它可以指定某种屏幕尺寸或者媒体类型下的样式。
|
|
在宽度小于 800px 屏幕下,根元素 font-size 的计算值是 12px;
在宽度大于 800px,但是小于 1200px 的屏幕下,根元素 font-size 的计算值是 14px;
在宽度大于 1200px 屏幕下,根元素 font-size 的计算值是 16px;
通过媒体查询,做到了不同屏幕的适配。
使用大小单位的建议
为了防止布局的不可调整,我们有一些一般性的结论,来使用 CSS 提供的各种单位。
使用 px 定义线
|
|
使用 em 定义间距
|
|
使用 rem 定义字号
|
|
使用 vh 和 vw 定义容器
|
|