[CSS 主流布局](#CSS 主流布局)
[一、标准流布局(Normal Flow)](#一、标准流布局(Normal Flow))
[1. 核心定义](#1. 核心定义)
[2. 核心思考问题及解决步骤](#2. 核心思考问题及解决步骤)
[3. 核心代码示例(导航栏 + 行内块排列)](#3. 核心代码示例(导航栏 + 行内块排列))
[4. 易错点](#4. 易错点)
[Q2:块级元素设 100% 宽度加 padding 为何溢出父容器?](#Q2:块级元素设 100% 宽度加 padding 为何溢出父容器?)
[5. 进阶思考题](#5. 进阶思考题)
[1. 核心定义](#1. 核心定义)
[2. 核心思考问题及解决步骤](#2. 核心思考问题及解决步骤)
[3. 核心代码示例(两列布局 + 清除浮动)](#3. 核心代码示例(两列布局 + 清除浮动))
[4. 易错点问答](#4. 易错点问答)
[5. 进阶思考题](#5. 进阶思考题)
[1. 核心定义](#1. 核心定义)
[2. 核心思考问题及解决步骤](#2. 核心思考问题及解决步骤)
[3. 核心代码示例(弹窗居中 + 粘性导航)](#3. 核心代码示例(弹窗居中 + 粘性导航))
[4. 易错点问答](#4. 易错点问答)
[Q1:sticky 定位为何不生效?](#Q1:sticky 定位为何不生效?)
[Q2:absolute 元素宽度 100% 为何超出父元素?](#Q2:absolute 元素宽度 100% 为何超出父元素?)
[5. 进阶思考题](#5. 进阶思考题)
[1. 核心定义](#1. 核心定义)
[2. 核心思考问题及解决步骤](#2. 核心思考问题及解决步骤)
[3. 核心代码示例(三列布局 + 子元素自适应)](#3. 核心代码示例(三列布局 + 子元素自适应))
[4. 易错点问答](#4. 易错点问答)
[Q1:flex-direction: column 时,justify-content:center 为何无法水平居中?](#Q1:flex-direction: column 时,justify-content:center 为何无法水平居中?)
[5. 进阶思考题(针对难点)](#5. 进阶思考题(针对难点))
[1. 核心定义](#1. 核心定义)
[2. 核心思考问题及解决步骤](#2. 核心思考问题及解决步骤)
[3. 核心代码示例(自适应卡片网格)](#3. 核心代码示例(自适应卡片网格))
[4. 易错点问答](#4. 易错点问答)
[Q1:Grid 容器设 display:grid 后,子元素为何仍按标准流排列?](#Q1:Grid 容器设 display:grid 后,子元素为何仍按标准流排列?)
[Q2:Grid 的 grid-gap 为何导致容器宽度溢出?](#Q2:Grid 的 grid-gap 为何导致容器宽度溢出?)
[5. 进阶思考题](#5. 进阶思考题)
[1. 核心定义](#1. 核心定义)
[2. 核心思考问题及解决步骤](#2. 核心思考问题及解决步骤)
[3. 核心代码示例(移动端适配的页面布局)](#3. 核心代码示例(移动端适配的页面布局))
[4. 易错点问答](#4. 易错点问答)
[5. 进阶思考题(针对难点)](#5. 进阶思考题(针对难点))
CSS 主流布局
一、标准流布局(Normal Flow)
1. 核心定义
标准流(文档流)是 CSS 默认的布局方式,遵循「块级元素独占一行、行内元素横向排列」的规则,元素按 HTML 书写顺序依次排布。
-
块级元素(div、p、h1~h6 等):宽度默认 100%,高度由内容撑开,纵向排列;
-
行内元素(span、a、img 等):宽高由内容决定,横向排列,无法设置宽 / 高 / 上下 margin;
-
行内块元素(inline-block):兼具行内(横向排列)和块级(可设宽高)特性。
2. 核心思考问题及解决步骤
| 思考问题 | 解决步骤 |
|---|---|
块级元素设置margin: 0 auto却无法水平居中 |
步骤 1:检查块级元素是否设置了宽度(width/max-width),无宽度则margin: 0 auto无效;步骤 2:确保元素未脱离标准流(如未设浮动 / 绝对定位);示例:.box { width: 500px; margin: 0 auto; } |
| 行内块元素和行内元素垂直对齐不一致,出现基线错位 | 步骤 1:给行内块 / 行内元素统一设置vertical-align: middle(或 top/bottom);步骤 2:若包含文字,确保父元素line-height与元素高度匹配;示例:.icon { display: inline-block; vertical-align: middle; }.text { vertical-align: middle; } |
| 行内元素想设置上下 margin 生效 | 步骤 1:将行内元素转为inline-block或block;步骤 2:设置上下 margin(行内元素仅左右 margin 生效)。 |
3. 核心代码示例(导航栏 + 行内块排列)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
.nav { background: #333; padding: 10px 0; font-size: 0; /* 解决行内块空隙 */ }
.nav-item {
display: inline-block;
font-size: 16px; /* 恢复文字大小 */
margin: 0 15px;
}
.nav-item a { color: #fff; text-decoration: none; }
.content {
width: 80%;
margin: 20px auto;
padding: 20px;
background: #f5f5f5;
}
</style>
</head>
<body>
<div class="nav">
<div class="nav-item"><a href="#">首页</a></div>
<div class="nav-item"><a href="#">产品</a></div>
<div class="nav-item"><a href="#">关于</a></div>
</div>
<div class="content">
<p>标准流:块级元素独占一行,行内块横向排列</p>
</div>
</body>
</html>
4. 易错点
Q1:给行内元素设置宽高为何不生效?
span {
width: 200px;
height: 50px;
background: #eee;
}
- 修正方案:将行内元素转为行内块 / 块级元素,宽高才能生效:
span {
display: inline-block; /* 或 block */
width: 200px;
height: 50px;
background: #eee;
}
Q2:块级元素设 100% 宽度加 padding 为何溢出父容器?
- 错误示例:
.parent { width: 500px; border: 1px solid #000; }
.child {
width: 100%;
padding: 20px;
background: #f5f5f5;
}
- 修正方案:开启
box-sizing: border-box,让宽高包含 padding/border:
.child {
width: 100%;
padding: 20px;
background: #f5f5f5;
box-sizing: border-box; /* 核心修正 */
}
5. 进阶思考题
Q:标准流中,两个相邻的块级元素分别设置margin-bottom: 20px和margin-top: 30px,最终两者的间距是 50px 还是 30px?为什么?如何让两个 margin 完全叠加生效?
(答案提示:最终间距是 30px,因为标准流中块级元素的垂直 margin 会发生「折叠」,取较大值生效;让 margin 叠加的方法:给其中一个元素包裹父元素并触发 BFC(如设置overflow: hidden),或把其中一个元素转为行内块 / 浮动 / 定位元素,脱离标准流的 margin 折叠规则。)
二、浮动布局(Float)
1. 核心定义
浮动布局通过float: left/right/none让元素脱离标准流(但不脱离文本流),向父元素左侧 / 右侧浮动,常用于早期多列布局、文字环绕效果。
2. 核心思考问题及解决步骤
| 思考问题 | 解决步骤 |
|---|---|
| 父元素包含浮动子元素时,高度塌陷(父元素高度为 0) | 步骤 1:选择清除浮动的方案(3 种主流方案):方案 A(伪元素法,推荐):.parent::after { content: ""; display: block; clear: both; }方案 B(overflow 法):.parent {overflow: hidden;}方案 C(额外标签法):在浮动子元素后加<div style="clear: both;"></div>;步骤 2:确保父元素无固定高度(若有固定高度,塌陷问题不明显,但仍需清除浮动避免影响后续布局)。 |
| 多个浮动元素宽度之和超过父元素,导致最后一个元素换行 | 步骤 1:检查子元素宽度(含 margin/padding/border),确保总宽度≤父元素宽度;步骤 2:若需适配响应式,改用百分比宽度,预留 margin 间距;示例:父元素宽 1000px,3 个子元素各设width: 31%; margin: 0 1%;(总宽度 31%×3 + 1%×4=97% < 100%)。 |
| 浮动元素与非浮动元素重叠,想让非浮动元素在浮动元素下方显示 | 步骤 1:给非浮动元素设置clear: left/right/both,清除浮动的影响;步骤 2:若需保留并排布局,改为给非浮动元素也设置浮动;示例:.float-box { float: left; width: 200px; }.normal-box { clear: left; } |
3. 核心代码示例(两列布局 + 清除浮动)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
.container {
width: 1000px;
margin: 20px auto;
border: 1px solid #ddd;
}
/* 伪元素清除浮动 */
.container::after {
content: "";
display: block;
clear: both;
}
.left {
float: left;
width: 200px;
height: 300px;
background: #f5f5f5;
}
.right {
float: left;
width: 780px;
height: 300px;
background: #eee;
margin-left: 20px;
}
</style>
</head>
<body>
<div class="container">
<div class="left">左侧栏(浮动)</div>
<div class="right">主内容区(浮动)</div>
</div>
</body>
</html>
4. 易错点问答
Q1:仅给部分子元素设浮动为何导致布局混乱?
.container { width: 500px; border: 1px solid #000; }
.child1 { float: left; width: 200px; height: 100px; background: #f5f5f5; }
.child2 { width: 200px; height: 100px; background: #eee; } /* 未设浮动 */
- 修正方案:所有需横向排列的子元素都设浮动,并给父元素清除浮动:
.child2 {
float: left; /* 补充浮动 */
width: 200px;
height: 100px;
background: #eee;
margin-left: 20px;
}
.container::after { /* 清除浮动 */
content: "";
display: block;
clear: both;
}
5. 进阶思考题
Q:浮动元素的「脱离标准流」和定位元素的「脱离标准流」有何区别?为何浮动元素不会覆盖文本,而绝对定位元素会?
(答案提示:浮动元素脱离的是「布局流」,但仍在「文本流」中,文本会环绕;绝对定位元素脱离所有流,包括文本流,因此会覆盖文本。)
三、定位布局(Position)
1. 核心定义
通过position属性控制元素精准定位,核心值:
-
static:默认值,遵循标准流,
top/left/right/bottom/z-index无效; -
relative:相对定位,相对于自身原位置偏移,不脱离标准流,占原位置;
-
absolute:绝对定位,相对于最近的已定位(非 static)祖先元素偏移,脱离标准流;
-
fixed:固定定位,相对于视口偏移,脱离标准流,滚动时位置不变;
-
sticky:粘性定位,滚动到阈值前为 relative,阈值后为 fixed。
2. 核心思考问题及解决步骤
| 思考问题 | 解决步骤 |
|---|---|
| absolute 元素找不到定位基准,相对于根元素(html)定位 | 步骤 1:给目标祖先元素设置position: relative/absolute/fixed,作为包含块;步骤 2:确保祖先元素的宽高能覆盖 absolute 元素的定位范围。 |
| sticky 定位不生效 | 步骤 1:检查是否设置top/bottom/left/right(必须设偏移量);步骤 2:检查父元素是否有overflow: hidden(会截断 sticky 效果);步骤 3:检查父元素高度是否小于 sticky 元素高度(无滚动空间则失效)。 |
| 多个定位元素重叠,层级混乱 | 步骤 1:给定位元素设置z-index(仅在已定位元素上生效);步骤 2:注意堆叠上下文:父元素若创建了堆叠上下文(如设z-index/opacity<1/transform),子元素 z-index 无法超过父元素。 |
3. 核心代码示例(弹窗居中 + 粘性导航)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
/* 粘性导航 */
.nav {
position: sticky;
top: 0;
background: #fff;
padding: 15px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
z-index: 99;
}
/* 弹窗遮罩 */
.modal-mask {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0,0,0,0.5);
display: flex;
justify-content: center;
align-items: center;
}
/* 弹窗内容 */
.modal {
position: relative;
width: 400px;
padding: 20px;
background: #fff;
border-radius: 8px;
}
.content { height: 1500px; padding: 20px; } /* 测试粘性导航 */
</style>
</head>
<body>
<div class="nav">粘性导航(滚动吸顶)</div>
<div class="content">滚动页面查看导航效果...</div>
<div class="modal-mask">
<div class="modal">
<h3>弹窗(固定定位居中)</h3>
<p>绝对/固定定位结合Flex实现居中</p>
</div>
</div>
</body>
</html>
4. 易错点问答
Q1:sticky 定位为何不生效?
- 错误示例:
.nav {
position: sticky;
/* 未设置top/bottom偏移量 */
background: #fff;
padding: 15px;
}
.parent { overflow: hidden; height: 500px; } /* 父元素溢出隐藏 */
- 修正方案:添加偏移量,移除父元素 overflow:hidden:
.nav {
position: sticky;
top: 0; /* 核心:设置偏移量 */
background: #fff;
padding: 15px;
}
.parent { /* 移除overflow:hidden */
height: 500px;
}
Q2:absolute 元素宽度 100% 为何超出父元素?
- 错误示例:
.parent {
position: relative;
width: 300px;
padding: 20px;
border: 1px solid #000;
}
.child {
position: absolute;
width: 100%;
height: 50px;
background: #f5f5f5;
}
- 修正方案:用 left/right 替代 width,自动适配 padding:
.child {
position: absolute;
left: 0;
right: 0; /* 替代width:100% */
height: 50px;
background: #f5f5f5;
}
5. 进阶思考题
Q:relative 定位的元素设置top: 20px后,原位置是否还会占据空间?如果想让 relative 元素的偏移不影响其他元素布局,该如何处理?
(答案提示:relative 定位元素偏移后仍占据原位置,会导致其他元素被「挤开」但视觉上重叠;解决方法:改用 absolute 定位(需给父元素设 relative),或给 relative 元素添加margin替代 top/left 偏移(margin 偏移不会保留原位置占位)。)
四、弹性布局(Flex)
1. 核心定义
Flex 布局(弹性布局)通过给父元素设置display: flex,将子元素转为弹性项,通过主轴(flex-direction)、交叉轴的属性控制排列方式,是现代布局的首选方案,适配所有尺寸的屏幕。
-
容器属性:flex-direction、justify-content(主轴对齐)、align-items(交叉轴对齐)、flex-wrap、align-content(多行交叉轴对齐);
-
项目属性:flex-grow(放大比例)、flex-shrink(缩小比例)、flex-basis(基准宽度)、align-self(单独对齐)。
2. 核心思考问题及解决步骤
| 思考问题 | 解决步骤 |
|---|---|
Flex 子元素设置width后,仍被挤压 / 拉伸 |
步骤 1:检查flex-shrink(默认 1,允许缩小):需固定宽度则设flex-shrink: 0;步骤 2:检查flex-grow(默认 0,不放大):需占满剩余空间则设flex-grow: 1;示例:.item {width: 200px; flex-shrink: 0;}(固定宽度,不被挤压)。 |
| Flex 布局想让子元素换行,且换行后交叉轴居中 | 步骤 1:给容器设置flex-wrap: wrap(允许换行);步骤 2:用align-content: center(多行交叉轴居中),而非align-items(单行交叉轴居中);注意:align-content仅在换行时生效。 |
| 多个 Flex 子元素,想让某一个子元素靠右对齐,其余靠左 | 步骤 1:给该子元素设置margin-left: auto;步骤 2:确保容器未设置justify-content: space-between(避免冲突);示例:.container { display: flex; }.item:last-child { margin-left: auto; } |
3. 核心代码示例(三列布局 + 子元素自适应)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
.container {
display: flex;
width: 1200px;
margin: 20px auto;
gap: 20px; /* 子元素间距 */
}
.item1 {
width: 200px;
flex-shrink: 0; /* 固定宽度,不被挤压 */
height: 300px;
background: #f5f5f5;
}
.item2 {
flex: 1; /* 占满剩余空间 */
height: 300px;
background: #eee;
}
.item3 {
width: 150px;
flex-shrink: 0;
height: 300px;
background: #ddd;
}
</style>
</head>
<body>
<div class="container">
<div class="item1">侧边栏1(固定宽)</div>
<div class="item2">主内容(自适应)</div>
<div class="item3">侧边栏2(固定宽)</div>
</div>
</body>
</html>
4. 易错点问答
Q1:flex-direction: column 时,justify-content:center 为何无法水平居中?
- 错误示例:
.container {
display: flex;
flex-direction: column;
justify-content: center;
width: 500px;
height: 300px;
border: 1px solid #000;
}
.item { width: 200px; height: 50px; background: #eee; }
- 修正方案:column 方向下,水平居中用 align-items:center:
.container {
display: flex;
flex-direction: column;
align-items: center; /* 交叉轴(水平)居中 */
justify-content: center; /* 主轴(垂直)居中 */
width: 500px;
height: 300px;
border: 1px solid #000;
}
5. 进阶思考题(针对难点)
Q:Flex 布局中,flex: 1、flex: auto、flex: none的区别是什么?当子元素同时设置flex-basis和width,优先级如何?
(答案提示:flex:1 = flex-grow:1 + flex-shrink:1 + flex-basis:0%;flex:auto = flex-grow:1 + flex-shrink:1 + flex-basis:auto;flex:none = flex-grow:0 + flex-shrink:0 + flex-basis:auto;flex-basis优先级高于width,若设flex-basis,width 会被覆盖。)
五、网格布局(Grid)
1. 核心定义
Grid 布局(网格布局)是二维布局系统,通过将父元素设为display: grid,划分行(grid-template-rows)和列(grid-template-columns),精准控制子元素在网格中的位置,适合复杂的二维布局(如仪表盘、卡片网格)。
-
容器属性:grid-template-columns/rows、grid-gap(间距)、justify-items(单元格水平对齐)、align-items(单元格垂直对齐)、grid-template-areas(区域命名);
-
项目属性:grid-column/row(指定单元格位置)、grid-area(指定区域)。
2. 核心思考问题及解决步骤
| 思考问题 | 解决步骤 | |
|---|---|---|
| Grid 子元素想跨多行 / 多列排列 | 步骤 1:用grid-column: 1 / 3(跨第 1 到第 3 列,即 2 列);步骤 2:用grid-row: 2 / 4(跨第 2 到第 4 行,即 2 行);注意:数值为网格线的编号,而非列 / 行数。 |
|
| Grid 布局的间距(grid-gap)导致容器宽度溢出 | .container {width: 100%; grid-template-columns: repeat (3, 1fr); grid-gap: 20px; }(总宽度 = 100% + 20px×2) | 方案 1:容器添加box-sizing: border-box;方案 2:用padding替代 grid-gap,或改用百分比间距。 |
| Grid 布局在移动端适配,需调整列数和行高 | 步骤 1:通过媒体查询修改grid-template-columns;步骤 2:移动端设grid-template-columns: 1fr(单列),平板设2fr(两列),桌面设3fr(三列);示例:@media (max-width: 768px) { .container { grid-template-columns: 1fr; } } |
3. 核心代码示例(自适应卡片网格)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
.card-container {
display: grid;
width: 1200px;
margin: 20px auto;
/* 自适应列:最小250px,自动填充,最大占满 */
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 20px; /* 行列间距 */
}
.card {
height: 200px;
background: #f5f5f5;
border-radius: 8px;
padding: 15px;
}
</style>
</head>
<body>
<div class="card-container">
<div class="card">卡片1</div>
<div class="card">卡片2</div>
<div class="card">卡片3</div>
<div class="card">卡片4</div>
<div class="card">卡片5</div>
</div>
</body>
</html>
4. 易错点问答
Q1:Grid 容器设 display:grid 后,子元素为何仍按标准流排列?
- 错误示例:
.container {
display: grid;
width: 500px;
border: 1px solid #000;
}
.item { height: 50px; background: #eee; }
- 修正方案:必须设置行列模板,否则默认 1 列 1 行:
.container {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3列等分 */
width: 500px;
border: 1px solid #000;
}
Q2:Grid 的 grid-gap 为何导致容器宽度溢出?
- 错误示例:
.container {
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px; /* 总宽度=100% + 20px×2 */
}
- 修正方案:容器开启 box-sizing,或改用 padding:
.container {
width: 100%;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-gap: 20px;
box-sizing: border-box; /* 核心修正 */
padding: 0 10px; /* 补充内边距避免边缘贴紧 */
}
5. 进阶思考题
Q:Grid 布局和 Flex 布局的核心区别是什么?在实现「多行多列且元素大小不一」的布局时,为何 Grid 比 Flex 更高效?
(答案提示:Flex 是一维布局(仅主轴 / 交叉轴),Grid 是二维布局(行 + 列);Flex 实现多行多列需依赖flex-wrap,且无法精准控制某一元素跨多行 / 列,Grid 可直接通过grid-column/row指定元素位置,更适配复杂二维布局。)
六、响应式布局(Responsive)
1. 核心定义
响应式布局不是独立的布局方式,而是一种设计理念:通过媒体查询、弹性单位(rem/vw/%)、流式布局等,让页面适配不同屏幕尺寸(手机、平板、桌面),核心是「内容适配、布局自适应」。
2. 核心思考问题及解决步骤
| 思考问题 | 解决步骤 |
|---|---|
| 如何选择合适的响应式单位(px/rem/vw/%) | 步骤 1:固定尺寸(如按钮宽高)用 px;步骤 2:文字大小、元素宽度适配用 rem(需设置根元素 font-size,如 html {font-size: 16px;});步骤 3:全屏适配的元素用 vw(1vw = 视口宽度的 1%);步骤 4:子元素相对父元素的宽度用 %。 |
| 媒体查询的断点设置不合理,导致布局在某些屏幕尺寸下错位 | 步骤 1:参考主流设备断点:- 移动端:<768px;- 平板:768px~992px;- 桌面端:992px~1200px;- 大屏:>1200px;步骤 2:断点设为奇数(如 767px),避免与设备宽度重合;步骤 3:优先采用「移动优先」的媒体查询(@media (min-width: 768px) {})。 |
| 响应式布局中,图片拉伸 / 变形 | 步骤 1:给图片设置max-width: 100%; height: auto;;步骤 2:用picture标签适配不同分辨率的图片;示例:<picture><source srcset="img-mobile.jpg" media="(max-width: 768px)"></picture> |
3. 核心代码示例(移动端适配的页面布局)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
/* 基础样式(移动端) */
.container {
width: 100%;
padding: 0 15px;
}
.header { padding: 15px 0; background: #333; color: #fff; }
.main { margin: 15px 0; }
.sidebar { background: #f5f5f5; padding: 10px; margin-top: 15px; }
/* 平板适配(768px+) */
@media (min-width: 768px) {
.container {
max-width: 750px;
margin: 0 auto;
}
.main-wrap {
display: flex;
gap: 15px;
}
.main { flex: 1; margin: 0; }
.sidebar { flex: 0 0 250px; margin-top: 0; }
}
/* 桌面端适配(992px+) */
@media (min-width: 992px) {
.container { max-width: 960px; }
}
</style>
</head>
<body>
<div class="container">
<div class="header">响应式布局示例</div>
<div class="main-wrap">
<div class="main">
<h3>主内容区</h3>
<p>移动端单列,平板/桌面端与侧边栏并列</p>
</div>
<div class="sidebar">侧边栏</div>
</div>
</div>
</body>
</html>
4. 易错点问答
Q1:媒体查询顺序错误为何导致样式不生效?
- 错误示例(桌面优先,顺序混乱):
@media (min-width: 992px) { .container { max-width: 960px; } }
@media (min-width: 768px) { .container { max-width: 750px; } }
- 修正方案(移动优先,从小到大):
/* 正确:先小屏,再大屏,大屏覆盖小屏 */
@media (min-width: 768px) { .container { max-width: 750px; } }
@media (min-width: 992px) { .container { max-width: 960px; } }
Q2:移动端图片为何拉伸变形?
- 错误示例:
img {
width: 100%;
}
- 修正方案:设置 height:auto,保持宽高比:
img {
width: 100%;
height: auto; /* 核心修正 */
max-width: 100%;
}
5. 进阶思考题(针对难点)
Q:「移动优先」和「桌面优先」的媒体查询有何区别?在响应式布局中,为何推荐「移动优先」?
(答案提示:移动优先用min-width,从移动端样式开始,逐步增加大屏样式;桌面优先用max-width,从桌面端样式开始,逐步覆盖小屏样式;移动优先的优势:代码更简洁(大屏样式作为补充)、适配更多移动设备、加载速度更快(移动端样式更轻量)。)