%
)in
)cm
)mm
)pt
)pc
)ex
)em
)px
)rem
)vw
)vh
)vmax
)vmin
)使用前能够在 http://caniuse.com/ 查看各个单位的浏览器兼容性
ppi
(pixels per inch
)设备像素表示每英寸所拥有的像素(pixel
)数目,数值越高,表明屏幕能以更高的密度显示图像。css
计算公式:ppi=像素数量/物理尺寸(英寸数)
html
dips
(device-independent pixels
)设备独立像素。html5
咱们但愿不一样屏幕显示图片的大小要一致,咱们要计算图片缩放比例。git
计算公式:图片逻辑像素大小px1 / 图片缩放后实际像素大小px2 = 设备像素dp / 设备独立像素dips px2 = px1 * (dp / dips) px2 = px1 * dpr
dpr
(devicePixelRatio
)是设备像素dp
和设备独立像素dips
的比例。dpr = dp / dips
github
css
像素是一个相对单位。相对不一样屏幕,其实际像素大小不一样。
咱们定义时,是定义其逻辑像素。即该图要用多少个像素来显示。segmentfault
rem
(root element
),这个是一个相对的单位。
与em
的差异在于rem
相对的是根节点html
的font-size
,em
相对的是父元素font-size
。浏览器
动态修改html
的font-size
,那么使用rem
的元素的对应单位实际像素也会相应的改变,因此咱们只要写一份css
就能够适配全部手机的屏幕了。虽然rem
在某些浏览器下面不够精准,但那也只是少数,若是须要很是精准的适配,那么可使用js
来计算html
的font-size
。sass
如今设计师给的移动端视觉稿,通常都是按照750px
来设计的。当咱们拿到视觉稿时,首先把视觉稿的宽度转换为rem
,咱们并不须要考虑设备的分辨率,只须要按照 布局
计算公式:视觉稿宽度 = font-size * rem
字体
这个公式来计算就行了。视觉稿的宽度是咱们以750px
为例,font-size
与 rem
是两个变量,咱们只须要它们的乘积等于750
便可。咱们采用 定一变一的方式,假定rem=7.5
,那么初始值font-size
就必须等于 100px
,咱们就能够根据须要适配的屏幕宽度来等比例调整font-size
。那么若是咱们750px
的视觉稿须要显示成640px
呢,咱们只须要把font-size
对应的缩小就能够了。其余的各类的屏幕,只须要等比例缩放就行了。
JS
动态设置font-size
(简单demo
,若有须要最好加上DomContentLoaded
和orientationchange
的监听):
fnResize(); window.addEventListener("resize", function() { fnResize() }, false); function fnResize(){ var docWidth = document.documentElement.clientWidth, body = document.getElementsByTagName('html')[0]; body.style.fontSize = docWidth / 32 + 'px'; }
sass:
@function rem($px){ @return $px*(1/20)*1rem; } .ty_con{ minwidth: rem(300); /* 15rem */ }
问题:
部分安卓机rem
计算出来的font-size
老是要比预期要大一些或者小一些:华为,魅族......(小数保留问题)这样会致使最后的计算是不许确的。
解决方案1:
css
的使用上宽度布局尽可能使用百分比,flex
和box-sizing
来作,减小宽度计算偏差产生的问题。icon
雪碧图的图标之间留白,在写宽度的时候多写几像素使图标居中。解决方案2:
在每次计算完页面的fontSize
后,对某个实际元素的大小进行判断,若是对比原来的比例有0.2
以上的出入,那就用这个比例去从新设置页面的fontSize
。若是是正常状况,就不会执行页面fontSize
从新这一步。至此,问题也算是解决了。
解决方案3:
直接使用Flexible
实现H5
的终端适配
有兴趣的小伙伴能够看下Flexible
的解决方案:
使用Flexible实现手淘H5页面的终端适配: http://www.w3cplus.com/mobile...
github地址: https://github.com/amfe/lib-f...
移动端Web适配单位rem的坑你知道多少 : http://www.jianshu.com/p/8300...
关于移动端 rem 布局的一些总结: https://segmentfault.com/a/11...