flexible.js是淘宝移动端自适应布局的解决方案之一。它主要实现的功能是:根据不同的屏幕宽度动态设置标签的字体大小,从而实现移动端页面的自适应布局。
手淘flexible.js框架使用和源代码讲解小结
什么是flexible.js
flexible.js是淘宝移动端自适应布局的解决方案之一。它主要实现的功能是:根据不同的屏幕宽度动态设置标签的字体大小,从而实现移动端页面的自适应布局。
使用方法
使用flexible.js,只需要在页面头部引入flexible.js即可。
<script src="https://g.alicdn.com/fdilab/lib-flexible/0.3.2/flexible.js"></script>
原理
flexible.js会根据屏幕宽度动态计算标签的font-size值,用于设置其他元素的大小。计算公式如下:
document.documentElement.style.fontSize = (window.innerWidth / 设计稿宽度) * 基准字体大小
其中,设计稿宽度是指你所设计的网页的屏幕宽度,基准字体大小是你所设定的字体大小。默认的设计稿宽度为750px,基准字体大小为50px。
例如,如果你设计的网页宽度为375px,基准字体大小为50px,则计算出来的标签的font-size为25px。
源代码讲解
flexible.js源代码主要分为两个部分:mediaQuery部分和flexible部分。
mediaQuery部分
mediaQuery部分主要定义了一些媒体查询,用于不同屏幕宽度下标签的font-size值。代码如下:
docEl.style.fontSize = (win.width / 750) * 50 + 'px';
其中,docEl是标签,win是window对象,750是默认的设计稿宽度,50是默认的基准字体大小。根据屏幕宽度的不同,这个值会自动调整。
dpi = 1 / devicePixelRatio;
scale = 1 / dpi;
metaEl = doc.createElement('meta');
metaEl.setAttribute('name', 'viewport');
metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
这段代码主要是用于设置视口的缩放比例,禁用用户手动缩放。
flexible部分
flexible部分主要包含了一些方法和事件,用于初始化页面和响应不同屏幕宽度下标签的font-size值。
function refreshRem(){
var width = docEl.getBoundingClientRect().width;
if (width / dpr > 540) {
width = 540 * dpr;
}
var rem = width / 10;
docEl.style.fontSize = rem + 'px';
flexible.rem = win.rem = rem;
}
这段代码主要是用于计算和设置标签的font-size值。其中,dpr是设备像素比,一般是1或2,rem是设置的字体大小。
win.addEventListener('resize', function() {
clearTimeout(tid);
tid = setTimeout(refreshRem, 300);
}, false);
这段代码主要是用于响应窗口大小变化事件,并重新计算标签的font-size值。
示例说明
示例1
在页面头部引入flexible.js之后,可以通过设置其他元素的大小来实现移动端页面的自适应布局。例如:
<style>
.box {
width: 6.4rem;
height: 3.6rem;
background-color: red;
}
</style>
<div class="box"></div>
这段代码定义了一个背景为红色的
示例2
如果设计的网页宽度不是750px,需要在调用flexible.js之前手动设置设计稿宽度。例如,如果设计的网页宽度为640px,可以通过以下代码实现:
window.flexible = {
'designWidth': 640
};
这段代码会在window对象上添加一个flexible对象,并设置designWidth属性为640。此时,根据屏幕宽度的不同,标签的font-size值将会自动计算。
本文标题为:手淘flexible.js框架使用和源代码讲解小结
- IE7、IE8、ff下的margin-top问题 折叠margin 2024-01-04
- Handtrack.js库实现实时监测手部运动(推荐) 2024-01-15
- 史上最强vue总结来了,这原因我服了 2023-10-08
- Nuxt.js中让vuex数据持久化,实测管用 2023-10-08
- 解决ajax的delete、put方法接收不到参数的问题方法 2023-02-23
- 用jquery写的菜单从左往右滑动出现 2024-01-03
- JavaScript中的构造函数和实例对象之间的关系(构造器) 2023-07-10
- 微信小程序自定义用户登录弹窗 2023-12-25
- 如何手写Ajax实现异步刷新 2023-02-14
- vue3.0 router路由跳转传参问题(router.push) 2024-01-14