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) { |
######