CSS 移动端适配
流式布局(百分比布局)
- 父盒子
- 设置宽度 100%
- 设置
max-width与min-width - 使用
margin: 0 auto将其居中
- 子盒子
- 使用浮动使其在同一行显示
- 将宽度设置为百分比,根据屏幕的宽度来进行伸缩
- 高度固定
Flex 弹性布局
- 父盒子
- 使用
display: flex - 通过
justify-content与align-items来指定子盒子位置
- 使用
- 子盒子
- 使用
flex-growflex-shrinkflex-basis来控制子盒子宽度的占比及缩放 - 高度固定
- 使用
Rem 布局
Rem 布局思路
- Rem 单位相对于根标签的字体大小,默认情况下
1rem = 16px - 页面布局时,使用
rem作为单位 - 通过设置与动态修改根标签的
font-size来实现页面在不同宽度下的适配- 以下基准值的设置便于口算 rem 值
font-size = 375 / 设计稿宽度 * 100px- 当设计稿为 375px 时,可将
font-size设置为100px - 当设计稿为 750px 时,可将
font-size设置为50px - 使用时,将设计稿的
px除以 100 后,直接转换为rem即可 - 例如,设计稿上盒子的宽度为
50px,转换后为0.5rem
媒体查询
需要为每一个机型的宽度指定属于自己的 font-size ,其值为 设备宽度 / 375 * 基准值
css
html {
font-size: 100px;
}
/* iPhone 5 */
@media screen and (min-width: 320px) {
html {
font-size: 85.33px;
}
}
/* iPhone 6 */
@media screen and (min-width: 375px) {
html {
font-size: 100px;
}
}
/* iPhone 6 Plus */
@media screen and (min-width: 414px) {
html {
font-size: 110.4px;
}
}JavaScript
使用媒体查询修改根元素 font-size 的大小较为复杂,使用 JavaScript 进行动态修改更加的便捷
js
// 获取页面的宽度
var width = document.documentElement.clientWidth || document.body.clientWidth;
// 计算页面实际宽度与 375px 的比例
var ratio = width / 375;
// 将根元素的 font-size 按比例进行缩放
document.getElementsByTagName('html')[0].style.fontSize = ratio * 100 + 'px';flexible.js
以上方法均为口算 + 手动适配,使用 flexible.js 可以自动根据页面宽度改变基准值
基准值为设计稿的1/10
直接将设计稿中的px 数值除以基准值即可得到 rem 值
10rem 为占满屏幕,类似下面的 vw 布局中的 100vw
Viewport 布局
- 以设计稿 375px 为例
- 其中
1vw = 3.75px,例如,设计稿上盒子的宽度为50px,需将宽度设置为(50 / 3.75) vw即13.33vw - 在不同页面宽度下,其宽度会自适应屏幕的宽度
- 需要使用大量的除法运算,一般配合
LESSSCSS等预处理器使用
PostCSS
使用 Rem 与 Viewport 布局时,需要大量的单位换算,十分不便。通过 PostCSS 插件,可以实现在开发过程中,全部使用 px 单位,插件会自动将 px 单位转化为 rem 或 vw/vh 单位
Rem 布局适配
如果需要使用 rem 单位进行适配,推荐使用以下两个工具:
- postcss-pxtorem 是一款 PostCSS 插件,用于将 px 单位转化为 rem 单位
- lib-flexible 用于设置 rem 基准值
原理:
- lib-flexible 会自动将 rem 基准值设置为屏幕的1/10
- postcss-pxtorem 会自动将
px / rootValue得到转换后的 rem 值
示例配置1 (设计稿为 375px)
js
// postcss.config.js
module.exports = {
plugins: {
'postcss-pxtorem': {
// rootValue 设置为 设计稿宽度/10
rootValue: 37.5,
propList: ['*'],
},
},
};示例配置2 (使用 vant 组件库,设计稿为 750px)
原理:
- 根元素的 font-size 为 37.5px
- 若一个盒子的宽度在设计稿里为 375px 本来占屏幕的一半,除以 37.5 转换后为
10rem(即375px),会占满屏幕 - 通过以下设置后,375px 除以 75 转换后为
5rem(即187.5px),仍占屏幕的一半,与设计稿保持一致
js
module.exports = {
plugins: {
'postcss-pxtorem': {
rootValue({ file }) {
return file.indexOf('vant') !== -1 ? 37.5 : 75;
},
propList: ['*'],
},
},
};Viewport 布局适配
推荐使用 postcss-px-to-viewport 进行转换
示例配置
js
// postcss.config.js
module.exports = {
plugins: {
'postcss-px-to-viewport': {
viewportWidth: 375,
},
},
};






