开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情
一说到在响应式,就不可避免的涉及到px,em, rem,vw,vh,%这几个单位,同时还有transform属性的scale()方法,今天来好好学习一下。
先有个认识
px
px全称Pixel,中文意思为像素,也是我们最熟悉的一个单位;它用来表示图片或者图形的最小单位,是一个相对参数,在不同的分辨率下是不同的(所以像素是和分辨率有关的,和缩放是没有关系的),像素是一个一个小方格,也就叫像素点。
<div style="font-size: 32px">这是px设置的字体,font-size: 32px</div>
说到像素就免不了提一下分辨率,分辨率又称解析度、解像度,在细分可分为显示分辨率、图片分辨率、打印分辨率和扫描分辨率等;
- 显示分辨率--显示器所有可视面积上水平像素和垂直像素的数量,分辨率越高,显示屏可显示的像素就越多;常说的4k(3840×2160)分辨率、8K(7680×4320)分辨率,指的就是显示分辨率,也就是显示器能放这么多像素;
- 图片分辨率--图像中所储存的信息量,即每英寸图像中有多少个
像素点,单位为PPI(像素每英尺),一般用于PS,改变图像的清晰度如果图片的分辨率大于显示的分辨率,就会出现局部显示,或者压缩显示;
所以如果一个帅哥告诉你他的屏幕像素是1920✖1080的,那你就应该知道他说的不是屏幕的长宽,而是屏幕能放1920✖1080个像素点;如果另一个帅哥告诉你这张图片像素是640✖480,那你就应该知道他说的不是图片的长宽,而是这个图片包含了640✖480个像素。
em
em是相对长度单位,相对于当前对象内文本的字体尺寸;如果当前对象内文本的字体尺寸未人为设置,则相对于浏览器的默认字体尺寸;一般为16px;
-
em 的值并不是固定的
-
em 会继承父级元素的字体大小
p { width: 2em; height: 2em; font-size: 20px; } // p 的宽高都为40px 它参照的是自身字体大小div { font-size: 10px; p { width: 2em; height: 2em } } // p 的宽高都为20px 如果自身没有设置字体,那么会继承父元素的
<div style="font-size: 32px;">
<div style="font-size: 1em">这是em设置的字体,font-size:1em,父级font-size: 32px</div>
</div>
注:为了简化 font-size 的换算,我们需要在css中的 body 选择器中声明font-size= 62.5%,这就使 em 值变为 16px*62.5% = 10px。这样 12px = 1.2em, 10px = 1em, 也就是说只需要将你的原来的px 数值除以 10,然后换上 em作为单位就行了。
rem
rem是相对长度单位,根据页面的根节点的字体尺寸进行单位转换;浏览器的默认字体尺寸为16px;通过它既可以做到只修改根元素就成比例地调整所有字体大小,又可以避免字体大小逐层复合的连锁反应
<div style="font-size: 2rem">这是rem设置的字体,font-size:2rem</div>
同理,如果想要简化font-size的转化,我们可以在根元素html中加入font-size: 62.5%
vw(Viewport Width)
vw是相对长度单位,相对于视口的宽度,视口会被均分为100单位的vw;比如浏览器的宽度为1920px,则1vw=1920px/100=19.2px;不需要JS和CSS耦合在一起的单位
vh(Viewport Height)
vh是相对长度单位,相对于视口的高度,视口会被均分为100单位的vh;比如浏览器的宽度为1920px,则1vw=1080px/100=10.8px;不需要JS和CSS耦合在一起的单位
<div style="background-color: red;width: 50vw;height: 50vh;"></div>
%
%(百分比)是相对长度单位,相对于包含块的高宽或字体大小来取值;关于包含块(containing block)的概念,不能简单地理解成是父元素。
-
如果是静态定位和相对定位,包含块一般就是其父元素。
<div style="width: 1080px;height: 1920px;"> <div style="width: 10%;height: 10%;background-color: red;"></div> </div> -
如果是绝对定位的元素,包含块应该是离它最近的 position为非static属性的祖先元素。
<div style="width: 1080px;height: 500px; position: relative;"> <div style=" position: absolute;width: 10%;height: 10%;background-color: red;"></div> </div> <div style=" position: absolute;width: 10%;height: 10%;background-color: green;"></div> -
如果是固定定位的元素,它的包含块是视口(viewport)
<div style="width: 100px;height: 100px;"> <div style="position: fixed;width: 10%;height: 10%;background-color: blue;"></div> </div>
scale()
scale()是transform属性上的一個方法,可以实现元素的缩放效果。
transform: scaleX()--沿x轴方向缩放transform: scaleY()--沿y轴方向缩放transform: scale()--沿x轴和y轴同时缩放
<div style="width: 100px;height: 100px;background-color: red; transform: scale(10);"></div>
有什么缺点
通过上面的认识,我们已经知道了各自的特点,那在使用过程中应该如何选择;
px--固定值,不能响应式。em--计算复杂,因为字体大小的计算不仅要考虑自身的大小有没有设置,还要考虑父元素字体的代销甚至是父元素的父元素的大小;在嵌套的时候比较复杂;rem--因为都是根据根节点去计算大小的,所以缺少一些个性化vw、vh--不能十分精准的换算,1px、较小的像素不好适配%--宽高太小引起的内容溢出;宽高过大引起的内容之间的间距太大scale--当缩放比例过大时候,字体会有一点点模糊,就一点点;事件热区会偏移,就是鼠标坐标点这些会稍微有点问题
应用选择
-
px--通常用于边框宽度的border的设置上比较好 -
em--通常用于依赖字体尺寸的元素属性上,比如width、height、marign、padding等元素,也就是元素字体尺寸变化,其他属性也需要跟着变化的情况 -
rem--除了以上两种情况都可以使用rem,这样整体都会协调 -
vw、vh--多种设备时推荐使用,常用于移动端的布局之中;喜欢用这个 -
%--简单场景可使用 -
scale--在适配大屏上实现缩放效果很好,放心使用
总结
随着数据大屏适配的需求越来越多,掌握这些简单又核心的知识是必不可少的。如果你看到这里了,烦请大佬点个赞,鼓励小弟学习,不胜感激,谢谢。