【CSS in Depth 2 精译_019】3.2 CSS 的盒模型

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

  • 第一章 层叠、优先级与继承(已完结)
    • 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.2.1 避免使用魔数 ✔️
      • 3.2.2 调整盒模型 ✔️
      • 3.3.3 全局设置 border-box ✔️
    • 3.3 元素高度的问题(精译中 ⏳)

文章目录

    • 3.2 盒模型
      • 3.2.1 避免使用魔数
      • 3.2.2 调整盒模型
      • 3.2.3 全局设置 border-box

3.2 盒模型

当前示例页需要处理的下一个问题,是主容器和社交链接区域中的内边距。当前这些区域的文字紧挨着白色背景的边缘,应该适当留白看起来才不会那么拥挤,也更方便阅读。按代码清单 3.5 所示代码更新样式。

代码清单 3.5 设置容器内边距

.main {padding: 1em 1.5rem;  /* 为容器添加内边距 */background-color: #fff;border-radius: 0.5em;
}
.social-links {padding: 1em 1.5rem;  /* 为容器添加内边距 */background-color: #fff;border-radius: 0.5em;
}

现在两个白色容器内的内容区稍微变窄了一些,留出了足够的呼吸空间。然而这样一来,正文的左侧就不再与上方标题栏内的文字在水平方向上对齐了(如图 3.6 所示):

图 3.6 设置内边距后,文字不再统一左对齐
图 3.6 设置内边距后,文字不再统一左对齐

这个问题貌似可以通过在页面标题栏添加类似的内边距来解决;但如果按照代码清单 3.6 更新样式表,会发现情况没有丝毫改变:

代码清单 3.6 给页面标题添加内边距

.page-header h1 {max-inline-size: var(--column-width);margin-inline: auto;padding-inline: 1.5rem;  /* 给页面标题设置相同的内边距 */
}

如果恰巧在较小的屏幕上(宽度小于约 1100px)显示,可能看起来像是有效的;但在更宽的屏幕上,根本没有产生任何肉眼可见的变化。即使添加了内边距 padding,标题栏内容区的宽度也没有像主容器里的那样变窄。

这都是 盒模型(box model 的默认行为造成的。根据盒模型的设计规范,页面上的每个元素都是由四个重叠在一起的矩形所构成的。内容区(content area 是最里面的矩形,其中包含元素的内容;内边距区(padding area 包含 内容区 外加 所有内边距部分;同理,边框区(border area 则是 内边距区 外加 所有边框部分;而 外边距区(margin area 则是最外面的矩形,包含 边框区 外加 所有外边距部分

定义

盒模型 描述了 HTML 元素的各个组成部分(内容区、内边距、边框和外边距),以及它们对元素尺寸大小的影响;这些组成要素所产生的各矩形盒将由浏览器完成布局并最终呈现到页面上。

指定元素的高度或宽度,也就设置了该元素内容区的大小;所有的内边距、边框和外边距都会添加到其外部(如图 3.7 所示):

图 3.7 盒模型的默认行为模式
图 3.7 盒模型的默认行为模式

这样的行为模式意味着一个宽度为 300px、内边距为 10px 且边框宽 1px 的元素,渲染出的实际宽度为 322px(即宽度加上左右内边距再加上左右边框)。要是单位再不一致,情况就更令人困惑了。

回到示例页面,给宽度为 1080px<h1> 元素添加内边距,最终增加了其有效宽度。内边距在内容区 1080px 的外部,而正文区的宽度仍保持 1080px

注意

上下外边距以及上下内边距在行内元素上的行为模式略有不同。这些边距值虽然也会增加元素的高度,但并不会影响到行内元素所在容器的高度;其容器的高度是由行内元素的行高 line-height 决定的。如需变更该行为模式,行内元素须声明 display: inline-block

Outline 轮廓 —— 另一种边框类型

与边框 border 类似,元素也可以添加一个 outline 轮廓。 其行为模式很像边框,但不会增加元素尺寸,也不是盒模型的组成部分。outline 位于边框外部,与外边距重叠。它既不会改变元素的大小或位置,也不会对页面布局造成任何影响。

border 类似,outline 属性也是 outline-coloroutline-styleoutline-width 这三个属性的简写形式。例如,outline: orange solid 2px 会在元素周围添加一个 2px 宽的橙色(orange)轮廓。与边框不同的是,无法为元素的每一侧设置不同的轮廓;所有四条边上的轮廓样式始终相同。在以前,轮廓的四个角总是正方形尖角,但最近部分浏览器已经更改了轮廓的行为模式,以便与元素上任何指定了 border-radius 的圆角曲线相匹配。

想要控制轮廓的位置,可以通过设置 outline-offset 属性来实现。其属性值为正值(如 outline-offset: 3px)时,轮廓将向外扩展,从而增加元素边框与轮廓之间的空间;为负值时,轮廓将向内收缩,使其与元素边框区域重叠。

全面理解盒模型是用好 CSS 的重中之重。内边距(padding)和边框(border)都有可能增加元素的尺寸大小——如果在这一点上认识不到位,CSS 的这些行为模式可能会让您措手不及。想要调整样式与之相适应,首要的一步是弄清为什么会发生这种情况。

3.2.1 避免使用魔数

有时遇到像这样的问题,人们往往会反复试错各种属性值来达到想要的效果,尤其是在用百分比定义大小的时候。

假设样式宽度用的是 70% 而不是 1080px,一个天真的修复办法很可能是减少 <h1> 元素的百分比宽度;或许改成 66% 看上去还行,但这并不可靠。这里的 66% 就是一个 魔数(magic number。您并没有使用一个理想的值,而是在样式上一顿东拼西凑肆意更改,直到改出想要的效果。

通常情况下,编程中出现魔数的做法并不可取,因为很难解释清楚该魔数为什么有效。如果不了解魔数的出处,自然也就无法预测它在不同情况下表现出的行为。也许文字在 1400px 宽的视口上能对齐,但换到更大或更小的屏幕上就不行了。尽管在开发 CSS 样式时有试错的时候,但那通常是针对与样式本质相关的选择而言的,而不是用于强行调整元素的定位布局。

取代魔数的一个替代方案,是把具体计算的麻烦交给浏览器处理。本例中,<h1> 共超宽了 3em(考虑到左右内边距),因此可以使用 calc() 函数来减少相应的准确宽度。将宽度设置为 calc(var(--columns-width) - 3em) 正好满足需求。但还有一种更好的解决方案。

译注

“魔数”一词在上一版中译为“魔术数值”,但并未对其含义展开讨论。根据《代码大全》第二版第 12 章 12.1 小节的解释,magic number 被译为“神秘数值”,是指在程序中出现的、没有经过解释的数值字面量,如 100 或者 47524。原文摘录如下,以加深理解:

“Magic numbers are literal numbers, such as 100 or 47524, that appear in the middle of a program without explanation.”

这里之所以选用“魔数”,是因为“魔数”更常见,有点约定俗成的意味。

3.2.2 调整盒模型

盒模型的默认行为往往会导致页面元素的大小和对齐出现问题;而人们想要的效果,是希望设置的宽度能包含内边距和边框。在 CSS 中可以通过 box-sizing 属性来调整盒模型的行为。

box-sizing 的默认值为 content-box,也就是说,指定的任何高度或宽度,其实设置的都是内容盒(content box)的尺寸大小。如果将 box-sizing 的属性值改为 border-box,那么属性 widthheightinline-sizeblock-size 设置的尺寸,就是内容区、内边距和边框区域共同组合起来的尺寸,而这正是本例期望的效果。

如图 3.8 所示,左边盒模型的 box-sizing 设为了 border-box。此时内边距不会加宽元素,而是让里面的内容区收窄;高度也是如此。左右两边的元素具有相同的宽度和高度;注意,当存在有效的内边距或边框时,具有边框盒尺寸(border box sizing)的元素将比具有内容盒尺寸(content box sizing)的元素更小。

图 3.8 边框盒尺寸(border-box sizing)改变了盒模型,从而使宽高更容易预测
图 3.8 边框盒尺寸(border-box sizing)改变了盒模型,从而使宽高更容易预测

如果将 <h1> 改为使用边框盒尺寸(border box sizing),其文字内容遍与下方正文区的内容对齐了(如图 3.9 所示):

图 3.9 边框盒尺寸下的文字内容左对齐效果
图 3.9 边框盒尺寸下的文字内容左对齐效果

根据以下代码更新标题栏的盒模型设置:

代码清单 3.7 具有已更正的盒模型的标题

.page-header h1 {box-sizing: border-box; /* 将盒模型改为边框盒尺寸 */max-inline-size: var(--column-width);margin-inline: auto;padding-inline: 1.5rem;
}

对一级标题设置 box-sizing: border-box 后,其内边距的大小也计入了 1080px 的宽度内。这样标题文字就与下方的正文内容对齐了。

3.2.3 全局设置 border-box

至此,示例中的元素盒模型行为已经变得更加直观了,但其他元素肯定也有同样的问题。如果能一次性解决这个问题,并且适用于所有元素,那就再好不过了,今后就再也不必逐一考虑该如何调整了。利用通用选择器(*)就能实现这一目标。如代码清单 3.8 所示,该选择器将对页面上的所有元素生效,同时,我还特意加上了一组对页面上所有伪元素也能生效的选择器。将以下这段代码放在示例样式表的顶部:

代码清单 3.8 通用边框框修复

*,
::before,
::after {box-sizing: border-box; /* 将边框盒尺寸应用到页面上所有的元素及伪元素 */
}

样式生效后,heightwidth 所指定的,将始终是元素的实际高度和宽度,它们将不再受内边距的干扰。

这样,网站上的每个元素都将具有预见性更好的盒模型行为。建议每次开始新网站的开发时,都将代码清单 3.8 里的样式添加到 CSS 中;长远来看,这将省去很多麻烦。然而,对于现有样式表,尤其是已经在默认的内容盒模型下编写了大量样式的情况下,该设置可能也会带来一些新的问题。如果现有项目确实需要加上这段样式代码,请务必仔细检查是否存在任何错误。

注意

在样式表开头附近添加这段代码已是普遍做法了。从现在开始,本书中的每个示例都将假定这段 border-box 设置位于样式表的开头。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/47719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Qt安装与简易串口控制Arduino开发板小灯教程】

【Qt安装与简易串口控制Arduino开发板小灯教程】 1. 前言2. QT环境搭建3. 验证QT_Creator是否安装成功3.1 设计流程3. 2 上位机界面设计 4. 上位机逻辑代码编写4.1 添加串口库、包含串口相关头文件4.2 添加QSerialPort成员4.3 创建串口对象、搜索所有可用串口4.4 在编写“打开串…

微软成为PostgreSQL主要贡献者

微软对PostgreSQL贡献的很多新功能都来自于客户在使用微软Azure上的PostgreSQL管理实例数据库&#xff0c;所以这些新功能都来自于真实的客户需求 微软贡献的这些新功能都是比较实用的功能 在这里&#xff0c;【真实的客户需求】要突出一下&#xff0c;因为现在很多社区贡献者…

4. docker镜像、Dockerfile

docker镜像、Dockerfile 一、docker镜像1、镜像介绍2、镜像核心技术 二、Dockerfile定制镜像1、Dockerfile使用流程1.1 编写Dockerfile1.2、构建镜像1.3 创建容器测试镜像定制操作 2、Dockerfile常用指令 一、docker镜像 1、镜像介绍 分层的文件系统 优势&#xff1a;节省空间…

基于JAVA+SpringBoot+uniapp的心理小程序(小程序版本)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、SpringCloud、Layui、Echarts图表、Nodejs、爬…

docker默认存储地址 var/lib/docker 满了,换个存储地址操作流程

1. 查看docker 存储地址 docker info如下 var/lib/docker2、查看内存大小 按需执行 df -h 找超过100M的大文件 find / -type f -size 100M -exec ls -lh {} \; df -Th /var/lib/docker 查找这个文件的容量 df -h 查找所有挂载点 du -hs /home/syy_temp/*1、df -h 2、sud…

2-38 基于matlab的蚁群算法优化无人机uav巡检

基于matlab的蚁群算法优化无人机uav巡检&#xff0c;巡检位置坐标可根据需求设置&#xff0c;从基地出发&#xff0c;返回基地&#xff0c;使得路径最小。可设置蚁群数量&#xff0c;信息素系数。输出最佳路线长度。程序已调通&#xff0c;可直接运行。 2-38 蚁群算法优化无人…

科普文:多线程如何使用CPU缓存?

一、前言 计算机的基础知识聊的比较少&#xff0c;但想要更好的理解多线程以及为后续多线程的介绍做铺垫&#xff0c;所以有必要单独开一篇来聊一下 CPU cache。 二、CPU 前面有一篇文章关于 CPU是如何进行计算 感兴趣的同学&#xff0c;可以先移步了解一下&#xff0c;不了…

[003-02-10].第10节:Docker环境下搭建Redis主从复制架构

我的博客大纲 我的后端学习大纲 我的Redis学习大纲 1.cluster&#xff08;集群&#xff09;模式-docker版 哈希槽分区进行亿级数据存储 1.1.面试题&#xff1a;1~2亿条数据需要缓存&#xff0c;请问如何设计这个存储案例 1.回答&#xff1a;单机单台100%不可能&#xff0c;肯…

细说MCU用定时器控制ADC采样频率的实现方法并通过Simulink查看串口输出波形

目录 一、硬件工程 二、建立Simulink模型 1.安装MATLAB和Simulink 2.建立Simulink模型 三、代码修改 1.修改回调函数 2.产看结果 3.完整的main.c 本文作者的文章 细说MCU用定时器控制ADC采样频率的实现方法-CSDN博客 https://wenchm.blog.csdn.net/article/details/…

270-VC709E 基于FMC接口的Virtex7 XC7VX690T PCIeX8 接口卡

一、板卡概述 本板卡基于Xilinx公司的FPGA XC7VX690T-FFG1761 芯片&#xff0c;支持PCIeX8、两组 64bit DDR3容量8GByte&#xff0c;HPC的FMC连接器&#xff0c;板卡支持各种FMC子卡扩展。软件支持windows&#xff0c;Linux操作系统。 二、功能和技术指标&#xff1a; 板卡功…

Getx学习笔记之中间件鉴权

目录 前言 一、实现步骤 1.添加依赖 2.创建鉴权中间件 3.定义路由 4.设置初始路由 5.模拟登陆状态 二、Getx鉴权步骤总结 三、本文demo示例 四、参考文章 前言 在 Flutter 中&#xff0c;使用 GetX 可以很方便地实现中间件鉴权&#xff08;Authentication&#xff09…

MySQL生产环境迁移至YashanDB数据库深度体验

前言 首届YashanDB「迁移体验官」开放后&#xff0c;陆续收到「体验官」们的投稿&#xff0c;小崖在此把优秀的投稿文章分享给大家~今天分享的用户文章是《MySQL生产环境迁移至YashanDB数据库深度体验》&#xff08;作者&#xff1a;呆呆的私房菜&#xff09;&#xff0c;满满…

Python简化命令行界面库之fire使用详解

概要 在开发命令行工具时,开发者通常需要编写大量代码来解析命令行参数,这既耗时又容易出错。Python Fire 是 Google 开源的一个库,旨在简化命令行界面的开发。它可以将任何 Python 对象自动生成一个命令行界面,从而大大减少了开发时间和代码复杂度。本文将详细介绍 Pytho…

Elasticsearch基础(五):使用Kibana Discover探索数据

文章目录 使用Kibana Discover探索数据 一、添加样例数据 二、数据筛选 使用Kibana Discover探索数据 一、添加样例数据 登录Kibana。在Kibana主页的通过添加集成开始使用区域&#xff0c;单击试用样例数据。 在更多添加数据的方式页面下方&#xff0c;单击其他样例数据集…

Vscode+Pyside6开发之虚拟环境配置以及错误解决

Pyside开发之虚拟环境配置以及错误解决 开发环境一、项目创建以及虚拟环境设置1.创建项目2. 新建py文件,新建虚拟环境3.激活虚拟环境二、项目位置改变pip命令报错1.删除原来的虚拟环境2. 产生包列表文件requirements.txt3.重新创建虚拟环境4.重新安装包文件5.其他错误开发环境…

Notepad++换安装路径之后,右键打开方式报错:Windows无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。的处理方法

把Notepad添加到右键打开方式&#xff0c;可以参考下面的3篇文章添加&#xff1a; https://blog.csdn.net/xiaoerbuyu1233/article/details/88287747 https://blog.csdn.net/qq_44000337/article/details/120277317 https://www.cnblogs.com/zhrngM/p/12899026.html 这里主要是…

谷歌浏览器自动填充密码时,el-input样式错乱

使用到谷歌浏览器的记忆功能&#xff0c;选择的内容为浏览器保存的内容时 会导致element-plus的el-input样式改变 只需要增加一个css样式&#xff0c;就可以解决问题 :deep .el-input__inner {box-shadow: 0 0 0 1000px #fff inset; }修改后

上位机图像处理和嵌入式模块部署(香橙派AI Pro开发板试用)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 和工控机相比较,linux嵌入式开发板使用上面方便很多、也容易很多。很多的第三方库都可以通过yum、apt-get这样的方法直接下载到,不需要自己通过源代码重新进行编译、安装。因为自…

Java基础知识之 使用 Cleaner 替代 finalize

Object.finalize 方法 在 Java 中&#xff0c;一个对象如果不再使用&#xff0c;那么它就会在 JVM 垃圾回收时&#xff0c;进行析构释放该对象占用的内存空间。但如果这个对象持有了一些其他需要进行额外处理的资源&#xff08;非堆内存资源&#xff09;&#xff0c;那么就得考…

SSR理解(vite与nuxt比较)

一、SSR的概念与理解(什么是SSR&#xff1f;) 定义:SSR是指在服务器端完成页面的渲染工作&#xff0c;将最终生成的HTML内容发送给浏览器。 简单来说&#xff0c;就是在服务器端将网页内容渲染成HTML&#xff0c;然后将这个渲染好的HTML发送到客户端&#xff0c;也就是我们的…