当前位置: 首页 > news >正文

【CSS in Depth 2 精译】第三章 文档流与盒模型 + 3.1 常规文档流

当前内容所在位置

  • 第一章 层叠、优先级与继承(已完结)
  • 第二章 相对单位(已完结)
    • 2.1 相对单位的威力
    • 2.2 em 与 rem
    • 2.3 告别像素思维
    • 2.4 视口的相对单位
    • 2.5 无单位的数值与行高
    • 2.6 自定义属性
    • 2.7 本章小结
  • 第三章 文档流与盒模型
    • 3.1 常规文档流 ✔️
      • 3.1.1 内容水平居中 ✔️
      • 3.1.2 逻辑属性(精译中 ⏳)
      • 3.1.3 用好逻辑属性的简写形式(精译中 ⏳)

译 注
全新第二版《CSS in Depth》对本章内容做了大幅更新。无论是 CSS 新手还是大咖们,相信应该都可以学到满满的干货。尘封了六年的 CSS 知识体系,现在也该与时俱进一下了,不是么?

第三章 文档流与盒模型

本章概要

  • 构建页面布局的通用小贴士
  • 设置元素大小的实用经验
  • 逻辑属性(logical properties)简介
  • 负的外边距与外边距折叠(margin collapsing)
  • 保持页面组件间的间距一致

在页面上实现元素布局涉及很多技术。在一个复杂的网站上,可能会用到网格(grids)、绝对定位元素以及其他大小不一的元素。需要掌握的内容太多了,想要学会所有布局相关的技术可能有点不切实际。

本书后续几章将深入研究布局技术。在此之前我们一定要认真打好基础,深刻理解浏览器给元素设置大小和位置的工作原理。更高级的布局话题都是建立在文档流(document flow)和盒模型(box model)等概念之上的;它们都是决定页面元素尺寸和方位的基本规则。

本章将构建一个基本的 单栏页面布局(one-column page layout)。对此您可能再熟悉不过了,因为它是一个经典的 CSS 入门练习;但在跟随我的引导完成该布局后,您会发现其中经常容易被忽视的几个细节。我们将探讨盒模型的一些边界情况,并分享几个有关设置元素大小和对齐方式的实用经验。


3.1 常规文档流

本章将构建一个简单的页面,顶部是标题栏,下方则为内容。内容宽度有限,以免文本行过长。这样的布局由于不存在并排的文本块,通常被称为 单栏布局(one-column layout)

本章结束时的页面效果如图 3.1 所示。我特意将这个页面设计成“块状”(“blocky”)风格,这样就能很清楚地看到各元素的大小和位置。

图 3.1 本章最终要构建的单栏页面布局效果图 3.1 本章最终要构建的单栏页面布局效果

新建一个页面和一个空的样式表,并按代码清单 3.1 中的 HTML 代码更新页面。该页面包含一个标题栏(header)和一个占据页面的大部分空间的主容器。容器内的 <main> 元素包含正文内容,而 <aside> 元素则包含一些社交媒体的超链接。

代码清单 3.1 单栏页面布局 HTML 代码

<!doctype html>
<html lang="en-US">
<head><link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body><header class="page-header"><h1>Franklin Running Club</h1></header><div class="container"><main class="main"><h2>Come join us!</h2><p>The <b>Franklin Running Club</b> meets at 6:00pm every Thursday at thetown square. Runs are three to five miles, at your own pace.</p><p>Join us while we train for the<a href="/st-patricks">St. Patrick's Day 5k</a>. Don't forget to weargreen!</p></main><aside class="social-links"><a href="/mastodon" class="button-link">follow us on Mastodon</a><a href="/facebook" class="button-link">like us on Facebook</a></aside></div>
</body>
</html>

先从简单的样式开始:设置页面字体,然后再给页面和每个主容器指定背景色。这样就能在操作过程中查看每个容器的位置和大小。完成后的页面效果如图 3.2 所示。

图 3.2 带背景色的三个主要容器图 3.2 带背景色的三个主要容器

相关样式代码如代码清单 3.2 所示,将其添加到样式表中。

代码清单 3.2 应用字体及颜色样式

:root {--brand-color: #0072b0; /* 标题文字颜色设为自定义属性,以便后续复用 */
}
body {margin: unset;  /* 移除用户代理样式添加的外边距,以便内容能到达浏览器窗口的边缘 */background-color: #eee;font-family: Helvetica, Arial, sans-serif;
}
.page-header {color: #fff;background-color: var(--brand-color);
}
.main {background-color: #fff;border-radius: 0.5em;
}
.social-links {background-color: #fff;border-radius: 0.5em;
}

在开始调整这些元素尺寸或布局之前,需要注意默认页面布局的行为方式。页面元素通常有两种基本类型:行内(inline块(block。每种类型都有各自不同的行为特征。

行内元素 会同页面文字一起从左至右流动。如果这些行内元素到达其容器边缘,就会换行(line wrap)。本例页面中的行内元素包括:“Franklin Running Club” 字样周围的 <b> 元素,以及超链接周围的 <a> 元素。

块元素(通常又称“块级”元素,“block-level” elements)则在各自独立的行上进行显示。它们会自动填满所在容器的宽度。即便通过样式减少块级元素的宽度,其上下两边也会留有一个换行符(line break)。该行为是通过用户代理样式表的样式声明 display: block 实现的,涉及元素包括 <p><div><header> 等。

该行为也被称为 常规文档流(normal document flow

定义

常规文档流是指页面元素的默认布局行为。行内元素与页面文字一起从左至右流动,到达容器边缘时换行;块级元素则独立成行,且上下各带一个换行符。

需要特别注意的是,常规流的高度和宽度 在本质上是不同的。按照常规文档流的设计,宽度是受限的,而高度则不作限制。页面内容会填充其容器的宽度,然后按需换行(line wrap as necessary)。

也就是说,父元素的宽度决定了子元素的宽度,而高度则恰恰相反:子元素的高度决定了父元素的高度。因此需要对宽高分别采用不同的方法来进行操作。本章后续内容就将介绍这些方法。

3.1.1 内容水平居中

构建页面布局时,通常应先从高级 DOM 元素(higher-level DOM elements)入手。应该先确定元素自身的大小和相互间的位置关系,再聚焦处理它们的子元素。这样可以先对页面进行“粗略切割”(“rough cut”),以便后续能更加专注于处理更小的细节。

提示

布局页面最好按由外向内的顺序进行设置。先将较大的容器元素设置就位,再去处理容器内较小的元素。

页面应该对正文区的宽度进行限制。由于块级元素会默认填充其容器宽度,因此对于全宽元素(full-width element),通常无需指定 width: 100%width: 100svw 样式,但通常会让默认宽度小一点。

限宽后的页面效果如图 3.3 所示。注意观察左右两边的浅灰色外边距,还有等宽的标题栏与主容器,以及同时靠左对齐的文字内容。

图 3.3 宽度受限的页面效果图 3.3 宽度受限的页面效果

该布局常用于设置页面内容居中。也可以将内容放在两个嵌套的容器内,然后对内部容器设置外边距,令其位于外部容器的中心(如图 3.4 所示)。Web 开发者 Brad Westfall 将这种居中方案称为 双容器模式(double-container pattern

图 3.4 双容器模式下的内容块水平居中示意图图 3.4 双容器模式下的内容块水平居中示意图

本例中的外部容器即 <body> 元素。默认情况下,其宽度已经是页面宽度的 100%,因此无需指定宽度;而在 <body> 内部,正文内容被包裹在了一个 <div class="container"> 元素中(即内部容器)。指定该容器的宽度,并控制好左右外边距即可设置内容居中。

同理,标题栏也可以如法炮制,以便与下方内容保持一致。此时外部容器变为 <header> 元素,而<h1> 成为内部容器。由于宽度必须相同,因此可以使用自定义属性来控制二者的大小。按如下代码更新样式:

代码清单 3.3 双容器样式

:root {--brand-color: #0072b0;--column-width: 1080px;
}
.page-header h1 {max-width: var(--column-width); /* 设置最大宽度 1080px */margin: 0 auto;  /* auto 会让左右外边距自动填充可用空间,从而使元素在外容器内居中 */
}
.container {max-width: var(--column-width); /* 设置最大宽度 1080px */margin: 0 auto;
}

通过设置左右外边距为 auto,外边距将根据需要自动扩展,以填充外部容器中可用的剩余宽度。这通常是设置内容块水平居中的最简单的方法。但需要注意的是,在常规文档流中,这种做法对上下边距无效。

使用最大宽度 max-width 来代替宽度 width,可以让元素在屏幕视口窄于 1080px 时同步缩小至 1080px 以下。也就是说,在较小的视口中,内部容器将填满屏幕;而在较大的视口中,它只能最大扩展到 1080px。这样的设计对于避免在尺寸较小的设备上横向滚动屏幕至关重要。本章后续内容将详细介绍 max-width 及其相关属性(properties)。

(篇幅较长,明天继续更新。下一篇介绍:逻辑属性及其用法,敬请期待!)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python转换PDF为PowerPoint演示文件
  • 新手教学系列——高效管理MongoDB数据:批量插入与更新的实战技巧
  • 数学基础 -- 三角学
  • Python爬虫之路(2):爬天气情况
  • macOS 的电源适配器设置
  • kotlin数据类型
  • 智慧金融-数据可视化
  • 搭建nginx https 反向代理 http tomcat服务实践。
  • 移动应用安全需求分析与安全保护工程
  • java内部类的本质
  • 计算器原生js
  • 第一章 深度学习和神经网络
  • sonar 8.9版本k8s安装部署
  • Jetpack Compose实现一个简单的微信UI
  • C/C++ 进阶(7)模拟实现map/set
  • 收藏网友的 源程序下载网
  • 30天自制操作系统-2
  • Asm.js的简单介绍
  • express + mock 让前后台并行开发
  • JS学习笔记——闭包
  • leetcode388. Longest Absolute File Path
  • PHP变量
  • Python学习之路13-记分
  • vue-router的history模式发布配置
  • 初探 Vue 生命周期和钩子函数
  • 从零开始的无人驾驶 1
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 记录一下第一次使用npm
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • (~_~)
  • (3)选择元素——(17)练习(Exercises)
  • (arch)linux 转换文件编码格式
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)Java算法:二分查找
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .net dataexcel winform控件 更新 日志
  • .NET MVC之AOP
  • .netcore 获取appsettings
  • .Net插件开发开源框架
  • /bin、/sbin、/usr/bin、/usr/sbin
  • @Bean有哪些属性
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ C++ ] STL priority_queue(优先级队列)使用及其底层模拟实现,容器适配器,deque(双端队列)原理了解
  • [ai笔记4] 将AI工具场景化,应用于生活和工作
  • [Android]Tool-Systrace
  • [asp.net core]project.json(2)
  • [BUUCTF NewStarCTF 2023 公开赛道] week3 crypto/pwn
  • [C/C++] -- 二叉树
  • [dts]Device Tree机制
  • [GPT]Andrej Karpathy微软Build大会GPT演讲(上)--GPT如何训练
  • [Java安全入门]三.CC1链