一篇文章告诉你页面是如何显示的

页面显示 = 文档流 + 页面布局(弹性、浮动...) + 盒模型(标准、怪异) + 离开文档流(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盒子由内到外包含:

  1. 内容区(Content)​ :由widthheight定义
  2. 内边距(Padding)​:内容与边框之间的空间
  3. 边框(Border)​:盒子的边界线
  4. 外边距(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(块级格式化上下文)
  • 使用borderpadding分隔元素

5.2 盒子尺寸计算不一致

问题 :不同浏览器对box-sizing的默认值可能不同。

解决方案

css 复制代码
css
复制
/* 重置所有元素的盒子模型 */
*, *::before, *::after {
  box-sizing: border-box;
}

5.3 浮动元素导致父容器高度塌陷

解决方案

css 复制代码
.clearfix::after {
  content: "";
  display: table;
  clear: both;
}

六、总结与最佳实践

  1. 始终设置box-sizing: border-box:使尺寸计算更直观

  2. 理解文档流:这是所有布局技术的基础

  3. 合理选择布局方式

    • 简单一维布局:Flexbox
    • 复杂二维布局:Grid
    • 传统布局:Float + Clearfix
  4. 注意浏览器兼容性:使用autoprefixer等工具处理前缀

  5. 移动优先:从小屏幕开始设计,逐步增强

相关推荐
Code季风16 分钟前
Gin 框架中的模板引擎使用指南
服务器·前端·gin
狼性书生2 小时前
uniapp实现的圆形滚盘组件模板
前端·uni-app·vue·组件
芥子沫7 小时前
VSCode添加Python、Java注释技巧、模板
开发语言·前端·javascript
cos7 小时前
FE Bits 前端周周谈 Vol.2|V8 提速 JSON.stringify 2x,Vite 周下载首超 Webpack
前端·javascript·css
wfsm8 小时前
pdf预览Vue-PDF-Embed
前端
wangbing11258 小时前
界面规范的其他框架实现-列表-layui实现
前端·javascript·layui
Hurry69 小时前
web应用服务器tomcat
java·前端·tomcat
烛阴9 小时前
Sin -- 重复的、流动的波浪
前端·webgl
北'辰11 小时前
DeepSeek智能考试系统智能体
前端·后端·架构·开源·github·deepseek
前端历劫之路12 小时前
🔥 1.30 分!我的 JS 库 Mettle.js 杀入全球性能榜,紧追 Vue
前端·javascript·vue.js