【CSS in Depth 2 精译_050】7.3 CSS 响应式设计中的流式布局原则(Fluid layout)

当前内容所在位置(可进入专栏查看其他译好的章节内容)

  • 【第七章 响应式设计】 (概述)
    • 7.1 移动端优先设计原则(上篇)
      • 7.1.1 创建移动端菜单(下篇)
      • 7.1.2 给视口添加 meta 标签(下篇)
    • 7.2 媒体查询(上篇)
      • 7.2.1 深入理解媒体查询的类型(上篇)
      • 7.2.2 页面断点的添加(中篇)
      • 7.2.3 响应式列的添加(下篇)
    • 7.3 流式布局 ✔️
    • 7.4 响应式图片(待翻译 ⏳)

文章目录

    • [7.3 流式布局 Fluid layouts](#7.3 流式布局 Fluid layouts)
      • [7.3.1 为大视口添加样式 Adding styles for a large viewport](#7.3.1 为大视口添加样式 Adding styles for a large viewport)
      • [7.3.2 表格的处理 Dealing with tables](#7.3.2 表格的处理 Dealing with tables)

《CSS in Depth》新版封面

7.3 流式布局 Fluid layouts

响应式设计的第三个也是最后一个原则,即 流式布局(fluid layout 。流式布局,有时也称 液体布局(liquid layout ,是指让所用容器的尺寸随视口宽度的变化而变化。它跟固定布局相反,固定布局的列都是用 px 像素或 em 为单位进行定义。固定布局下的容器(例如设置了 width: 800px 的元素)在小尺寸屏幕上可能会超出视口的宽度,导致页面出现水平滚动条;而流式布局下的容器则会自动缩小尺寸以适应视口。

在流式布局中,主页面的容器通常没有明确的宽度,也不会设置百分比作为宽度,但可能会设置左右内边距,或者属性值为 auto 的左右外边距,从而在容器与视口边缘间留出一定空间。也就是说容器可能比视口略窄,但始终不会比视口更宽。

而在主容器中,任何列都用百分比来定义宽度(如正文栏宽 70%,侧边栏宽 30%)。这样无论屏幕宽度是多少都能容得下主容器。用 Flexbox 布局也行,只要设置弹性元素的 flex-grow 属性,更重要的是指定好 flex-shrink 属性,使得元素能填满屏幕宽度。要习惯将容器宽度设置为百分比的做法,而不是给定任何固定大小。

说明

流失布局容器在并非仅限本章示例页面,其实全书也几乎只用了流式布局。现在您应该已经或多或少熟悉这种布局方式了。

一个网格默认情况下其实就是响应式的。在没加 CSS 时,块级元素的宽度不会超过视口,行内元素为避免水平溢出也会换行(wrap);加上 CSS 后,页面的响应式特性就交由您来维护了。这个道理知易行难,但意识到每次都是从一个良好的默认状态开始,有助于我们更好地实现响应式布局。

7.3.1 为大视口添加样式 Adding styles for a large viewport

接下来要为下一个屏幕断电添加媒体查询样式。在实现过程中,您会发现我们从未给容器设置过固定大小的宽度。容器可以自然伸展到 100%(当然要减去一些内外边距)。在三列布局时我们使用了 Flexbox 技术,让每一列占据视口宽度的三分之一。

示例页面最终的大尺寸视口布局效果如图 7.9 所示。实现方法与中等尺寸屏幕视口类似,只是这里的空间更多了。您可以随意使用内边距,这正是接下来要完成的工作。

【图 7.9 大视口下的页面布局效果】

可以看到,左右两侧的内边距已由 1em 增加到 4em。主图中文字周围的内边距也相应增加了,这样图片可以变得更大。新增样式如代码清单 7.12 所示。

将媒体查询块 (min-width: 800px) 内的所有样式添加到示例页面的样式表中。请再次确认将相同的样式规则放到尺寸较小的断点后面(即 .page-header.hero 以及 main),这样媒体查询中的样式才能覆盖前面断点指定好的样式。

代码清单 7.12 大屏断点处增大内边距的样式代码

css 复制代码
@media (min-width: 800px) {
  .page-header {
    padding: 1em 4em; /* 将页面的左右内边距增大至4em */
  }
}

@media (min-width: 800px) {
  .hero {
    /* 增加主图内边距,从而得到更大的主图 */
    padding: 7em 6em;
  }
}

@media (min-width: 800px) {
  main {
    padding: 2em 4em; /* 将页面的左右内边距增大至4em */
  }
}

@media (min-width: 800px) {
  .nav-menu {
    padding-inline: 4em; /* 将页面的左右内边距增大至4em */
  }
}

至此,一个具有三处页面断点的响应式页面就大功告成了。可以继续在上面试验,变更断点的宽度,看看浏览体验上会有什么变化。

7.3.2 表格的处理 Dealing with tables

在移动端设备的流式布局中,表格的问题特别多。如果表格列过多,很容易超过屏幕宽度(如图 7.10 所示)。

【图 7.10 在移动端设备上表格的右端因为超宽被裁掉了】

如果可以的话,建议在移动端设备上改用别的方式组织数据。比如将每一行数据单独用一块区域展示,并让每块区域顺次堆叠;或者使用更适合小尺寸屏的可视化图形或图表来展示。但有时就得用表格进行显示。

此时有一种方案是将表格强制显示为一个普通的块级元素,如图 7.11 所示:

【图 7.11 同样是表格型数据,但各行与各单元格都设置了 display: block 的样式效果】

该布局由 <table><tr><td> 元素组成,但它们分别设置了 display: block 样式,覆盖了此前默认的属性值(即 tabletable-rowtable-cell 等)。通过使用 max-width 媒体查询可将这些样式变动限制在小尺寸屏幕下。相应的 CSS 代码如代码清单 7.13 所示。(可将代码应用到任意 <table> 标签对比效果)

代码清单 7.13 在移动端设备上强制实现表格响应式布局的样式代码

css 复制代码
table {
  inline-size: 100%;
}

@media (max-width: 480px) {
  table, thead, tbody, tr, th, td {
    display: block; /* 让表格的所有元素都呈块级显示 */
  }

  thead tr {
    /* 将表头移出屏幕外,令其隐藏 */
    position: absolute;
    top: -9999px;
    left: -9999px;
  }

  tr {
    margin-block-end: 1em; /* 在每组表格数据间添加一些间隙 */
  }
}

以上样式会让表格各单元格从从上到下排列,并在每个 <tr> 之间留出一定的外边距;但该方案也会让 <thead> 行不再跟下面的每一列对齐,因此要用绝对定位将表头那行移出视口。出于页面可访问性的考虑,这里并没有设置 display: none,否则读屏工具将无法识别表头。这断然不是最完美的解决方案,但在其他方案都不尽人意的时候,也不失为当下最好的效果了。

译注

至此,CSS 响应式设计的三大原则就全部介绍完毕了。下一节补充介绍一些响应式图片的知识作为第 7 章的收尾内容,敬请关注!



关于《CSS in Depth》(中译本书名《深入解析 CSS》)

第 1 版 第 2 版
读者评分 原版:4.7 (亚马逊);中文版:9.3(豆瓣) 原版:5.0(亚马逊);中文版:暂无,待出版
出版时间 原版:2018 年 3 月 ;中文版:2020 年 4 月 原版:2024 年 7 月;中文版:暂无,待出版
原价 原版:$44.99 ;中文版:¥139.00 原版:$59.99;中文版:暂无,待出版
现价 原版:$36.49 ;中文版:¥52.54 起步 原版:$52.09;中文版:暂无,待出版
原版国内预订 起步价 ¥461.00 起步价 ¥750.00

本专栏为该书第 2 版高分译文专栏,全网首发,精译精校,持续更新,计划今年内完成全书翻译,敬请期待!!!

目前已完结的章节(可进入本专栏查看详情,连载期间完全免费):

  • 第一章 层叠、优先级与继承(已完结)
    • 1.1 层叠
    • 1.2 继承
    • 1.3 特殊值
    • 1.4 简写属性
    • 1.5 CSS 渐进式增强技术
    • 1.6 本章小结
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型(已完结)
    • 3.1 常规文档流
    • 3.2 盒模型
    • 3.3 元素的高度
    • 3.4 负的外边距
    • 3.5 外边距折叠
    • 3.6 容器内的元素间距问题
    • 3.7 本章小结
  • 第四章 Flexbox 布局(已完结)
    • 4.1 Flexbox 布局原理
    • 4.2 弹性子元素的大小
    • 4.3 弹性布局的方向
    • 4.4 对齐、间距等细节处
    • 4.5 本章小结
  • 第五章 网格布局(已完结)
    • 5.1 构建基础网格
    • 5.2 网格结构剖析 (上)
      • 5.2.1 网格线的编号(下)
      • 5.2.2 网格与 Flexbox 配合(下)
    • 5.3 两种替代语法
      • 5.3.1 命名网格线
      • 5.3.2 命名网格区域
    • 5.4 显式网格与隐式网格(上)
      • 5.4.1 添加变化 (中)
      • 5.4.2 让网格元素填满网格轨道(下)
    • 5.5 子网格(全新增补内容)
    • 5.6 对齐相关的属性
    • 5.7 本章小结
  • 第六章 定位与堆叠上下文(已完结)
    • 6.1 固定定位
      • 6.1.1 创建一个固定定位的模态对话框
      • 6.1.2 在模态对话框打开时防止屏幕滚动
      • 6.1.3 控制定位元素的大小
    • 6.2 绝对定位
      • 6.2.1 关闭按钮的绝对定位
      • 6.2.2 伪元素的定位问题
    • 6.3 相对定位
      • 6.3.1 创建下拉菜单(上)
      • 6.3.2 创建 CSS 三角形(下)
    • 6.4 堆叠上下文与 z-index
      • 6.4.1 理解渲染过程与堆叠顺序(上)
      • 6.4.2 用 z-index 控制堆叠顺序(上)
      • 6.4.3 深入理解堆叠上下文(下)
    • 6.5 粘性定位
    • 6.6 本章小结
相关推荐
Mr_Xuhhh1 小时前
重生之我在学环境变量
linux·运维·服务器·前端·chrome·算法
永乐春秋2 小时前
WEB攻防-通用漏洞&文件上传&js验证&mime&user.ini&语言特性
前端
鸽鸽程序猿2 小时前
【前端】CSS
前端·css
ggdpzhk2 小时前
VUE:基于MVVN的前端js框架
前端·javascript·vue.js
学不会•4 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
活宝小娜6 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点7 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow7 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o7 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
开心工作室_kaic7 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端