flexible.js 移动端自适应方案总结

一、方案概述

flexible.js 是阿里巴巴手淘团队开发的移动端自适应 JavaScript 框架,核心是通过动态调整 HTML 根节点的 font-size,结合 rem 单位替代传统 px,实现不同屏幕尺寸下的样式适配,适用于多终端设备的页面适配需求。

核心原理

  1. 根据设备屏幕宽度,动态为 HTML 根节点设置不同的 font-size
  2. 开发时将 CSS 中的所有 px 单位替换为 rem 单位(rem 基于根节点 font-size 计算)
  3. 框架将设备屏幕宽度划分为 10 等份,根节点 font-size 为屏幕宽度的 1/10,确保不同屏幕尺寸下样式比例一致

二、使用方式

1. 直接引入(非构建项目)

在 HTML 的 <head> 标签中引入框架文件,无需额外安装依赖:

\<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.2/??flexible\_css.js,flexible.js">\</script>

2. 单页面应用(webpack 等构建工具)

步骤 1:安装依赖

通过 npm 安装官方包:

npm i -S amfe-flexible

步骤 2:配置与引入

\<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
import 'amfe-flexible';

三、实战案例

1. HTML 结构

\<!DOCTYPE html>

\<html lang="en">

\<head>

&#x20; \<meta charset="UTF-8">

&#x20; \<meta http-equiv="X-UA-Compatible" content="IE=edge">

&#x20; \<!-- viewport 配置 -->

&#x20; \<meta name="viewport" content="width=device-width, initial-scale=1.0">

&#x20; \<title>flexible 适配示例\</title>

&#x20; \<!-- 引入 flexible 框架 -->

&#x20; \<script src="http://g.tbcdn.cn/mtb/lib-flexible/0.3.2/??flexible\_css.js,flexible.js">\</script>

&#x20; \<!-- 引入自定义 CSS -->

&#x20; \<link href="style.css" type="text/css" rel="stylesheet" />

\</head>

\<body>

&#x20; \<div class="header">Flexible一览\</div>

\</body>

\</html>

2. CSS 样式(rem 适配)

.header {

&#x20; /\* 设计稿中若为 48px,按 750px 设计稿计算(48/75 = 0.64rem,示例中按实际适配后值编写) \*/

&#x20; font-size: .48rem;&#x20;

&#x20; line-height: 1.1733rem;&#x20;

&#x20; color: #fff;

&#x20; text-align: center;

&#x20; background: #2475fd;

}

3. CSS 中 px 转 rem 工具配置(VS Code)

推荐安装 cssrem 插件,自动实现 pxrem 的转换,配置步骤如下:

  1. 打开 VS Code 插件设置,找到 cssrem 相关配置
  2. 核心配置项调整:
  1. 配置后,编写 CSS 时输入 px 值会自动提示对应的 rem 值(如 22px 自动转换为 0.2933rem)

四、源码核心逻辑解析

1. 核心变量初始化

;(function(win, lib) {

&#x20; var doc = win.document;

&#x20; var docEl = doc.documentElement; // HTML 根节点

&#x20; var metaEl = doc.querySelector('meta\[name="viewport"]'); // viewport 元标签

&#x20; var flexibleEl = doc.querySelector('meta\[name="flexible"]'); // flexible 自定义元标签

&#x20; var dpr = 0; // 设备像素比

&#x20; var scale = 0; // 屏幕缩放比例

&#x20; var tid; // 定时器 ID

&#x20; var flexible = lib.flexible || (lib.flexible = {});

&#x20; // ... 后续逻辑

})(window, window\['lib'] || (window\['lib'] = {}));

2. 设备像素比(dpr)与缩放比例(scale)计算

3. viewport 元标签动态生成

若无手动配置 viewport,框架自动创建并添加:

metaEl = doc.createElement('meta');

metaEl.setAttribute('name', 'viewport');

metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

docEl.firstElementChild.appendChild(metaEl); // 插入到 HTML 根节点第一个子元素前

4. rem 基准值(根节点 font-size)动态计算

通过 refreshRem 函数实时更新根节点 font-size

function refreshRem() {

&#x20; var width = docEl.getBoundingClientRect().width; // 获取屏幕可视宽度

&#x20; if (width / dpr > 540) { // 最大宽度限制(超过 540px 按 540px 计算)

&#x20;   width = 540 \* dpr;

&#x20; }

&#x20; var rem = width / 10; // 屏幕宽度分为 10 等份,1rem = 屏幕宽度/10

&#x20; docEl.style.fontSize = rem + 'px'; // 设置根节点 font-size

&#x20; flexible.rem = win.rem = rem;

}

5. 事件监听(确保适配实时性)

6. 工具方法

框架提供 rempx 互相转换的工具函数:

五、关键概念补充

1. 设备像素比(dpr)

设备型号设备独立像素(pt)物理像素(px)dpr
iPhone 6375 × 667750 × 13342
iPhone 5320 × 568640 × 11362
Nexus 5X411 × 731411 × 7311

2. 设计稿与 rem 换算规则

六、参考资源

(注:文档部分内容可能由 AI 生成)
本文著作权归作者 [ zealoner ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。

发表留言