基础概念✅
什么是CSS盒模型?
答案
CSS盒模型用于描述文档树中元素生成的矩形框,并根据视觉格式化模型进行布局。它定义了每个元素的内容区、内边距、边框和外边距,决定了页面元素的实际显示和排列方式。 盒模型的结构如下
- 内容盒(Content Box)
- 包含元素的实际内容,如文本或图像。
- 通过
width
和height
等属性设置。
- 内边距(Padding Box)
- 包围内容盒的空间,用于增加内容与边框之间的距离。
- 通过
padding
等属性设置。
- 边框(Border Box)
- 包围内边距盒的线条,用于定义元素的边界。
- 通过
border
等属性设置。
- 外边距(Margin Box)
- 包围边框盒的空间,用于增加元素与其他元素之间的距离。
- 通过
margin
等属性设置。
参考 google css 盒模型讲解 初学者可以把盒模型理解为相框。
- 内容盒就是照片本身
- 内边距盒 照片+相框之间的空间
- 边框盒就是整个相框
- 外边距盒就是相框+其他物体之间的空间
这种关联方式就能更好地理解为什么边距可以合并,outline 不会影响盒模型的大小等概念。
可以通过 box-sizing
属性来控制盒模型的计算方式。
-
content-box
(默认):width
和height
只包含内容区域。 -
border-box
:width
和height
包含内容、内边距和边框。一般推荐使用这种方式,行为更可控,在代理样式重置中,会采用如下方式重置*,
*::before,
*::after {
box-sizing: border-box;
}
延伸阅读
- CSS2.2 盒模型 规范中盒模型的详细描述
- MDN 盒模型 MDN 对盒模型的讲解
- Box Model google learn css 教程对盒模型的讲解
什么是视觉格式化模型(View formatting model) ?
答案
视觉格式化模型(View formatting model) 定义了用户代理(一般为浏览器)如何在可视化设备(电脑、手机、打印机等)上渲染文档树。简单理解可以认为,盒模型定义单个元素的渲染行为,视觉格式化模型则定义了整个文档树如何铺排和渲染的机制。核心概念包括
- 通过
display
属性控制盒模型的生成常见的盒类型包括 - 格式化模型存在三种定位策略(position schemes) 控制元素如何铺排
- 正常流(Normal Flow)
- 块级格式化上下文(Block formatting context BFC) 内容垂直堆叠,同一个块级上下文内部的垂直 margin 会出现合并
- 内联格式化上下文(Inline formatting context IFC) 内容水平堆叠, 注意铺排方式还和 writing-mode 属性相关
- 相对定位(Relative positioning) 内容会在正常流布局的基础上发生偏移,但是原始盒模型不会改动,所以可能出现显示重叠现象
- 浮动布局(Float) 元素会相对正常流对应的包含块边缘对齐
- 绝对定位(Absolute position) 元素会脱离正常流,相对关联的包含块对齐
- 正常流(Normal Flow)
此外视觉格式化模型会受书写方式的影响,来决定内联盒和块级盒的铺排方式,具体可以参考 Writing Modes
延伸阅读
- 规范视觉格式化模型 规范说明
- Visual formatting model
- Blink Layout 讲解 blink 的layout 机制
- chromium layout chrome 实现布局中的说明
什么是 BFC 有哪些作用?
答案
块级格式化上下文(Block formatting context BFC) 是属于格式化模型(View formatting model) 中,正常流布局(Normal flow)的一种。
BFC 的核心特性
- 包含浮动元素:BFC 会包含其内部的所有浮动元素,解决高度塌陷问题
- 阻止外边距合并:BFC 内的外边距不会与外部元素的外边距合并
- 阻止文字环绕:BFC 会阻止浮动元素与 BFC 内的文字重叠
- 独立布局:BFC 内的元素布局不受外部影响
对于块级格式上下文内布局规则如下
- 盒子从块级格式化上下文的顶层包含块从上到下垂直堆叠
- 对于相邻的盒子,垂直 margin 会出现折叠
- 块级格式化上下文的盒子会相对包含块左对齐(注意对于
direction: rtl
则右对齐)
如下方式会产生块级格式化上下文:
- 文档的根元素(
<html>
) display: flow-root
的元素(推荐使用)- 浮动元素(
float
属性不为none
的元素) - 绝对定位元素(
position
属性为absolute
或fixed
的元素) - 行内块元素(
display: inline-block
的元素) - 表格单元格(
display: table-cell
的元素,HTML 表格单元格默认如此) - 表格标题(
display: table-caption
的元素,HTML 表格标题默认如此) - 由
display: table
、table-row
、table-row-group
、table-header-group
、table-footer-group
或inline-table
的元素隐式创建的匿名表格单元格 overflow
属性值不是visible
或clip
的块级元素<button>
元素和默认display: flow-root
的按钮类型<input>
元素contain
属性为layout
、content
或paint
的元素- 弹性盒子项目(
display: flex
或inline-flex
的直接子元素) - 网格项目(
display: grid
或inline-grid
的直接子元素) - 多列容器(
column-count
或column-width
不为auto
的元素) column-span: all
的元素
示例说明
- 清除浮动
- 阻止外边距合并
- 阻止文字环绕
注意 BFC 阻止外边距合并只针对内部元素,如果创建的新 BFC 自身有 margin 无法阻止合并,示例如下
延伸阅读
- Block formatting contexts 规范对块级格式化上下文说明
- MDN 块级格式化上下文说明
- CSS深入理解流体特性和BFC特性下多栏自适应布局 张鑫旭对 BFC 的说明
- Block Layout chrome 对实现块级格式化上下文的说明
什么是 IFC 和 BFC 有哪些区别?
答案
内联格式化上下文(Inline Formatting Context IFC) 是视觉格式化模型中的一种布局模式,用于处理内联元素的排列。与 BFC 不同,IFC 主要处理水平方向的布局。
IFC 的核心特性:
- 水平排列:IFC 内的元素按照水平方向从左到右排列(在 LTR 语言环境下)
- 基线对齐:内联元素默认按照基线对齐,可以通过
vertical-align
属性调整 - 行框(Line Box):IFC 会创建行框来包含每一行的内联元素
- 自动换行:当内容超出容器宽度时,会自动换行创建新的行框
IFC 的布局规则:
- 内联元素在 IFC 中水平排列,从包含块的顶部开始
- 行框的高度由该行内最高元素的高度决定
- 内联元素的垂直对齐通过
vertical-align
属性控制 - 当内联元素包含块级元素时,会创建匿名块级盒
IFC 与 BFC 的主要是 IFC 主要用于文本内容的排版,如段落、标题等。 BFC 用于块级布局。
示例说明
- 行框高度
- 垂直对齐
- 水平对齐
延伸阅读
- Inline formatting contexts 规范对内联格式化上下文的说明
- MDN 内联格式化上下文 MDN 对 IFC 的详细说明
- LayoutNG Inline Layout chrome 浏览器对内联布局的实现说明
- CSS 行高与行框 张鑫旭对行框和垂直对齐的深入解析
什么是 Cascade?
答案
层叠(cascade) 用来处理一个元素的 css 属性上匹配多条规则时,如何计算最终的属性值。这最终通过层叠计算出来的属性值叫做层叠值(cascaded value)。
核心规则如下
- 默认顺序,从低到高
- 用户代理设置的默认样式
- 用户设置的默认样式,通过插件或者配置实现
@layer
规则- 开发者设置的样式
内联样式 > ID 选择器 > 类属性选择器 > 标签选择器 > 通配符
- 选择器优先级相同,则后面的样式覆盖前面的
- 如果设置了 !important 会导致优先级权重提升,但是和默认顺序相反即从低到高依次为
!important
开发者设置样式!important
@layer
规则!important
用户设置样式!important
代理设置样式
延伸阅读
- Cascading 规范中定义的层叠章节
- CSS必学基础:理解CSS中的级联规则 张鑫旭说明 CSS 层叠规则
什么是层叠上下文(Stacking Context)?
答案
层叠上下文(Stacking Contexts) 决定了文档树中的元素在可视化设备上的叠放规则,可以类比为 PhotoShop 中图层堆叠的概念。默认层叠上下文的核心包括
- 正常流布局中,同级元素层叠优先级,靠后的元素高于靠前的元素,不同级的子元素层叠规则由最终同级的父元素决定。这也是为什么单纯设置某个子元素的 z-index 不生效的原因,因为同级的父元素可能层叠靠前导致无法覆盖后面的元素
- 对于
position
不等于 static 值的定位元素,z-index
的值越大层叠越靠上。注意对于flex、grid
这些容器的子元素不依赖 position 限制,可以直接设置z-index
控制层叠 - 如下方式会创建层叠上下文
- 文档根元素
<html>
- position 值为 absolute(绝对定位)或 relative(相对定位)且 z-index 值不为 auto 的元素;
- position 值为 fixed(固定定位)或 sticky(粘滞定位)的元素(沾滞定位适配所有移动设备上的浏览器,但老的桌面浏览器不支持);
- flex (flex) 容器的子元素,且 z-index 值不为 auto;
- grid (grid) 容器的子元素,且 z-index 值不为 auto;
- opacity 属性值小于 1 的元素(参见 the specification for opacity);
- mix-blend-mode 属性值不为 normal 的元素;
- 以下任意属性值不为 none 的元素:
- transform
- filter
- backdrop-filter
- perspective
- clip-path
- mask / mask-image / mask-border
- isolation 属性值为 isolate 的元素;
- will-change 值设定了任一属性而该属性在 non-initial 值时会创建层叠上下文的元素(参考这篇文章);
- contain 属性值为 layout、paint 或包含它们其中之一的合成值(比如 contain: strict、contain: content)的元素。
- 文档根元素
延伸阅读
- 规范描述层叠上下文
- MDN 层叠上下文
- Z-index and stacking contexts google learn css 讲解层叠上下文
- 深入理解CSS中的层叠上下文和层叠顺序
什么是逻辑属性和逻辑值?
答案
CSS 利用 逻辑属性 解决由于书写方向和模式改变,导致的非预期的渲染错误。
浏览器在实际布局(Layout)和绘制(Painting) 阶段依赖坐标系确认布局位置和绘制顺序,参考 Coordinate Spaces chromium 对坐标体系的说明
- 物理坐标(Physical coordinates):对应于输出设备的物理方向(如屏幕、打印页面)。通常用于绘制,因此布局逻辑在传递给绘制阶段时可能会产生这种空间的值。CSS 属性如
top
、right
、bottom
、left
就属于物理坐标空间。 - 逻辑坐标(Logical coordinates):用于布局,支持根据
writing-mode
和direction
CSS 属性的不同值进行通用定位。以before
、after
、start
或end
命名的属性属于逻辑坐标空间。 - 不考虑内联方向翻转的逻辑坐标:即“逻辑块坐标(logical block coordinates)”,不考虑文本方向。比如 “LogicalLeft” 和 “LogicalRight” 就是这类坐标的例子。
常规属性均采用物理坐标系,这会导致在在通过 writing-mode
等改变书写模式后影响常规元素的铺排示例如下
- block-size
- padding-block-start
延伸阅读
- CSS Logical Properties and Values Level 1 logic 属性和逻辑值规范
- CSS 逻辑属性与逻辑值 MDN 详细列举了逻辑属性和逻辑值
- Logical layout enhancements with flow-relative shorthands Google 逻辑属性说明
什么是书写模式(writing-mode),有什么作用?
答案
默认浏览器采用由上到下、从左到右的书写模式(writing-mode),但是对于一些语言如阿拉伯语、日语等,书写模式会有所不同。所以浏览器定义了 Writing Modes Level 规范来处理不同书写模式的问题。核心的属性包括
writing-mode
:定义书写模式,决定了块级元素的排列方式,常用值,支持horizontal-tb
(水平从上到下)、vertical-rl
(垂直从右到左)direction
:定义文本方向,决定了内联块的排列顺序,常用值,支持ltr
(从左到右)、rtl
(从右到左)
例如如下配置
writing-mode: vertical-rl
决定了块的铺排是垂直方向从右到左direction: ltr
决定了内联盒的排列是从左到右
writing-mode: vertical-rl; direction: ltr:
'top' / 'start' side
block-flow direction
<------------------------------------ |
------------------------------------- |
| c | s | |
'left' | o | o | | inline 'right'
/ | n | m | | direction /
'after' | t | e | | 'before'
side | e | | | side
| n | | |
| t | | |
------------------------------------- v
'bottom' / 'end' side
什么是响应式设计?如何实现?
答案
核心概念
响应式设计是一种网页设计方法,使网站能够自动适应不同设备和屏幕尺寸,提供最佳的用户体验。其核心思想是"一套代码,多端适配"。
实现方法
-
媒体查询(Media Queries)
- 根据设备特性应用不同的样式
- 常用的断点:手机
(<768px)
、平板(768px-1024px)
、桌面(>1024px)
-
弹性布局(Flexbox/Grid)
- 使用相对单位而非固定像素
- 容器能够根据内容自动调整
-
相对单位
- 使用 rem、em、%、vw/vh 等相对单位
- 避免使用固定像素值
-
图片适配
- 使用 max-width: 100% 确保图片不溢出容器
- 使用 srcset 和 sizes 属性提供不同尺寸的图片
示例说明
延伸阅读
什么是视口(Viewport)?如何设置?
答案
核心概念
视口是浏览器中用于显示网页的区域。在移动设备上,视口的概念尤为重要,因为移动设备的屏幕尺寸与桌面不同,需要特殊的处理来确保网页正确显示。
视口类型
-
布局视口(Layout Viewport)
- 浏览器默认的视口大小
- 通常是 980px 宽度(桌面浏览器标准)
-
视觉视口(Visual Viewport)
- 用户实际看到的视口区域
- 会随着用户缩放而改变
-
理想视口(Ideal Viewport)
- 设备屏幕的物理像素宽度
- 通过 meta viewport 标签设置
设置方法
<!-- 基本设置 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 详细设置 -->
<meta name="viewport" content="
width=device-width,
initial-scale=1.0,
minimum-scale=1.0,
maximum-scale=5.0,
user-scalable=yes
">
参数说明
参数 | 说明 | 示例 |
---|---|---|
width | 视口宽度 | device-width(设备宽度) |
initial-scale | 初始缩放比例 | 1.0(不缩放) |
minimum-scale | 最小缩放比例 | 0.5 |
maximum-scale | 最大缩放比例 | 5.0 |
user-scalable | 是否允许用户缩放 | yes/no |
常见问题
-
移动端字体过小
/* 设置最小字体大小 */
body {
font-size: 16px;
} -
触摸目标过小
/* 确保触摸目标足够大 */
.button {
min-height: 44px;
min-width: 44px;
} -
横屏适配
@media (orientation: landscape) {
.container {
flex-direction: row;
}
}
延伸阅读