文档流是 CSS 中最基础的布局方式,也是所有元素的默认布局方式。理解文档流对于掌握 CSS 布局至关重要。
文档流是指元素按照其在 HTML 中出现的顺序,从上到下、从左到右自然排列的方式。在文档流中,块级元素独占一行,行内元素在同一行内排列。
块级元素在文档流中独占一行,宽度默认为父元素的 100%,可以设置宽度和高度。
/* 块级元素 */
.block {
display: block;
width: 100%;
height: 100px;
background: #3498db;
}
块级元素按照在 HTML 中出现的顺序,从上到下垂直排列。
<div class="block1">块级元素 1</div>
<div class="block2">块级元素 2</div>
<div class="block3">块级元素 3</div>
.block1 {
background: #3498db;
height: 100px;
}
.block2 {
background: #e74c3c;
height: 100px;
}
.block3 {
background: #2ecc71;
height: 100px;
}
<div><p><h1> 到 <h6><ul> 和 <ol><li><table><form><header><footer><section><article>行内元素在文档流中不独占一行,宽度由内容决定,不能设置宽度和高度。
/* 行内元素 */
.inline {
display: inline;
background: #e74c3c;
color: white;
}
行内元素按照在 HTML 中出现的顺序,在同一行内从左到右排列。如果一行放不下,会自动换行。
<span class="inline1">行内元素 1</span>
<span class="inline2">行内元素 2</span>
<span class="inline3">行内元素 3</span>
.inline1 {
background: #3498db;
color: white;
}
.inline2 {
background: #e74c3c;
color: white;
}
.inline3 {
background: #2ecc71;
color: white;
}
<span><a><strong><em><img><input><button><label><select><textarea>行内块元素既有块级元素的特性,又有行内元素的特性。它们不独占一行,但可以设置宽度和高度。
/* 行内块元素 */
.inline-block {
display: inline-block;
width: 100px;
height: 100px;
background: #2ecc71;
margin: 10px;
}
行内块元素在同一行内排列,但可以设置宽度和高度。
<div class="inline-block1">行内块元素 1</div>
<div class="inline-block2">行内块元素 2</div>
<div class="inline-block3">行内块元素 3</div>
.inline-block1 {
display: inline-block;
width: 100px;
height: 100px;
background: #3498db;
margin: 10px;
}
.inline-block2 {
display: inline-block;
width: 100px;
height: 100px;
background: #e74c3c;
margin: 10px;
}
.inline-block3 {
display: inline-block;
width: 100px;
height: 100px;
background: #2ecc71;
margin: 10px;
}
/* 将块级元素改为行内元素 */
.block-to-inline {
display: inline;
}
/* 将行内元素改为块级元素 */
.inline-to-block {
display: block;
}
/* 将元素改为行内块元素 */
.to-inline-block {
display: inline-block;
}
/* 使用浮动改变文档流 */
.float-left {
float: left;
width: 200px;
height: 100px;
background: #3498db;
}
.float-right {
float: right;
width: 200px;
height: 100px;
background: #e74c3c;
}
/* 使用定位改变文档流 */
.absolute {
position: absolute;
top: 20px;
left: 20px;
background: #2ecc71;
}
<header class="header">头部</header>
<nav class="nav">导航</nav>
<main class="main">主内容</main>
<aside class="sidebar">侧边栏</aside>
<footer class="footer">底部</footer>
/* 页面结构 */
.header {
display: block;
width: 100%;
height: 60px;
background: #333;
}
.nav {
display: block;
width: 100%;
height: 40px;
background: #555;
}
.main {
display: block;
width: 70%;
min-height: 400px;
background: #f5f5f5;
float: left;
}
.sidebar {
display: block;
width: 30%;
min-height: 400px;
background: #e9ecef;
float: right;
}
.footer {
display: block;
width: 100%;
height: 40px;
background: #2c3e50;
clear: both;
}
<p>
这是一段<span class="highlight">重要的</span>文本内容。
行内元素可以在<span class="emphasis">同一行</span>内排列。
</p>
/* 文本内容 */
p {
line-height: 1.6;
margin-bottom: 15px;
}
.highlight {
background: #fff3cd;
padding: 2px 5px;
}
.emphasis {
font-weight: bold;
color: #007bff;
}
<div class="button-group">
<button class="button">按钮 1</button>
<button class="button">按钮 2</button>
<button class="button">按钮 3</button>
</div>
/* 按钮组 */
.button-group {
font-size: 0; /* 消除空白字符 */
}
.button {
display: inline-block;
font-size: 16px;
padding: 10px 20px;
margin-right: 5px;
background: #007bff;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
.button:last-child {
margin-right: 0;
}
<!-- 推荐 - 使用语义化的 HTML -->
<header class="header">头部</header>
<nav class="nav">导航</nav>
<main class="main">主内容</main>
<footer class="footer">底部</footer>
<!-- 不推荐 - 全部使用 div -->
<div class="header">头部</div>
<div class="nav">导航</div>
<div class="main">主内容</div>
<div class="footer">底部</div>
/* 推荐 - 合理使用块级元素和行内元素 */
.container {
display: block;
}
.icon {
display: inline-block;
}
/* 不推荐 - 滥用 display 属性 */
.block {
display: inline-block; /* 应该使用 block */
}
/* 问题 - 行内块元素之间的空白字符 */
.container {
font-size: 0; /* 解决方法 1 */
}
.element {
display: inline-block;
font-size: 16px;
}
/* 解决方法 2 - 使用浮动 */
.element {
float: left;
}
文档流是 CSS 中最基础的布局方式:
记住以下几点: