Mobile Adaptation & Responsive Web Design
基本概念
_Device Pixels_(设备像素)
屏幕上显示的任何画面,都是由一个个能够产生不同颜色的点构成,这些点叫做像素(Pixel)
我们将屏幕上的物理像素称为 “设备像素”,即设备屏幕上的实际像素点,数量固定
与设备物理像素相关的另一个概念是 _Pixels Per Inch_(每英寸像素数, PPI),它代表屏幕对角线的物理像素个数除以对角线英寸数,用于表示屏幕密度
_CSS Pixels_(CSS 像素)
CSS 像素是网页设计中常用的长度单位( px ),用于定义元素的尺寸、边距、字体大小等。 它是一种抽象的逻辑像素单位,数量可以根据设备的 DPR 进行缩放,因此数量与设备物理像素不一一对应
_Device Pixel Ratio_(设备像素比)
DPR 指的是设备物理像素数和 CSS 像素数的比例( DPR = 物理像素数 / CSS 像素数
)。在屏幕密度( PPI )高的设备上,为了保持元素的可读性和可点击性,浏览器会将多个物理像素映射为一个 CSS 像素。 这使得网页在不同设备上看起来大小一致
设备像素比( DPR )可以通过 window.devicePixelRatio
API 来获取
_viewport_(视口)
在桌面端,视口通常指代浏览器的窗口,但不包括浏览器的 UI,菜单栏等
视口通常被细分为布局视口、视觉视口和理想视口
布局视口(Layout Viewport)
在没有手动设置布局视口的宽度下,移动端浏览器通常会默认设置一个较大的布局视口宽度,通常为 980px。这样做的目的是为了确保 PC 端的页面能够在移动端浏览器中完整显示,所以移动端浏览器在网页刚打开时会“缩放”,让整个页面塞进屏幕中
布局视口的宽度 ≈ document.documentElement.clinetWidth
布局视口的高度 ≈ document.documentElement.clinetHeight
其中 CSS 中 vw/vh
单位就是相对于布局视口
视觉视口(Visual Viewport)
视觉视口是用户真实可见的区域,当用户用手势放大网页时,视觉视口变小(显示的是局部放大),因此视觉视口的尺寸会随着用户手势放大/缩小实时变化,但布局视口大小不会发生变化
视觉视口的尺寸可以通过 window.visualViewport
API 来获取,它会返回一个对象,其中包含了视觉视口的宽高、缩放比等参数。详细参考:https://developer.mozilla.org/zh-CN/docs/Web/API/VisualViewport
理想视口(Ideal Viewport)
移动端浏览器推荐的适配宽度(用来达到最佳显示效果),通常为设备的逻辑像素( CSS 像素 )宽度
一般我们用 meta viewport
来设置它
1 | <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no"> |
设置后,布局视口 = 视觉视口 ≈ 设备的逻辑像素( CSS 像素 )宽度
width
用来设置布局视口的宽度,device-width
代表使用设备的逻辑像素宽度作为布局视口宽度,也可以指定一个具体的数值( 单位 CSS 像素 )作为布局视口的宽度
initial-scale
用来设置初始缩放比,它会改变视觉视口的大小,1 代表网页刚打开时不缩放,取值范围 0.0-10.0
user-scalable
用来设置是否允许用户手势放大或缩小网页,值为 no
则不允许,值为 yes
则允许
移动设备与传统 PC 的差异
移动设备和传统 PC 在屏幕尺寸、交互方式方面存在根本差异,用户界面需要适应用户的设备以提供良好的用户体验
- 屏幕尺寸
- 移动设备通常在 3~7 英寸( 手机 )
- 传统 PC 通常在 13~32 英寸
- 屏幕密度
- 移动设备屏幕密度( PPI )高,DPR 通常 ≥2
- 传统 PC 屏幕密度略低,DPR 一般为 1
- 视口宽度
- 移动设备常见为 360~430px
- 传统 PC 通常为 1024px 以上
- 交互方式
- 移动设备为手指触摸操作
- 传统 PC 主要以鼠标和键盘操作
rem 移动端自适应布局
rem 是 CSS 中的相对单位
- rem 相对于根元素 html 的
font-size
,如根元素font-size
为 16px,则 2rem 等于 2 倍的 16px
rem 移动端适配方案的原理是通过动态设置 <html>
的 font-size
,让整个页面的 rem
单位和屏幕宽度绑定,从而实现不同屏幕宽度下的等比例缩放布局
- 设置
meta viewport
1 | <!-- |
- 使用 JavaScript 动态设置
html
的font-size
1 | // 获取 html 元素 |
- 写 CSS 时使用
rem
单位
1 | .box { |
可优化项:
- 使用构建工具的
postcss-pxtorem
插件自动将 px 转为 rem - 使用媒体查询控制最大最小宽度,避免过大/过小设备出问题
Tips:
- rem 搭配 meta viewport 实现页面的等比例缩放,它的本质是一种缩放式的静态布局,它可以做到适配不同手机屏幕宽度/分辨率
- 这种布局方式还可以通过 vw 单位实现,vw 是直接相对于视口宽度,因此它不需要额外编写 js 代码
- 对于需要灵活排版的页面,这种布局可能不太适合
响应式网页设计
响应式网页设计(Responsive Web Design,简称 RWD)是一种网页开发技术,旨在使网页在不同设备(如手机、平板、桌面电脑)上都具有良好的显示效果和用户体验。其核心目标是“一次开发,多端适配”
设计原则
- 使用相对单位(如
%
、em
、rem
)替代固定单位(如px
),使网页元素根据屏幕宽度自动伸缩 - 通过 CSS 的
@media
规则,根据不同设备的特性(屏幕宽度、方向等)应用不同样式
1 | /* 例子 */ |
- 使用 CSS Grid / Flex,实现 页面元素的弹性拉伸 或 多列排布自动换行…
- 移动端要在
<head>
中设置meta viewport
,使移动设备正确渲染网页
1 | <meta name="viewport" content="width=device-width, initial-scale=1"> |
媒体查询(Media Queries)
CSS 媒体查询允许开发者根据设备的特性(如屏幕宽度、分辨率、方向等)来应用不同的 CSS 样式。它是实现响应式网页设计的核心工具之一
基本语法:
1 | @media 条件 { |
媒体特性( 常用 ):
max-width
:最大宽度,适用于屏幕宽度小于等于某个值的情况min-width
:最小宽度,适用于屏幕宽度大于等于某个值的情况max-height
:最大高度,适用于屏幕高度小于等于某个值的情况min-height
:最小高度,适用于屏幕高度大于等于某个值的情况orientation
:设备的方向,可以是portrait
(竖屏)或landscape
(横屏)
1 | /* 屏幕宽度小于等于768px时,应用此样式 */ |
媒体类型:
all
:适用于所有媒体类型print
:用于打印设备screen
:用于计算机屏幕(如 平板电脑和智能手机等)speech
: 用于大声“朗读”页面的屏幕阅读器
1 | /* 屏幕宽度小于等于480px, 同时为计算机屏幕设备时应用此样式 */ |
断点(Break Point)
断点是控制何时可以在特定的屏幕或设备大小下更改布局
常见断点:
设备类型 | 宽度范围 |
---|---|
手机(小屏) | 0 - 576px |
平板电脑 | 577px - 768px |
小型桌面,如笔记本电脑 | 769px - 992px |
中大型桌面,如台式机 | 993px - 1200px |
超大屏幕,如电视 | 1201px 以上 |