文档流:网页布局的“自然法则”
河水从高处流向低处,遇到石头会自然地绕过去。网页布局中的文档流就像这条河流,元素按照一定的顺序自然排列。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>文档流与盒模型</title>
</head>
<body>
<div style="background-color: lightblue; height: 50px; margin: 10px;">块级元素1</div>
<div style="background-color: lightgreen; height: 50px; margin: 10px;">块级元素2</div>
<span style="background-color: pink; padding: 5px;">行内元素1</span>
<span style="background-color: yellow; padding: 5px;">行内元素2</span>
</body>
</html>
- 块级元素(如
<div>):默认情况下,块级元素会垂直向下排列,每个块级元素占据一行。 - 行内元素(如
<span>):行内元素则像小鱼一样水平排列,不会独占一行。
盒模型:网页的“房间设计图”
盒模型是网页布局中的另一个重要概念,它定义了元素的布局方式,包括内容区域、内边距、边框和外边距。
.box {
width: 200px; /* 房间大小 */
padding: 10px; /* 家具区(内容+墙) */
border: 5px solid red; /* 墙体厚度 */
margin: 20px; /* 花园(外边距) */
}
两种盒模型的计算方式
- 标准盒模型(
content-box):默认模式,width和height仅指内容区域的宽度和高度,内边距和边框会额外增加。 - 怪异盒模型(
border-box):智能模式,width和height包括内容区域、内边距和边框的总宽度和高度。
.box {
box-sizing: content-box; /* 默认模式 */
width: 200px;
padding: 5px;
border: 2px solid代码实战
### 核心代码解析
```html
<div class="box"></div>
.box {
box-sizing: content-box; /* 默认模式 */
width: 200px;
padding: 5px;
border: 2px solid red;
}
脱离文档流
.inner {
position: absolute; /* 施展“消失术” */
top: 0; left: 0;
}
Flex布局
main {
display: flex; /* 开启“弹性模式” */
}
完整代码解析与页面展示
1.html 完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>盒模型</title>
<style>
/* css reset */
* {
margin: 0;
padding: 0;
}
body {
display: flex;
flex-direction: column;
height: 100vh;
}
.box {
/* display 可以去切换盒子的能力
box-sizing 可以去设定盒子的
计算方案
默认值是content-box wxh 指定的是内容的大小 标准盒模型
border-box wxh 包含了border 以内的大小 怪异盒(IE)模型
*/
box-sizing: content-box;
width: 200px;
height: 200px;
background-color: green;
margin: 10px;
padding: 5px;
border: 2px solid yellow;
}
.flex {
display: flex;
}
main {
flex: 1;
position: relative;
}
.inner {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 100px;
background-color: pink;
border-radius: 50%; /*脱离了文档流*/
}
.container {
flex: 1;
overflow: scroll;
}
header, footer {
height: 44px;
background-color: red;
text-align: center;
}
footer {
display: flex; /*开启了新的格式化上下文 */
align-items: center;
justify-content: center;
}
.more {
position: absolute;
width: 50px;
height: 50px;
background-color: yellow;
top: 50%;
left: 50%;
/* transform: translate(-50%,-50%); */
margin-left: -25px;
margin-top: -25px;
}
</style>
</head>
<body>
<header>
<h1>盒模型</h1>
</header>
<div class="container">
<div class="row flex">
<aside class="box"></aside>
<main class="box">
<div class="inner" style="z-index:999;"></div>
<div style="position:absolute;width:100px;height:100px;background:black;">1+2+3</div>
<div style="width:100px;height:100px;background:black;">1+2+3</div>
</main>
<aside class="box"></aside>
</div>
<div class="row flex">...
</div>
<div class="row flex">...
</div>
<div class="row flex">...
</div>
<div class="row flex">...
</div>
<div class="row flex">...
</div>
<div class="row flex">...
</div>
</div>
<footer>
<p>盒模型</p>
</footer>
<div class="more"></div>
</body>
</html>
整体结构与布局逻辑
页面框架:通过body的flex布局(flex-direction: column ),将页面垂直切分为 header(顶栏)、container(滚动内容区)、footer(底栏),利用height: 100vh让页面占满视口高度,container 借 flex: 1 填充剩余空间。
滚动容器:container 设 overflow: scroll ,内容超出时触发滚动,承载多行 .row 结构。
盒模型与布局组件
.box 元素:作为基础容器,用 box-sizing: content-box 遵循标准盒模型(宽高仅含内容,边框、内边距额外计算 ),通过 width/height 定内容尺寸,搭配 margin(外间距)、padding(内间距)、border(边框)控制盒模型空间。
.flex 布局:给 .row 加 display: flex ,让内部 3 个 .box 水平排列,快速实现多行三列布局。
定位与特殊效果
绝对定位(.inner):position: absolute 使其脱离文档流,基于最近定位父级(main )的 top: 0、left: 0 定位到左上角,border-radius: 50% 实现圆形样式。
居中技巧(.more):用 top: 50%、left: 50% 先让元素左上角居中,再借 margin 负偏移(自身宽高一半),让元素中心点精确居中。
样式与细节补充
顶栏/底栏:header、footer 固定 height: 44px ,
footer 用 flex 布局(align-items + justify-content )让内部文字水平垂直居中。
层级控制:.inner 设 z-index: 999 提升层级,确保覆盖其他元素,实现“彩蛋”叠层效果。
2.html 完整代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
position: relative;
width: 200px;
height: 200px;
z-index: 1;
}
.box1, .box2 {
position: absolute;
width: 100px;
height: 100px;
}
.box1 {
background-color: pink;
top: 10px;
left: 10px;
}
.box2 {
background-color: skyblue;
top: 20px;
left: 20px;
z-index: 9999;
}
.box3 {
position: absolute;
top: 50px;
left: 50px;
background-color: green;
width: 120px;
height: 120px;
z-index: 2;
}
</style>
</head>
<body>
<div class="box">
<div class="box1"></div>
<div class="box2"></div>
</div>
<div class="box3"></div>
</body>
</html>
以200×200像素的.box为容器,内部两个方块通过绝对定位叠放
- 粉色方块
.box1距容器左上角10px - 蓝色方块
.box2距容器左上角20px(因z-index更高,覆盖粉色方块) - 外部绿色方块
.box3通过绝对定位距页面左上角50px - 层级高于
.box容器(z-index:1) - 层级低于.box2(z-index:9999),被蓝色方块覆盖,仅显示在容器和粉色方块上方
结论:相对定位容器为绝对定位子元素提供坐标参考
z-index数值决定元素重叠时的显示优先级(数值大的覆盖数值小的)- 绝对定位元素脱离文档流,适用于浮层、弹窗等独立定位场景
🛠实战应用:如何用盒模型设计响应式布局
场景
设计一个手机端导航栏(顶部Header + 中间内容 + 底部Footer)
/* 响应式导航栏样式 */
nav {
box-sizing: border-box;
width: 100%;
padding: 10px;
background-color: #333;
color: white;
}
.content {
box-sizing: border-box;
width: 100%;
padding: 20px;
}
关键点解析
- 盒模型核心配置
- 采用
box-sizing: border-box,使内边距和边框计入元素总宽度,避免响应式布局中因尺寸计算导致的布局偏移。 - 导航栏与内容区设
width: 100%,确保撑满父容器宽度,适配移动端屏幕。
- 顶部导航栏(Header)设计
- 用 Flex 布局实现左右内容(Logo 和菜单按钮)的自适应排列,通过
justify-content: space-between使元素左右两端对齐。 - 导航栏高度设为 50px,按钮点击区域符合移动端触摸友好标准(≥44px),避免误触。
- 添加阴影效果增强导航栏立体感,提升视觉层次。
- 底部功能栏(Footer)设计
- 用固定定位(
position: fixed+bottom: 0)使底部栏始终固定在屏幕底部,不随内容滚动。 - 采用 Flex 布局实现图标按钮等间距排列(
justify-content: space-around),适配不同数量的导航项。 - 通过颜色切换(如选中状态高亮)明确用户当前操作区域,提升交互体验。
- 内容区响应式适配
- 动态计算内容区高度:
min-height: calc(100vh - 顶部高度 - 底部高度),确保内容在导航栏与底部栏之间完整显示。 - 利用媒体查询(
@media)区分移动端与平板/桌面端:桌面端取消底部栏固定定位,调整内边距提升内容可读性。
- 交互体验优化
- 导航栏按钮采用透明背景 + 点击反馈,底部图标搭配文字说明,增强操作指引性。
- 内容区设置
overflow-y: auto,避免长内容溢出导致布局错乱,同时保留滚动交互。
总结
- 文档流 = 元素默认排列规则(块级垂直、行内水平)
- 盒模型 = 元素空间构成(内容 + 内边距 + 边框 + 外边距 )
box-sizing= 尺寸计算模式(content-box内容算,border-box含边框内边距 )position:absolute= 脱离默认排列的“脱离术”