一、视口配置与基础设置
-
Meta 标签设置
通过<meta name="viewport">
控制布局视口与设备宽度一致,禁止用户缩放,避免页面显示异常
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">:ml-citation{ref="3,6" data="citationList"}
<meta name="apple-mobile-web-app-capable" content="yes">:ml-citation{ref="6" data="citationList"}
作用
width=device-width
:页面宽度=设备逻辑像素宽度initial-scale=1.0
:初始缩放比例为1:1- 消除不同设备默认缩放导致的布局错乱8
二、动态REM布局
REM 是常用的自适应布局单位,在网页端开发中解决不同场景下的布局适配问题。
1 REM 解释 & 使用场景
定义
- REM:相对根元素(
<html>
)的字体大小。
1rem = 根元素的 font-size
。rem的原理将物理像素px分为一百份,每一份就是1rem,例如当你的手机是苹果6s,物理像素是375px,那么转化成rem就是37.5px。插件设置html根标签的字体属性font-size变为1rem,通过转换将css中的px转换成对应的rem。当屏幕发生大小缩放的时候,更改html下的font-size的大小,就能实现了其他标签的大小距离也随比例缩放,达到rem自适应布局。 - ⽐如,根元素(html)设置font-size=12px; ⾮根元素设置width:2rem; 则换成px表 示就是24px
2 REM的核心优势
- 全局统一控制尺寸:
- 通过调整根元素的
font-size
,可以集中管理整个页面的布局。
- 通过调整根元素的
- 响应式布局:
- 适配不同屏幕尺寸,只需动态修改根元素
font-size
。
- 适配不同屏幕尺寸,只需动态修改根元素
- 避免
em
的嵌套层级问题:em
单位会继承父元素的字体大小,而REM直接基于根字体。
3 适用场景
- 网页端跨设备自适应:
- 通过调整根元素的
font-size
,适配不同屏幕尺寸。
- 通过调整根元素的
4 步骤
1:定义设计稿基准
- 假设设计稿宽度:通常为
750px
(iPhone 6/7 设计稿标准)。 - 根元素基准计算公式:
// 默认根元素字体 = (视口宽度) / (设计稿宽度) * 基准比例(如100)
// 例如设计稿750px时,基准比例设为100:
html { font-size: 100px; }
步骤2:监听窗口大小,动态计算根字体大小
通过 JavaScript 动态计算并设置 html
的 font-size
:
(function () {
// 核心变量定义
var doc = document,
docEl = doc.documentElement,
dpr = window.devicePixelRatio || 1;
// 设计稿基准(例如:750px)
const designWidth = 750;
// 适配函数
var setRem = function () {
var width = docEl.getBoundingClientRect().width;
docEl.style.fontSize = (width / designWidth) * 100 + 'px'; // 假设设计稿750px时 1rem = 界面100%宽度由7.5rem 控制
};
// 执行初始化
setRem();
// 监听屏幕旋转
window.addEventListener('resize', function () {
setRem();
}, false);
})();
步骤3:CSS布局使用REM
C. 示例样式文件
步骤4:防抖优化
// 防抖函数
function debounce(func, wait = 200) {
let timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(func, wait);
};
}
// 适配函数
window.addEventListener('resize', debounce(setRem));
D. 添加防抖机制
// 防抖函数
function debounce(func, wait = 200) {
let timeout;
return function () {
clearTimeout(timeout);
timeout = setTimeout(func, wait);
};
}
// 适配函数
window.addEventListener('resize', debounce(setRem));
注意事项
- 设计稿宽度匹配:REM计算基于指定的设计稿宽度。
- 兼容方案:低版本浏览器需设置 fallback 的 font-size。
- 跨屏兼容处理:旋转屏幕时需重新计算REM值。
- PostCSS自动化:使用插件
postcss-px2rem
自动转换设计稿px为REM。 - 失效保护:设置基础字体,如:
html { font-size: 16px; }
三、响应式布局实现
-
媒体查询(Media Queries)
根据屏幕尺寸或像素密度(如 2x、3x)调整样式:
/* 三栏自适应布局(移动端优先) */
.container {
display: flex;
flex-wrap: wrap;
}
/* 断点:平板(≥768px) */
@media (min-width: 768px) {
.item {
width: 50%;
}
}
/* 断点:PC(≥1200px) */
@media (min-width: 1200px) {
.item {
width: 33.33%;
}
}
断点划分
- 移动端(<768px)、平板(768-1199px)、PC(≥1200px)
四. VW,VH,vmin、vmax 布局
- vw(视口宽度比例):
1vw = 1%视口宽度
- vh(视口高度比例):
1vh = 1%视口高度
vw、vh 与 % 百分比的区别
(1)% 是相对于父元素的大小设定的比率,vw、vh 是视窗大小决定的。
(2)vw、vh 优势在于能够直接获取高度,而用 % 在没有设置 body 高度的情况下,是无法正确获得可视区域的高度的,所以这是挺不错的优势。
vmin、vmax 用处
做移动页面开发时,如果使用 vw、wh 设置字体大小(比如 5vw),在竖屏和横屏状态下显示的字体大小是不一样的。
由于 vmin 和 vmax 是当前较小的 vw 和 vh 和当前较大的 vw 和 vh。这里就可以用到 vmin 和 vmax。使得文字大小在横竖屏下保持一致。
视口单位中的“视口”,桌面端指的是浏览器的可视区域;移动端指的是Viewport中的Layout Viewport,视区所指为浏览器内部的可视区域大小,即 window.innerWidth/window.innerHeight大小,不包含任务栏标题栏及底部工具栏的浏览器区域大小。
优点:无需JavaScript动态计算。
步骤1:利用vw/vh布局
/* 满屏元素 */
.full-width {
width: 100vw;
height: 100vh;
}
/* 固定比例 */
.box {
width: 80vw; /* 视口宽度的80% */
max-width: 640px; /* 响应式限制 */
margin: 0 auto;
}
vw+rem实现移动端自适应布局
核心原理是通过vw单位动态设置根元素font-size,再结合rem相对单位实现元素尺寸的弹性适配
步骤1 计算根元素字体大小
假设设计稿宽度为750px
,基准字体大小设为100px
(便于换算:1rem = 100px
)
html {
font-size: calc(100vw / 7.5); /* 100vw为设备宽度,750px设计稿对应7.5份 */
}
步骤2 计算根元素字体大小
假设设计稿宽度为750px
,基准字体大小设为100px
(便于换算:1rem = 100px
):
html {
font-size: calc(100vw / 7.5); /* 100vw为设备宽度,750px设计稿对应7.5份 */
}
calc() 函数用于动态计算长度值。
- 需要注意的是,运算符前后都需要保留一个空格,例如:
width: calc(100% - 10px)
; - 任何长度值都可以使用calc()函数进行计算;
- calc()函数支持 "+", "-", "*", "/" 运算;
- calc()函数使用标准的数学运算优先级规则;
步骤3 将设计稿尺寸转换为rem
若设计稿中某元素宽度为200px
,则代码中写为:
.element {
width: 2rem; /* 200px/100=2rem */
}
适配原理
-
vw单位的动态性
vw
是视口宽度百分比单位,1vw = 1%视口宽度
。通过将根字体大小与vw
绑定,根字体可随设备宽度等比变化。 -
rem的相对性
rem
基于根元素字体大小计算。当根字体随视口变化时,所有使用rem
的元素尺寸也会等比缩放,实现布局自适应。 -
视口与设计稿的比例关系
通过将视口宽度划分为7.5
份,每份对应设计稿中的100px
,实现屏幕宽度与设计稿尺寸的等比映射。 -
单位换算规则
-
设计稿元素宽度200px → 代码中写为2rem(
200/100=2
) -
实际渲染尺寸 =
2rem × (当前设备宽度/7.5)
例如在375px
设备上:2rem×50px=100px
(即设计稿尺寸的1/2,适配二倍屏)
-
优化与注意事项
限制根字体范围
使用媒体查询防止极端屏幕下字体过小或过大
兼容性
vw
在现代浏览器中兼容性良好(iOS 8+、Android 4.4+),旧设备可回退到JavaScript动态计算rem
的方案78。
@media (max-width: 320px) {
html { font-size: 85px; } /* 最小字体 */
}
@media (min-width: 640px) {
html { font-size: 170px; } /* 最大字体 */
}