【前端】响应式布局设计
Dandelion 8/19/2022 UI
# 概述
响应式设计与自适应设计的区别:
响应式开发一套界面,通过检测视口分辨率,针对不同客户端在客户端做代码处理,来展现不同的布局和内容;
自适应需要开发多套界面,通过检测视口分辨率,来判断当前访问的设备是 pc 端、平板还是手机,从而请求服务层,返回不同的页面。
- 布局单位
- 像素 px:表示计算机屏幕所能显示的最小区域
- 百分比:height/width,top/bottom/left/right,padding/margin,border-radius/translate/background-size
- em/rem:em 是相对于父元素的 font-size,rem 则是相对于 html 根元素的 font-size
- vw/vh:相对于视图窗口的宽度与高度(视窗为 100 vw/vh)
- 布局方式
- 流体布局:使用百分比来控制元素大小,进而控制 Web 页面布局
- 自适应布局:借助 JavaScript 判断视窗大小,在不同的视窗下引用不同的 CSS 文件
- 响应式布局:通过 CSS 媒体查询,不同条件下应用不同的样式规则
- 注:对于内容较少、主要用于信息展示的网站,大多采用响应式布局;对于内容较多、管理类网站,通常采用自适应布局
- 基本概念
- 像素:pixel,数字领域特有名词,是成像设备的最小单元
- 分辨率:给定的距离(或面积)内点或像素的数量,包括显示分辨率、图像分辨率、打印分辨率和扫描分辨率等
- 描述分辨率的单位:DPI(点每英寸),PPI(像素每英寸),px/cm(像素每厘米),LPI(线每英寸)等
- DPI:dots per inch,表示每英寸(对角线长度)能打印上的墨滴数量,最初应用于打印技术上
- PPI:pixels per inch,显示器每英寸(对角线长度)上像素点的数量,表示像素密度
- 屏幕的物理尺寸:通常用可视画面对角线长度表示,且一般以英寸为单位
- 物理像素尺寸:如 2224 x 1668,指长边上和短边上最多能显示的物理像素点个数
- 屏幕分辨率 = 对角线上的像素数 / 对角线长度
- 注:物理像素点是每个设备生产的时候就定好了的,是无法改变的,是设备能控制显示的最小物理单位,和屏幕物理尺寸大小有关
- 设备独立像素:可以认为是计算机坐标系统中的一个点,这个点代表一个可以由程序使用的虚拟像素(如 CSS 像素)
- 设备像素比(dpr)= 物理像素(pp)/ 设备独立像素(dp)
- 例如,对于 dpr 为 2 的设备,为了达到高清的效果,视觉稿的画布大小会使基准的 2 倍。
- 理论上,1 个位图像素对应于 1 个物理像素,图片才能得到完美清晰的展示。
# 基础响应式布局方案
- 方案一:媒体查询
- 设置 meta 标签:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
- 使用媒体查询设置样式:
@media screen and (max-width: 1920px) { ... }
- 设置布局分界点,即通过设置多种视图宽度样式来控制页面布局
- 移动端优先,使用 min-width;PC 端优先,使用 max-width(320px - 375px - 414px - 768px - 1024px - 1100px)
- 在适配移动端的时候,需要切换导航栏样式
- 设置 meta 标签:
- 方案二:百分比布局
- 通过将百分比和 max/min 结合使用,来定义元素在不同设备下的宽高
- 缺点:必须要弄清楚 css 中子元素的百分比到底是相对谁的百分比,计算困难
- 方案三:rem 布局
- 根据视图容器的大小,动态的改变 font-size 大小
- 当页面的 size 发生变化时,只需要改变 font-size 的值,那么以 rem 为固定单位的元素的大小也会发生响应的变化
- 布局思想
- 一般不要给元素设置具体的宽度,但是对于一些小图标可以设定具体宽度值
- 高度值可以设置固定值,设计稿有多大,就严格有多大
- 所有设置的固定值都用 rem 做单位
- js 获取真实屏幕的宽度,让其除以设计稿的宽度,算出比例,把之前的基准值按照比例进行重新的设定
- 缺点:必须通过 js 来动态控制根元素 font-size 的大小,也就是说 css 样式和 js 代码有一定的耦合性,且必须将改变 font-size 的代码放在 css 样式之前
- 注:可利用媒体查询,设置在不同设备下的字体大小,默认 html 标签的 font-size 为 16px
- 方案四:视窗布局
- 1vw 表示视口宽度的 1%;vmin 表示 vw 和 vh 中的较小值
- 方法 1:仅使用 vw 作为 CSS 单位
- 对于设计稿的尺寸转换为为单位,使用 Sass 函数编译
- 无论是文本还是布局宽度、间距等都使用 vw 作为单位
- 1 物理像素线采用 transform 属性 scale 实现
- 对于需要保持宽高比的图,应该用 padding-top 实现:
padding-top: percentage(100/700);
- 方法 2:vw 和 rem 搭配使用(若仅用视口布局,便失去最大最小宽度的限制)
- 给根元素大小设置随着视口变化而变化的 vw 单位,这样就可以实现动态改变其大小
- 限制根元素字体大小的最大最小值,配合 body 加上最大宽度和最小宽度
- 其他:图片响应式
- 两个方面
- 大小自适应:图片在不同的屏幕分辨率下将会出现压缩、拉伸的情况
- 分辨率自适应:根据不同的屏幕分辨率和设备像素比来尽可能选择高分辨率的图片
- 使用 max-width(背景图片灵活使用 background-size 属性):
img { display: inline-block; max-width: 100%; height: auto; }
- 使用 srcset:
<img srcset="photo_w350.jpg 1x, photo_w640.jpg 2x" src="photo_w350.jpg" alt="">
- 使用 background-image:通过媒体查询设置不同的背景图片
- 使用 picture 标签
<picture> <source type="image/jpg" srcset="banner_w1000.jpg" media="(min-width: 801px)" /> <source type="image/jpg" srcset="banner_w800.jpg" media="(max-width: 800px)" /> <img src="banner_w800.jpg" alt="" /> </picture>
1
2
3
4
5
6
7
8
9
10
11
12
13
- 两个方面
# 成型响应式布局方案
- 自行实现基础方案:媒体查询 + px;媒体查询 + 百分比;媒体查询 + rem + js;vm/vh;vm/vh + rem
- flex 弹性布局
- 一维布局系统,适合做局部布局,比如导航栏组件。浏览器兼容性比较差,只能兼容到 IE9 及以上。
- 容器属性:display,flex-flow(flex-direction + flex-wrap),justify-content,align-items,align-content(只对多行生效)
- 项目属性:flex(flex-grow 0 + flex-shrink 1 + flex-basis auto),align-self,order
- grid 弹性布局
- 二维布局系统,通常用于整个页面的规划,兼容性较差
- 可以使用行号,名称或通过定位网格区域将项目放置在网格上的精确位置;可以将多个项目放入网格单元格或区域中,它们可以彼此部分重叠
- 容器属性:
- display,grid-template(grid-template-columns + grid-template-rows + grid-template-areas)
- repeat() & auto-fill 关键字 & fr 关键字 & minmax() & auto 关键字 & 网格线的名称
- grid-gap(grid-row-gap + grid-column-gap)
- grid-auto-flow,place-items(justify-item + align-items),place-content(justify-content + align-content)
- grid-auto-columns & grid-auto-rows
- grid(grid-template-rows + grid-template-columns + grid-template-areas + grid-auto-rows + grid-auto-columns + grid-auto-flow)
- 项目属性:
- grid-column(grid-column-start + grid-column-end),grid-row(grid-row-start + grid-row-end),grid-area(使用区域名称或网格线指定项目位置)
- place-self(justify-self + align-self)
- 栅格系统
- Bootstrap 设计原理
- bootstrap@3.x:左浮动 + 百分比 + 媒体查询,采用相对定位进行左右移动栅格排版
- bootstrap@4.x:flex + 百分比,利用 order 属性排版
- 两者都用 margin-left 进行偏移量设置
- Pure 设计原理
- flex + 行内 + 百分比,不支持偏移和指定顺序的排版,最大支持 24 等分
- Foundation 设计原理:与 bootstrap@4.x 类似,都最大支持 12 等分
- 栅格七要素:最小单位、总宽度、列数、大列宽、水槽、列宽、安全边距
- Bootstrap 设计原理
# 响应式布局设计原则
4 个要素:流畅的布局、响应式单元、灵活的图像、媒体查询
9 个基本原则:流体布局;尽可能采用相对单位;断点选择;设置最大值和最小值;嵌套对象应该尽可能简洁;PC/Mobile 优先;网页字体/系统字体;位图和矢量图
- 按内容设置分割点:网页内容应在所有屏幕上以最佳方式呈现
- 明智地选择网页字体和系统字体:考虑加载时间和设计需求
- 优化位图图像和矢量:图标细节多,建议使用位图;矢量图可以很好地放大或缩小图标
- 对网站的首屏显示进行测试
- 不要在小屏幕上隐藏内容
- 使用嵌套对象管理布局
- 桌面优先 or 移动端优先?
一般而言,对于响应式网站,宽度、左右间距和左右内边距的长度采用百分比;像高度、上下间距、字体大小等与垂直方向相关的属性则使用 em 或者 rem 单位。
# 为何推崇移动端优先?
- 由简入繁,前期精力只放到最核心功能模块上,是一个递增的过程
- 默认打开的如果是移动端的样式,一些复杂的鼠标滑动、阴影或动画效果则不会加载
- 如果先有的是桌面版的复杂网页,然后想要逐步做减法来最终达成手机版网页,容易造成重复设计劳动,如果处理不好,还可能导致臃肿的代码
# 参考
- Responsive Web Design (opens new window)
- 移动端前端适配方案对比 (opens new window)
- 前端响应式布局原理与方案(详细版) (opens new window)
- 一文搞懂 grid 布局 和 flex 布局及其区别 (opens new window)
- 响应式设计的 9 个基本原则 (opens new window)
- RWD/AWD/PWA (opens new window)
- CSS 栅格系统原理分析 (opens new window)
- 如何用栅格系统布局网页界面 (opens new window)
- 响应式 WEB 开发精讲 (opens new window)