Skip to main content

响应式布局

Web、H5、WebApp

  • 移动 Web 开发,代码是在手机、平板等浏览器中运行
  • Pc Web 开发,代码是在 PC 端(电脑)浏览器中运行

移动 Web 和 Pc Web 的区别:

  • 屏幕尺寸不同
  • 网络环境和设备性能不同
  • 交互方式不同
  • 兼容性不同

App 开发分类:

  • Native 开发,如 Android 开发、IOS 开发
  • Web App,应用程序在浏览器中运行
  • Hybrid 混合模式,是 Native APP 和 Web APP 的混合体,同时具有两者的特点

H5 在非技术圈常指移动 Web 页面,一般是用于活动营销的手机网页

像素、分辨率、物理像素、逻辑像素、设备像素比

设备像素指的是物理像素,一般手机的分辨率指的就是设备像素,一个设备的设备像素是不可变的。

css 像素和设备独立像素是等价的,不管在何种分辨率的设备上,css 像素的大小应该是一致的,css 像素是一个相对单位,它是相 对于设备像素的,一个 css 像素的大小取决于页面缩放程度和 dpr 的大小。

dpr 指的是设备像素和设备独立像素的比值,一般的 pc 屏幕,dpr=1。在 iphone4 时,苹果推出了 retina 屏幕,它的 dpr 为 2。屏幕的缩放会改变 dpr 的值。

ppi 指的是每英寸的物理像素的密度,ppi 越大,屏幕的分辨率越大。

viewport 视口

移动端:

  • 大部分手机浏览器的宽为 980px
  • 手机端网页中 html 的默认宽等于浏览器宽为 980px
  • 将 body 的 margin 设为 0 后,body 的宽度等于 980px

运行下方代码,打开控制台调到手机模式,

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0" /> -->
<style>
body {
margin: 0;
}
</style>
</head>
<body></body>
</html>

移动端的三个 viewport 的概念

  1. 布局视口

移动端浏览器提供了一个 layout viewport 布局视口的概念,使用这个视口来对页面进行布局展示,一般 layout viewport 的大小为 980px,因此页面布局不会有太大的变化,我们可以通过拖动和缩放来查看到这个页面。

  1. 视觉视口

visual viewport 指的是移动设备上我们可见的区域的视口大小,一般为屏幕的分辨率的大小。visual viewport 和 layout viewport 的关系,就像是我们通过窗户看外面的风景,视觉视口就是窗户,而外面的风景就是布局视口中的网页内容。

  1. 理想视口

由于 layout viewport 一般比 visual viewport 要大,所以想要看到整个页面必须通过拖动和缩放才能实现。所以又提出了 ideal viewport 的概念,ideal viewport 下用户不用缩放和滚动条就能够查看到整个页面,并且页面在不同分辨率下显示的内容大小相同。ideal viewport 其实就是通过修改 layout viewport 的大小,让它等于设备的宽度,这个宽度可以理解为是设备独立像素,因此根据 ideal viewport 设计的页面,在不同分辨率的屏幕下,显示应该相同。

https://juejin.cn/post/6844903655045333000

em、rem、px、vw、vh 的区别

像素单位

1、px

  • 绝对单位
  • 指定像素值,固定布局尺寸

2、rem

  • 相对根元素(html)的 font-size 值的大小
  • 1rem 等于根元素的字体大小
  • 不受自身和父级元素的字体大小的影响
  • 为了计算方便,可以设置html { font-size: 62.5% },因为16 * 0.625 = 10,这样 1rem=10px

3、em

  • 相对单位,基于父元素字体大小
  • 如果元素自身设置了字体大小,如font-size: 20px,则基于元素自身的字体大小

4、vw

  • 视窗宽度单位
  • 1vw 等于视窗宽度的 1%

5、vh

  • 视窗高度单位
  • 1vh 等于视窗高度的 1%

6、vmax 和 vmin

  • 视窗宽度和视窗高度的最大值或最小值,哪个最大或最小就取哪个值,可以考虑用在兼容横屏和竖屏的布局

7、百分比%,相对于父元素

媒体查询

设置断点,响应不同的屏幕尺寸

  • PC 端优先:先考虑大屏,再考虑小屏;使用 max-width
  • 移动端优先:先考虑最小屏,再考虑大屏;使用 min-width

媒体类型:

  • all 所有设备,默认值
  • screen 屏幕设备
  • pint 打印设备
  • speech 屏幕阅读器
@media screen and (max-width: 1600px) {
}
@media screen and (max-width: 1536px) {
}
@media screen and (max-width: 1440px) {
}
@media screen and (max-width: 1366px) {
}
@media screen and (max-width: 1280px) {
}
@media screen and (max-width: 1200px) {
}

window.matchMedia()

判定是否匹配媒体查询

const mediaQueryString = '(max-width: 600px)';
let media = window.matchMedia(mediaQueryString);

const listener = () => console.log(media.matches);
window.addEventListener('resize', listener);
window.removeEventListener('resize', listener);

屏幕分辨率

尺寸比例说明
3840 x 21604k
2560 x 14402k
1920 x 108016:9✅ 主流
1920 x 120016:10常见 20 寸电脑使用
1680 x 105016:10常见 15.4、20 寸电脑使用
1600 x 12004:3常见 15、16.1 寸电脑使用
1600 x 102414:9不常见
1600 x 90016:9非主流
1536 x 86416:9
1440 x 10504:3常见 15、16.1 寸电脑使用
1440 x 90016:10苹果 17 寸电脑使用
1366 x 76815:10✅ 主流,常见 15.2 寸电脑使用
1280 x 10245:4常见 14.1、15 寸电脑使用
1280 x 85416:9不常见
1280 x 80016:10常见 10.8、12.1、15.4 寸电脑使用
1200 x 70012:7
1024 x 7684:3常见 10.4、12.1、14.1、15 寸电脑使用
1024 x 600常见 8.9 寸电脑使用

移动端常见断点:

尺寸说明
xs<576px超小屏
sm576~768px小屏
md768px~992px中屏
lg992px~1200px大屏
xl≥1200px超大屏

布局方案

响应式布局,媒体查询、相对单位(如百分比、vw/vh、rem 等)

自适应布局,例如左右两边宽度固定,中间宽度自适应

弹性布局,使用相对单位,结合 flex 或 grid 布局

移动端适配方案

rem + 弹性布局

设置根元素 html 的 font-size,根据屏幕宽度动态计算 rem 值。

html {
/* 或者 62.5% */
font-size: 10px;
}

自动设置 html 元素的字体大小:

function setRootFontSize() {
const baseFontSize = 16;
const designWidth = 1920;
const screenWidth = window.innerWidth;
const newSize = (screenWidth / designWidth) * baseFontSize;
document.documentElement.style.fontSize = newSize + 'px';
}
window.addEventListener('load', setRootFontSize);
window.addEventListener('resize', setRootFontSize);

编写代码时依然使用 px。接下来将其他元素的 px 转为 rem。

自动转换的方式:

例如,使用 PostCSS 插件自动将 px 转为 rem:

  1. 安装 postcss-pxtorem
npm install postcss-pxtorem -D
  1. 配置 postcss.config.js
// postcss.config.cjs
module.exports = {
plugins: {
'postcss-pxtorem': {
rootValue: 16, // 基准值,对应于根元素的 font-size
unitPrecision: 5, // 保留小数点位数
propList: ['*', '!min-width', '!max-width'], // 排除 min-width 和 max-width 属性
selectorBlackList: [], // 忽略的选择器
replace: true, // 替换而不是添加备用属性
mediaQuery: false, // 允许在媒体查询中转换 px
minPixelValue: 0 // 最小的转换数值
}
}
};

// 在vite中使用
export default defineConfig({
css: {
postcss: './postcss.config.cjs'
}
});