盒模型
使用
outline:1px solid red;
轮廓绘制在元素框之上,不影响元素大小和定位,被用来 debug只有普通文档流中
块元素
的垂直外边距才会发生外边距叠加。行内框,浮动框和绝对定位框之间的外边距不会叠加。inline
元素在一行上水平排列,只能设置行高,水平边框,水平padding
,水平margin
inline-block
也可以在一行上水平排列, 并且可以设置width,height,margin,padding
等
从上往下 可见内容为
border
content
padding
background-image
background-color
margin
标准文档流
块元素
每个块级元素都从新的一行开始,左右自动伸展,直到包含它的元素,,元素宽度在不设置的情况下,是它本身父容器的 100%,除非设定一个宽度。
块状元素的高度、宽度、行高以及顶和底边距都可设置
行内元素(内联元素)
本身没有宽度 , 它的宽度就是它包含的文字或图片的宽度,不可改变
和其他行内元素都在一行上
元素的高度、宽度及顶部和底部边距不可设置
内联块状元素
display:inline-block
和其他元素都在一行上
元素的高度、宽度、行高以及顶和底边距都可设置
<img>、<input>
就是内联块状元素
隐性改变 display 类型
有一个有趣的现象就是当为元素(不论之前是什么类型元素,display:none 除外)设置以下 2 个句之一position : absolute;
float : left;
元素会自动变为以 display:inline-block;
的方式显示,当然就可以设置元素的 width 和 height 了且默认宽度不占满父元素。
浮动 ⚠️ 使用场景已变化
现代建议: Float主要用于文字环绕图片,布局推荐使用CSS Grid或Flexbox
浮动框可以左右移动,直到外边缘碰到包含块或者另一个浮动框的边缘
浮动后的元素也脱离文档流,不占空间
可覆盖其他元素,
z-index
控制覆盖水平无法容纳水平浮动的所有元元素,则后面的元素继续向下浮动,并且可能会出现卡住现象。
inline
行框会围绕在浮动框的外边。
传统Float布局 (现在不推荐用于布局)
/* ❌ 过时的布局方式 - 复杂且容易出问题 */
.container { overflow: hidden; }
.left { float: left; width: 200px; }
.right { float: right; width: 200px; }
.main { margin: 0 220px; }
/* 清除浮动 */
.clear:after {
content: ".";
height: 0;
visibility: hidden;
display: block;
clear: both;
}
Float的现代使用场景
/* ✅ 文字环绕图片 - 依然推荐使用 */
.article img {
float: left;
margin: 0 20px 20px 0;
}
定位
相对定位
position:relative;
相对是相对与在原文档流中的位置
元素无论是否移动,元素仍然占据原来空间
它通过 left、right、top、bottom 属性确定元素在正常文档流中的偏移位置。相对定位完成的过程是首先按 static(float)方式生成一个元素(并且元素像层一样浮动了起来),然后相对于以前的位置移动,移动的方向和幅度由 left、right、top、bottom 属性确定。
绝对定位
position:absolute;
相对于距离最近的已定位的祖先元素
脱离文档流,元素不占据原来空间
绝对定位的元素可以覆盖页面上的其他元素,通过
z-index
控制叠放顺序
固定定位
position:fixed;
相当于绝对定位,相对于
视口
进行定位常用于固定导航栏、返回顶部按钮等
粘性定位 ✅ CSS新特性
position:sticky;
2018年后新增: 结合了relative和fixed的特性
/* 滚动吸附效果 - 现代导航栏常用 */
.navbar {
position: sticky;
top: 0;
z-index: 100;
}
特点:
元素在跨越指定阈值前为相对定位,之后为固定定位
常用于表格标题、导航栏等需要"吸附"效果的元素
必须指定 top, right, bottom 或 left 四个阈值其中之一
absolute 和 relative 配合使用
父元素设置为 relative,可偏移,也可不偏移。
子元素设置为 absolute,相对于上述父元素定位。
/* 经典的相对定位容器 + 绝对定位子元素 */
.container {
position: relative;
}
.tooltip {
position: absolute;
top: 100%;
left: 0;
}
现代CSS布局系统 🚀 2018年后主流
CSS Grid 布局 - 二维布局之王
最适合: 网页整体布局、复杂的二维布局
基础语法
.container {
display: grid;
grid-template-columns: 200px 1fr 200px; /* 左固定 中自适应 右固定 */
grid-template-rows: auto 1fr auto; /* 头尾自适应 中间填满 */
gap: 20px; /* 统一间距 */
}
经典Holy Grail布局 - 现代实现
/* ✅ 现代方案 - 简洁直观 */
.layout {
display: grid;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
grid-template-rows: auto 1fr auto;
min-height: 100vh;
gap: 16px;
}
.header { grid-area: header; }
.nav { grid-area: nav; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
/* 对比传统Float方案需要20+行CSS和clearfix hack */
响应式Grid布局
/* 自动响应式网格 */
.card-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
/* 媒体查询改变布局结构 */
@media (max-width: 768px) {
.layout {
grid-template-areas:
"header"
"nav"
"main"
"aside"
"footer";
grid-template-columns: 1fr;
}
}
Grid的优势
二维布局: 同时控制行和列
语义化:
grid-template-areas
直观描述布局自动对齐: 无需复杂的margin计算
响应式友好: 轻松改变布局结构
CSS Flexbox 布局 - 一维布局专家
最适合: 导航栏、按钮组、卡片排列等一维布局
基础语法
.container {
display: flex;
justify-content: space-between; /* 主轴对齐 */
align-items: center; /* 交叉轴对齐 */
gap: 16px; /* 元素间距 */
}
经典导航栏布局
/* ✅ 现代导航栏 - 一行搞定 */
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px;
}
.nav-links {
display: flex;
gap: 24px;
}
.user-actions {
display: flex;
gap: 8px;
}
完美垂直居中
/* ✅ 现代垂直居中 - 超级简单 */
.center {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
}
/* 对比传统方案需要transform、position等复杂计算 */
响应式卡片布局
/* 自适应卡片网格 */
.card-container {
display: flex;
flex-wrap: wrap; /* 允许换行 */
gap: 16px;
}
.card {
flex: 1 1 300px; /* 增长 收缩 基础宽度 */
/* 每个卡片最小300px,有空间时等比例增长 */
}
Flexbox核心概念
主轴(main axis): flex-direction决定的方向
交叉轴(cross axis): 垂直于主轴的方向
justify-content: 主轴对齐方式
align-items: 交叉轴对齐方式
flex:
grow shrink basis
的简写
布局方案选择指南
CSS Grid 适用场景
✅ 网页整体布局
✅ 复杂的二维布局
✅ 需要精确控制行列的场景
✅ 响应式布局结构变化
Flexbox 适用场景
✅ 导航栏、工具栏
✅ 按钮组、标签组
✅ 垂直居中对齐
✅ 一维方向的元素排列
Position 适用场景
✅ 弹窗、工具提示
✅ 固定导航栏
✅ 覆盖层、遮罩
✅ 精确定位的装饰元素
现代布局最佳实践
/* 推荐的组合使用方式 */
.page-layout {
/* Grid控制整体布局 */
display: grid;
grid-template-areas:
"header"
"main"
"footer";
grid-template-rows: auto 1fr auto;
min-height: 100vh;
}
.header {
/* Flexbox控制导航栏内部排列 */
display: flex;
justify-content: space-between;
align-items: center;
}
.tooltip {
/* Position处理精确定位 */
position: absolute;
top: 100%;
left: 50%;
transform: translateX(-50%);
}