flexible移动端适配学习笔记
参考资料
https://www.w3cplus.com/css/viewports.html
https://www.w3cplus.com/mobile/lib-flexible-for-html5-layout.html
1.需求背景
其实就是为了各种机型适配。
选择iphone6设计稿为基准,来适配其他机型
2.使用之前需要先了解的基础(暂时忽略兼容性问题和异常情况)
桌面设备浏览器
1) 屏幕尺寸(设备的pixels)
从screen.width/screen.height获取。(这个是显示器的特征,与浏览无关,不会因为缩放而改变)。如图:
2) 浏览器尺寸(CSS的pixels)
从window.innerWidth/window.innerHeight获取,浏览器窗口的内部宽度使用CSS的pixels(意思就是我打开浏览器,能看到里面的元素会因为我放大或者缩小浏览器而变少或者变多),而缩放比例就是如图:

3) 视窗 viewport
viewport的功能在于控制<html>元素,viewport是严格的等于浏览器的窗口。
举个例子:
1 |
|
运行代码可以看到,div宽度是100%,也就是viewport的宽度。

当我们缩小宽度的时候,并且向左边滚动一点,可以看到div宽度100%变成了viewport的宽度。而页面里的元素溢出了,溢出的元素仍然会显示。

总而言之:元素width:100%;与页面的宽度有关,与元素无关。
如何获取viewport的尺寸
1 | document.documentElement.clientWidth |
document.documentElement.clientWidth与window.innerWidth的区别
1 | window.innerWidth/Height包含滚动条 |
移动设备浏览器
1) visualviewport是当前显示在屏幕上的部分页面。用户会滚动页面来改变可见部分,或者缩放浏览器来改变visualviewport的尺寸。如图:

2) layoutviewport,CSS 布局通常是按照layoutviewport来定义,而比visualviewport宽很多,它是元素的父容器。只要你不在css中修改<html>元素的宽度,<html>元素的宽度就会撑满layout viewport的宽度。(一句话来说就是:浏览器加载出了整个页面,出现了滚动条,滚动可以浏览页面其他部分,缩放和浏览器窗口改变都不影响)

3)Media查询
width/height 反映document.documentElement.clientWidth/document.documentElement.Height的值, device-width/height 反映screen.width/screen.height

4) viewport的meta标签
可以用于设置layoutviewport的宽度。
3.设备像素比(设备像素比 = 物理像素 / 设备独立像素)
物理像素(设备像素):平时所说的分辨率,iphone6s 的分辨率是 750*1334

设备独立像素:iPhone6s的设备宽度和高度为375 * 667,可以理解为设备的独立像素
一台设备上程序用来描绘数据的一个个的“点”,这个点代表一个可以由程序使用的虚拟像素(比如说CSS像素)。以前设备像素对应一个设备独立像素,后来出现了高分辨率的手机,不可能再一个设备像素对应一个设备独立像素了,因为这样东西会被缩小,看不清。这个点代表一个可以由程序使用的虚拟像素(比如说CSS像素)
举个🌰
1倍屏:高宽1px的图片,是1个设备像素

2倍屏:高宽1px的方格,是4个设备像素,因为如果还是用一个设备像素就太小了

4.CSS单位rem
rem就是相对于根元素<html>的font-size来做计算。
而em是根据父元素的fon-size计算
Flexible会将视觉稿分成100份,而每一份被称为一个单位a。同时1rem单位被认定为10a,我就直接理解为设计稿由10rem组成

5.meta标签
1 | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"> |
1 | <meta name="flexible" content="initial-dpr=2" /> |
其中initial-dpr会把dpr强制设置为给定的值。如果手动设置了dpr之后,不管设备是多少的dpr,都会强制认为其dpr是你设置的值。在此不建议手动强制设置dpr。
6.使用方法
1) 引入cdn的库或者下载
1 | <script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.4/??flexible_css.js,flexible.js"></script> |
2)实质是通过JS动态改写meta标签
- 动态改写
<meta>标签 - 给
<html>元素添加data-dpr属性,并且动态改写data-dpr的值 - 给
<html>元素添加font-size属性,并且动态改写font-size的值
3) 如何把设计稿的px转换为rem(使用css处理器)
使用SCSS函数:
1 | @function fn-pxtorem($px){ |
7.实践出真知,来吧
1 |
|
1)安卓设备:动态添加了meta标签,初始缩放比为1,根元素添加data-dpr为1,font-size:36px,

2)2倍屏:动态添加meta,设置缩放比为0.5,设置根元素的data-dpr=2,font-size:75px;

3)3倍屏幕:动态添加meta,设置缩放比为0.333(很多个3),设置根元素的data-dpr=3,font-size:112.5px;

这里有个问题,如果我在头部加了这句
1 | <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
那么,就不会动态的添加meta,并且提示

8.具体实现(不要说, 来看源码吧)
1 | (function(win, lib) { |
######