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

页面显示 = 文档流 + 页面布局(弹性、浮动...) + 盒模型(标准、怪异) + 离开文档流(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)​ :由width和height定义
  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(块级格式化上下文)
  • 使用border或padding分隔元素

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. ​移动优先:从小屏幕开始设计,逐步增强

相关推荐
郑州光合科技余经理5 分钟前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆66642 分钟前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)1 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan2 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_2 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒2 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技3 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu3 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
weixin_448290254 小时前
书庐开发实战教学
javascript·css·html
默_笙4 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript