什么是响应式布局设计?
35 个回答
先上几张图来展示一下响应式设计的效果:
Web 发展到现在,在布局方面已经经历了多种姿势的变革:
大约在 2010年 ,Ethan Marcotte在2010年首度提出 了 “响应式设计”这个词。他将其描述为三种技术的混合使用。
- 第一个是液态网格,这早先已由Gillenwater进行探讨,可以在Marcotte的文章《Fluid Grids》(出版于2009年的《A List Apart》上)中读到。
- 第二个是液态图像的理念。通过使用相当简单的将设置
max-width
属性设置为100%
的技术,图像可以在包含它们的列变得比图像原始尺寸窄的时候,缩放得更小,但总不会变得更大。这使得图像可以被缩放,以被放到一个灵活尺寸的列,而不是溢出出去,同时也不会在列宽于图像的时候,使图像变得太大以至于画质变得粗糙。 - 第三个关键的组件是媒体查询。媒体查询使以往Cameron Adams探讨过的、由JavaScript实现的布局类型切换,可以只使用CSS实现。和所有尺寸的屏幕都使用一种布局不同的是,布局是可以改变的:侧栏可以在小屏幕上重新布局,而替代用的导航栏也可以显示出来。
但在现实世界中,特别是对于初学者而言,响应式布局、自适应布局和流体布局总是会混淆,尤其是响应式和自适应布局:
简单地说:
- 自适应布局,会有多个 ".css" 文件来描述布局,并且需要借助 JavaScript判断视窗大小,在不同条件下引用不同的 CSS文件。
- 流体布局,相对而言会更简单一点,他是使用百分比来控制Web页面布局(控制元素大小)
- 响应式布局,通过 CSS媒体查询来判断,在不同条件下运用不同的 CSS 样式规则
CSS中的单位和值 是CSS中最基础的知识,不过其中百分比的使用还是比较复杂的。因为它的计算总是需要一个参考物,并且运用在不同属性上,它的参考物都不同。如果你对这方面知识感兴趣的话,可以阅读《CSS中百分比计算的方式》一文。
这里不详细说响应式布局和自适应布局之间的差异,当然,你要是感兴趣的话,可以阅读下文:
或者使用 Google 搜索引擎,搜索”RWD vs AWD“。
我们回到响应式布局的话题中来。
响应式Web设计不是单独的技术,它是描述Web设计的一种方式、或者是一组最佳实践的一个词,它是用来建立可以响应查看内容的设备的样式的一个词。在Marcotte's原来的探索中,这意味着灵活网格 和媒体查询,Web的响应式工作已经成为了默认做法。现代的CSS布局方式基本上就是响应式的,而且我们在Web平台上内置了新的东西,使得设计响应式站点变得容易。
另外,响应式设计应该遵循一些基本原则,比如《9 basic principles of responsive web design》提到的九大原则:
响应式设计和自适应设计是两种不同的布局系统
内流是流动的(或者说是流式的)
尽可能采用相对单位
CSS中的相对单位有很多种,比如我们熟悉的 %,rem,em 以及后面出来的视窗单位 vw,vh等。
断点选择
最大值和最小值
了解CSS的同学都知道,在CSS中给一个元素设置尺寸大多数使用的是 width、height属性,还有就是min-width、max-width、min-height 和 max-height:
而在媒体查询中(又被称为条件CSS)中采用的主要是max-width、min-width等。CSS的逻辑属性出现之后,又新增了 min-inline-size,min-block-size,max-inline-size和max-block-size等:
有关于 CSS逻辑属性更多的介绍,还可以阅读:
嵌套对象应该尽可能的简洁
移动端(Mobile)优先
网页字体 vs 系统字体
系统字体大家易于理解,Web 字体一般是指使用 CSS 的 @font-face 引用的自定义字体。
位图和矢量图
Web图像的使用本来就是一个复杂的体系,特别是响应式出现之后,让事情变为更为复杂。为什么这么说呢?可以从下面的文章中找到答案:
- 探索Web上图片使用方式_CSS, image, 会员专栏 教程_W3cplus
- 聊聊img元素_Web图像, 会员专栏 教程_W3cplus
- 给Web页面提供正确图像的姿势_CSS, picture, srcset, Responsive, 会员专栏 教程_W3cplus
- 如何使用 HTML5 的picture元素处理响应式图片
- Flexible Images_Flexible Image, Responsive, aspect-ratio, 宽高比, 会员专栏 教程_W3cplus
- Web中的图标_icon, 会员专栏 教程_W3cplus
了解响应式之后,那么对于怎么实现响应式布局就更易于理解了。但在实际开发一个响应式设计的Web页面或应用时,还是有几个蛋疼的地方,和几个必须掌握的基础知识。
媒体查询
对于传统的响应式实向方案,那么媒体查询相关的知识是最为基础的。因为我们需要通过 媒体查询的相关属性来判断视窗大小(或设备类型)。这里所说的媒体查询指的就是 CSS的 @media 属性,比如:
/*URL:http://html5boilerplate.com/*/
/* Smartphones (portrait and landscape) ----------- */
@media only screen
and (min-width : 320px)
and (max-width : 480px) {
/* Styles */
}
/* Smartphones (landscape) ----------- */
@media only screen
and (min-width : 321px) {
/* Styles */
}
/* Smartphones (portrait) ----------- */
@media only screen
and (max-width : 320px) {
/* Styles */
}
/* iPads (portrait and landscape) ----------- */
@media only screen
and (min-width : 768px)
and (max-width : 1024px) {
/* Styles */
}
/* iPads (landscape) ----------- */
@media only screen
and (min-width : 768px)
and (max-width : 1024px)
and (orientation : landscape) {
/* Styles */
}
/* iPads (portrait) ----------- */
@media only screen
and (min-width : 768px)
and (max-width : 1024px)
and (orientation : portrait) {
/* Styles */
}
/* Desktops and laptops ----------- */
@media only screen
and (min-width : 1224px) {
/* Styles */
}
/* Large screens ----------- */
@media only screen
and (min-width : 1824px) {
/* Styles */
}
/* iPhone 4 ----------- */
@media
only screen and (-webkit-min-device-pixel-ratio : 1.5),
only screen and (min-device-pixel-ratio : 1.5) {
/* Styles */
}
更多片段还可以查阅:
断点的选择
媒体查询中的条件其实就是断点,指的就是视窗的尺寸:
特别是随着终端设备丰富之后,要做的选择就更为蛋疼。一般情况之下,下面这几种就可以满足:
// Small devices (landscape phones, 576px and up)
@media only screen and (min-width: 576px) {
}
// Medium devices (tablets, 768px and up)
@media only screen and (min-width: 768px) {
}
// Large devices (desktops, 992px and up)
@media only screen and (min-width: 992px) {
}
// X-Large devices (large desktops, 1200px and up)
@media only screen and (min-width: 1200px) {
}
// XX-Large devices (larger desktops, 1400px and up)
@media only screen and (min-width: 1400px) {
}
如果觉得不好选择,可以使用断点生成器来帮助你做选择:
图片的适配
响应式布局中,图片适配是比较蛋疼的。不过随着 img 的 srcset 和 picture等特性的到来,事情就变得简单多了:
当然,最为蛋疼的还是图片的适配问题。 Jason Grigsby 曾经专门写了一个系列,来介绍怎么在响应布局中处理图片:
除了图片适配处理之外,还会涉及等比缩放相关的问题。不过社区中的大大们是非常聪明的,总结了很多种等比缩放的处理方式:
特别是CSS的 aspect-ration 属性的出现,这一切变得都已不再是问题:
文字排版
除了图片那就是文字排版了。为了能给用户提供更好的体验,总是希望在不同的的终端上采用不同的字号。在《如何精确控制响应式布局中排版》一文中就介绍了这方面的技术:
另外,在CSS中,我们可以使用 CSS 的 calc() 特性,配合视窗单位,会让事情变得更简单。在社区中专门提出了CSS锁的概念,来解决这方面的问题:
font-size: calc([minf]px + ([maxf] - [minf]) * ( (100vw - [minw]px) / ([maxw] - [minw]) ));
有关于这方面的介绍还可以阅读:
这里还用到了 CSS 动态计算相关的知识:
不过 CSS函数的 min()、max()和clamp() 出现之后,事情就变得更为简单了:
使用 clamp() 就可以实现前面提到的 CSS 锁的功能:
更详细的介绍可以阅读《聊聊 CSS 的 min()、max() 和 clamp()函数》一文。注意,它们也被称为比较函数。
有关于响应多中排版方面更多的介绍,还可以阅读:
上面说的是传统的响应式布局的相关主要技术和较为麻烦之处。但随着 CSS Grid 布局的到来,响应式布局就变得要容易地多。比如 CSS Grid 布局中的minmax()、repeat()函数,auto-fit和auto-fill以及结合 min-content、max-content等,实现一些特定的效果,不再需要借助任何的媒体查询,也能实现响应式的效果:
CSS Grid 布局是 Web 布局中唯一具备二维布局能力的特性。她非常的强大,也非常的复杂。
为什么说 CSS Grid强大,也复杂呢?我是有非常强大的体感的。比如在图解CSS系列和Web布局系列 中介绍Flexbox 布局,只用了两三章节:
- 图解CSS:Flexbox布局(Part1)_CSS, Flexbox, Layout, 图解CSS, 会员专栏 教程_W3cplus
- 图解CSS:Flexbox布局(Part2)_CSS, 图解CSS, Layout, Flexbox, 会员专栏 教程_W3cplus
- 你真的了解CSS的flex-basis吗?_CSS, Flexbox, 会员专栏 教程_W3cplus
- Flexbox布局中不为人知的细节_Flexbox, Layout, 布局 教程_W3cplus
但介绍 Grid 布局,我已经花了九个章节230张图,还没介绍完:
- 图解CSS: Grid布局(Part1)
- 图解CSS: Grid布局(Part2)
- 图解CSS: Grid布局(Part3)
- 图解CSS: Grid布局(Part4)
- 图解CSS: Grid布局(Part5)
- 图解CSS: Grid布局(Part6)
- 图解CSS: Grid布局(Part7)
- 图解CSS: Grid布局(Part8)
- 图解CSS: Grid布局(Part9)
2021年12月17日更新:一开始以为十几篇就能把CSS Grid 聊完,没想到居然花了二十几篇。整个系统可以阅读: 2022年不能再错过 CSS 网格布局了
另外 Web布局还有很多小技巧的:
除此之外,在 2021年 CSS新特性一文中提到了新的实现响应式布局的方案:
简单地说,使用最新的特性 @container 在不需要任何 媒体查询特性下就可以实现响应式效果:
比如下面这样的效果
2021年12月17日更新:
最近亲测了一些 CSS 容器查询相关的特性,还是蛮有意思的。为此整理了一些这方面的内容:
目前主要有:
- 初探CSS容器查询_CSS, 容器查询, @container, contain, 会员专栏, Responsive 教程_W3cplus
- 容器查询中的 container 和 @container
- 容器查询给设计带来的变化_CSS, 容器查询, Responsive, Layout, 会员专栏 教程_W3cplus
使用一些现代Web布局,可以实现一些简单的类似容器查询的效果,有关于这方面的介绍,可以阅读下文:
在这张图中,提到了容器查询之外,还有 layer 层,即 CSS 的 @layer 特性:
附上一份 2020年新特性相关的介绍: 2020年CSS有哪些新特性_CSS, CSS新特性, 会员专栏 教程_W3cplus
最后再提一点,对于很多初学者来说,还很容易把响应式设计和移动端的适配方案相混淆。具体不详细阐述了,列一些链接:
这是我看到的两篇比较好的文章,如果你对于移动端适配方案感兴趣,还可以阅读:
- 使用Flexible实现手淘H5页面的终端适配_Layout, mobile, 会员专栏 教程_W3cplus
- 再聊移动端页面的适配_Layout, 布局, mobile, CSS, 会员专栏 教程_W3cplus
- 如何在Vue项目中使用vw实现移动端适配_vw, Layout, 布局, Vue, mobile, 会员专栏 教程_W3cplus
- 移动端上的设计和适配_mobile, Design, 会员专栏 教程_W3cplus
- 手淘Web页面Bar和纵向适配的设计_mobile, CSS, Layout, 会员专栏 教程_W3cplus
最后再提一下折叠屏幕相关的话题,他和响应设计有点类似,也是需要使用媒体查询:
当然,他有一些特殊的API:
- 聊聊安卓折叠屏给交互设计和开发带来的变化_mobile, 会员专栏 教程_W3cplus
- 可折叠Web可能会给我们带来的变化_Layout, CSS, mobile 教程_W3cplus
- 可用于双屏幕和折叠屏的Web API
- 折叠屏相关的Web API_mobile, Layout, 布局, CSS, 会员专栏 教程_W3cplus
对了,印象中有一些介绍响应式设计的书:
这两本书我自己阅读过,对于初学者而言,还是可以的,特别是第一本。对于概念,实现技术等都有一定的介绍。另外还有几本书,未曾阅读过:
仅供参考。
在社区中,很多个人网站或博客都具备响应式的效果。比如小站就做了这方面的适配处理:
有关于 CSS 更多的话题可以来小站:
2021年12月17日更新:
响应式布局中图片的处理是很头疼的事情,最近整理了一波这方面的文章,感兴趣的小伙伴可以看看:
响应式图片第三波出炉了。
第一波主要和大家一起聊了聊和响应相关的概念和术语:
第二波主要和大家聊的是HTML的img标签新增的srcset和sizes属性是如何为用户加载不同尺寸的图片资源:
第三波聊的是 HTML5 的 picture 标签的source元素是如何使用 srcset、sizes、media和type加载不同的的图片资源,实现艺术指导效果:
https://www.zhihu.com/video/1455323390224068609