介绍
这是一份关于深度解析CSS单位px、em、rem、vh、vw、vmin、vmax。
1、px
px:绝对单位,页面按精确像素展示
2、em
em:相对单位,基准点为父节点字体的大小,如果自身定义了font-size按自身来计算(浏览器默认字体是16px),整个页面内1em不是一个固定的值。
em是指字体高度
浏览器默认1em=16px
,所以0.75em=12px
;我们经常会在页面上看到根元素写的font-size:62.5%
; 这样em就成了16px*62.5=10em
;这是显示在页面的字体大小是10px; 这样12px=1.2em,10px=1em
,也就是说只需要将你的原来的px数值除以10,然后换上em作为单位就行了
em的特点
em是个相对值 他会根据父级元素的大小而变化 但是如果嵌套了多个元素 要计算它的大小,是件很头疼的事情
这样的情况下,就出现了rem rem的区别在于它是相对于根基元素的,因此不会被它的父类影响到
结论:
之所以前端行业做移动端会普遍默认用rem或em,是因为可以通过js控制根元素(或者用@media)来达到适配各种分辨率的字体大小的效果
3、rem
rem:相对单位,可理解为”root em”
, 相对根节点html的字体大小来计算,CSS3新加属性,chrome/firefox/IE9+支持。// 是截止目前用的最多也是最流行的
rem
在移动端应用可参考淘宝的页面(http://m.taobao.com)[http://m.taobao.com] (html的font-size通过动态计算获取)
方案一:简单常用版本
页面基准750px;html font-size
值的计算:
1 |
|
注:把这段 原生JS 放到 HTML 的 head 标签中即可(需设置meta缩放比1:1)
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />
———-分割线———-
方案二:rem 进阶版–高清方案
和上面一下还是把这段 原生JS 放到 HTML 的 head 标签中即可(注:不要手动设置viewport,该方案自动帮你设置,通过修改viewport 属性放大缩小 initial-scale
)
1 |
|
- 代码原理:
这是阿里团队的高清方案布局代码,所谓高清方案就是根据设备屏幕的DPR(设备像素比,又称DPPX,比如dpr=2时,表示1个CSS像素由4个物理像素点组成) 动态设置 html 的font-size
, 同时根据设备DPR调整页面的缩放值,进而达到高清效果。
- 代码优势:
1 | 引用简单,布局简便 |
高清方案问题和参考: (https://zhuanlan.zhihu.com/p/25552482)[https://zhuanlan.zhihu.com/p/25552482]
———-分割线———-
关于方法二要修改页面根font-size
;和viewport
的比例,引出一种简单粗暴的页面适配,就是将设计稿按照PC的正常切图的方法输出后直接修改viewport的缩放比例达到想要的结果;缩放代码如下:mate viewport
标签,用JS追加
1 |
|
tips
:和上面相似的适配,也可以利用css3 transform 的scale 值来实现,只是需要在放大(旋转)元素的基点位置上(transform-origin
)做一下处理,下面用vw
适配控制页面大小的方法中有用到,原理很简单;
4、vw、vh、vmin、vmax
vw、vh、vmin、vmax 主要用于页面视口大小布局,相对于rem;v*在页面布局上更加方便简单
1 |
|
vw
逻辑非常清晰,"1vw = 1/100th viewport width"
,用viewport width的百分比来设置element width。vw
被支持的太晚是其并不流行的根本原因,而当时移动端web app/page的开发需求已经十分旺盛,弹性布局是一种不错的移动端界面兼容展现方式,对于rem机遇就此而来,便成为一个实现弹性布局效果的极佳方案。
其实看目前状况,对vw最不利的是Android Browser,ndroid Browser 4.4以下的用户是不兼容的,目前新版x5更新后,安卓版微信的vw vh vmin vmax 已经没有兼容性问题了,那么随着时间推移,相信未来vw将会流行。
vw, vh, vmin, vmax
:IE9+局部支持,chrome/firefox/safari/opera支持,ios safari 8+支持,android browser4.4+支持,chrome for android39支持
!(支持)[https://images2017.cnblogs.com/blog/824939/201707/824939-20170727110203515-222726527.jpg]
页面是基于浏览器窗口大小自动适配的如果感觉页面太大;可添加下面JS通过缩放控制页面的最大尺寸
1 | <script type="text/javascript"> |
5、其它的单位还有
- %:百分比
- in:寸
- cm:厘米
- mm:毫米
- pt:point,大约1/72寸
- pc:pica,大约6pt,1/6寸
ex:取当前作用效果的字体的x的高度,在无法确定x高度的情况下以0.5em计算(IE11及以下均不支持,firefox/chrome/safari/opera/ios safari/android browser4.4+等均需属性加么有前缀)
ch:以节点所使用字体中的“0”字符为基准,找不到时为0.5em(ie10+,chrome31+,safair7.1+,opera26+,ios safari 7.1+,android browser4.4+支持)
实际应用中:建议综合固定宽度、字体大小可用rem、px;其他可结合vw %