页面显示 = 文档流 + 页面布局(弹性、浮动...) + 盒模型(标准、怪异) + 离开文档流(position)
一、文档流:网页的自然布局方式
文档流(Normal Flow)是浏览器默认的HTML元素排列方式,就像水流一样自然地填充容器。
1.1 文档流的基本特性
-
块级元素:从上到下垂直排列,默认占据整行宽度
css<div>块级元素1</div> <div>块级元素2</div>
-
行内元素:从左到右水平排列,直到填满容器宽度后换行
css<span>行内元素1</span> <span>行内元素2</span>
1.2 DOCTYPE
<!DOCTYPE html>
声明决定了浏览器使用何种渲染模式。它确保浏览器按照标准模式解析文档流.
二、盒子模型
在HTML中,每个元素都被视为一个矩形盒子,这个盒子由多个部分组成。
2.1 盒子的组成结构
一个完整的CSS盒子由内到外包含:
- 内容区(Content) :由
width
和height
定义 - 内边距(Padding):内容与边框之间的空间
- 边框(Border):盒子的边界线
- 外边距(Margin):盒子与其他元素之间的透明区域
css
.box {
width: 200px; /* 内容宽度 */
height: 100px; /* 内容高度 */
padding: 20px; /* 内边距 */
border: 2px solid #000; /* 边框 */
margin: 10px; /* 外边距 */
}
2.2 两种盒子模型计算方式
标准盒子模型(content-box)
rust
.box {
box-sizing: content-box; /* 默认值 */
}
width/height
仅定义内容区大小- 总宽度 = width + padding + border + margin
- 总高度 = height + padding + border + margin
怪异盒子模型(border-box)
rust
.box {
box-sizing: border-box;
}
width/height
包含内容、内边距和边框- 总宽度 = width + margin
- 总高度 = height + margin
三、布局
3.1 弹性布局
css
.container {
display: flex; /* 弹性布局 */
}
.column {
flex: 1; /* 等分剩余空间 */
padding: 15px;
}
3.2 浮动布局
css
.float-left {
float: left;
width: 30%;
}
.clearfix::after {
content: "";
display: table;
clear: both;
}
3.3 定位与脱离文档流
css
.relative-box {
position: relative;
}
.absolute-box {
position: absolute;
top: 10px;
left: 10px;
}
.fixed-box {
position: fixed;
bottom: 20px;
right: 20px;
}
四、实际应用案例
4.1 响应式卡片布局
ini
<div class="card-container">
<div class="card">卡片1</div>
<div class="card">卡片2</div>
<div class="card">卡片3</div>
</div>
css
.card-container {
display: flex;
flex-wrap: wrap;
gap: 20px;
}
.card {
flex: 1 1 300px;
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}
4.2 圣杯布局实现
xml
<div class="holy-grail">
<header>头部</header>
<div class="content">
<main>主内容区</main>
<nav>导航</nav>
<aside>侧边栏</aside>
</div>
<footer>页脚</footer>
</div>
css
.holy-grail {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.content {
display: flex;
flex: 1;
}
main {
flex: 1;
padding: 20px;
}
nav, aside {
flex: 0 0 200px;
padding: 20px;
background: #f5f5f5;
}
header, footer {
padding: 15px;
background: #333;
color: white;
}
五、常见问题与解决方案
5.1 外边距折叠(Margin Collapse)
现象:垂直相邻的两个块级元素的外边距会合并为单个外边距。
解决方案:
- 使用
padding
替代margin
- 创建新的BFC(块级格式化上下文)
- 使用
border
或padding
分隔元素
5.2 盒子尺寸计算不一致
问题 :不同浏览器对box-sizing
的默认值可能不同。
解决方案:
css
css
复制
/* 重置所有元素的盒子模型 */
*, *::before, *::after {
box-sizing: border-box;
}
5.3 浮动元素导致父容器高度塌陷
解决方案:
css
.clearfix::after {
content: "";
display: table;
clear: both;
}
六、总结与最佳实践
-
始终设置
box-sizing: border-box
:使尺寸计算更直观 -
理解文档流:这是所有布局技术的基础
-
合理选择布局方式:
- 简单一维布局:Flexbox
- 复杂二维布局:Grid
- 传统布局:Float + Clearfix
-
注意浏览器兼容性:使用autoprefixer等工具处理前缀
-
移动优先:从小屏幕开始设计,逐步增强