从入行到现在,我见过太多前端同事在padding和margin的百分比上翻车。最常见的一种场景:设计师说"这个模块的底部留白要占整个卡片高度的30%",然后新人直接写了个margin-top: 30%,结果页面一打开,那个间距不是按照高度算的,而是随着宽度在变,整个布局直接乱掉。还有一种更隐蔽的坑,就是做等比例自适应盒子的时候,height: 0; padding-bottom: 56.25%这行代码里,56.25%到底为什么能撑出高度?它参照的是谁?
这些问题的根源,就是CSS里padding和margin百分比的计算基准。它和你想的不太一样,甚至和CSS里其他属性的百分比规则都不同。这篇文章我就把这块讲透——规则是什么、底层为什么这么定、在真实布局里怎么用、以及我在实际开发中踩过的那些坑。
1. 最容易被误解的规则:四个方向的百分比都参照"父元素宽度"
1.1 先记住这个反直觉的结论
CSS规范里写得很清楚:padding和margin的百分比值,相对于包含块(containing block)的宽度(width)计算。
注意,这里说的是"宽度",不是"高度"。而且关键是——它不区分方向。也就是说:
padding-top: 10%,参照的是父元素宽度padding-bottom: 10%,参照的也是父元素宽度margin-left: 10%,参照的是父元素宽度margin-right: 10%,甚至margin-top: 10%,全都是参照父元素宽度
就这么简单粗暴,上下左右,清一色以宽度为基准。我见过很多有经验的开发者,能答对padding-left的百分比是相对宽度,但一碰到padding-top就犹豫了。因为直觉上,"上"这个方向的间距,应该和"高"有关联才对。
但这种直觉在CSS里是不成立的。看一个最简单的例子:
.parent { width: 400px; height: 800px; /* 父元素高度远大于宽度 */ } .child { padding-top: 10%; /* 实际是 400px * 10% = 40px,不是 800px * 10% = 80px */ margin-top: 10%; /* 同样是 40px */ }父元素明明有800px高,但10%并没有算出80px,而是按宽度400px算出40px。第一次碰到这个现象的人,基本都会懵一下。
1.2 为什么大家这么容易记错
我觉得这里面有两个容易混淆的原因。
第一,CSS里不同属性对百分比的解析方式完全不同。比如width: 50%参照父元素宽度,height: 50%参照父元素高度,top: 50%参照定位父元素的高度。这些属性都各自对号入座,看起来非常"合理"。但padding和margin偏偏不按这个套路出牌,所有方向统一参照宽度,这就打破了人们的预期。
第二,CSS盒模型的知识点里,padding和margin是放在一起学的,大家都默认它们是一对兄弟,属性规则也应该相似。结果padding的百分比和margin的百分比确实一样(都相对宽度),这点倒没让人意外;真正的意外在于它们和top/bottom这类偏移属性的规则不一致。很多人把padding-top的百分比跟top属性的百分比类比,结果就记混了。
所以这里我给大家一个记忆口诀:在普通的文档流布局中,凡是padding和margin的百分比,就把它当成"父容器宽度的一个比例"来理解,和高度没有任何关系。
2. 这个规则背后的设计逻辑:为什么CSS非要跟直觉对着干
2.1 一个关键约束:循环依赖的问题
你可能会问:为什么CSS不让padding-top: 10%参照父元素的高度?这样不是更符合直觉吗?
答案在于——如果参照高度,在CSS的排版模型里会产生循环依赖(circular dependency)。
简单解释一下:CSS的文档流布局中,一个块级元素的高度,默认是auto,也就是由内容撑开的。如果子元素的padding-top反过来又要依赖父元素的高度,那就成死循环了:
- 父元素高度
auto,等着子元素的高度来确定自身高度 - 子元素的
padding-top要看父元素的高度 - 于是两边互相等,谁也算不出来
浏览器无法处理这种互相等待的情况,所以在CSS 2.1规范制定的时候,就统一规定:padding和margin的百分比一律参照宽度。因为宽度在块级排版中通常是明确或者可计算的(由父容器宽度决定),不存在这种循环依赖的问题。
2.2 那垂直方向的间距怎么用百分比?
依赖宽度计算垂直方向的间距,确实会带来一些使用上的"别扭"。比如你希望一个元素距离容器顶部的高度是容器高度的30%,用margin-top: 30%就是不准确的做法。
那该怎么办?在CSS技术发展到现在,已经有了专门的解决方案:
- 需要相对父元素高度来设置间距时,优先使用
top/bottom等偏移属性(比如配合position: relative),它们的百分比参照定位包含块的高度。 - 更多情况下,使用视口单位
vh,margin-top: 30vh就是视口高度的30%,和父元素高度无关。 - 在网格布局中,可以使用
fr单位或align-self控制。
所以在实际开发中,如果真想实现"距离顶部30%的间距",你应该用top属性和定位,或者margin-top: 30vh配合分栏布局来处理。理解了这一点,就不会再拿padding/margin的百分比去硬碰"高度"需求了。
2.3 唯一例外:绝对定位元素里的left/right/top/bottom
这里要区分另一组属性。绝对定位元素(position: absolute或fixed)的left、right百分比参照定位包含块的宽度,top、bottom百分比参照定位包含块的高度。也就是说:
.abs { position: absolute; top: 10%; /* 参照定位父元素的高度 */ left: 10%; /* 参照定位父元素的宽度 */ }这组属性是"各找各妈"的。所以千万不能把top的百分比规则和margin-top的百分比规则混为一谈。有了这个对比,你会发现CSS里到处都是"百分比基准不同"的坑,除了熟记规则,还要建立一种"每个属性都有自己的参照系"的意识。
3. padding百分比的高光时刻:用它实现等比例缩放盒子
3.1 自适应宽高比:padding-bottom撑起一片天
虽然padding百分比在"垂直间距"上很反直觉,但有一个场景它简直是天选之子——需要保持宽高比的自适应盒子。
原理很简单:当一个盒子的width是相对父容器宽度变化的时候,你没法用固定的height去配合它。比如你想做一个16:9的视频容器:
.video-box { width: 100%; height: 0; padding-bottom: 56.25%; /* 9/16 = 0.5625 */ position: relative; } .video-box iframe { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }这里的56.25%参照的是父容器宽度。如果父容器宽度是1000px,那么padding-bottom就是562.5px,加上height: 0,于是整个盒子的实际高度正好是562.5px,宽高比就是16:9。当父容器宽度变化时,padding-bottom跟着变,盒子的高度也自动等比缩放。
因为padding区域内也包括背景色的渲染范围,这种用height: 0+padding-bottom的方式,本质上就是用垂直方向的padding来模拟高度。而padding的百分比参照宽度,正好又保证了高度的变化永远跟宽度同步,这不就是完美的等比例吗?
3.2 实际项目中的应用:Banner、商品图、头像
我在做移动端H5项目的时候,这个技巧基本是标配。几个高频场景:
- 首屏Banner:设计稿是750x300的横条,转成rem后宽度随屏幕变化,高度如果写死rem,在不同宽高比的手机上可能露出空白或压扁图片。用
padding-bottom: 40%(300/750),高度自动跟随,图片再用居中裁剪,视觉上永远严丝合缝。 - 固定比例的头像框:比如一个圆形的用户头像,要求在不同设备上保持正方形。直接写
width: 60px; height: 60px当然可以,但如果要求宽度跟随父容器而高度不变形,那就可以:
.avatar { width: 20%; height: 0; padding-bottom: 20%; /* 和宽度同样比例,就是正方形 */ border-radius: 50%; background: #eee; }这种方法的好处是,不管父容器多宽,头像永远保持正方形,而且完全不需要JavaScript介入计算。
3.3 注意:height: 0并不总是必需的
我见过一种写法,不写height: 0,直接:
.box { width: 50%; padding-bottom: 50%; }这种方式也能实现正方形,因为默认height: auto时,元素高度由内容决定;如果内部没有内容(或内容绝对定位),实际高度就是padding撑起来的高度。但你注意,如果这个盒子里有普通流内的内容,高度就变成内容高度 + padding-bottom了,比例就不对了。所以为了稳妥,做等比例盒子时我还是建议:
- 需要纯形状盒子(如背景块、占位):
width+padding-bottom+height: 0 - 内部需要放内容的:内容区用绝对定位填满,父盒子加
position: relative
这样容器的高度完全由padding决定,不受内容影响,比例最可控。
3.4 和aspect-ratio对比一下
CSS新特性aspect-ratio出现后,有人觉得这个老技巧可以退休了:
.box { aspect-ratio: 16 / 9; width: 100%; }确实,aspect-ratio写起来更简洁、更语义化,现代浏览器兼容性也足够好。但在某些场景下,老方法仍有价值:
- 需要兼容很老的WebView、部分低版本移动端浏览器时
- 需要"高度最小阈值"这种复杂场景时,两者可以叠加使用
- 在某些边距塌陷(margin collapse)行为的影响下,
padding-bottom的表现更"实"
我的建议是:新项目直接用aspect-ratio,维护老项目或兼容要求苛刻时,用padding-bottom方案也完全没问题。理解这个百分比机制,等于你理解了工具背后的原理,工具本身淘汰了也不怕。
4. margin百分比与经典布局:从绝对定位到网格的左右横跳
4.1 水平留白的百分比应用
margin百分比最靠谱的场景,就是水平方向的间距。因为水平方向天然就跟宽度挂钩,所以margin-left: 10%这种写法,符合直觉,也不会出岔子。
比如经典的流式卡片布局,多个卡片之间的间距想跟随容器宽度变化:
.card-list { display: flex; gap: 2%; }或者老一点的方式,给每个card设置:
.card + .card { margin-left: 2%; }这种水平margin百分比在响应式设计里很常见,它的特点是:间距会随着视口宽度伸缩,不会在窄屏上过大或过小。相比固定像素间距,这种方案确实更"流式"。
但注意,margin百分比不是万能的,尤其是下面这个例子。
4.2 两栏自适应布局中的经典场景
实际上,CSS刚流行那会儿,margin百分比最出名的用途是配合浮动的两栏自适应布局。比如左边固定200px,右边自适应:
.left { float: left; width: 200px; } .right { margin-left: 20%; /* 这里就是参考父容器宽度,不是参考200px */ }很多人在这一步就懵了:margin-left: 20%的20%,到底是相对谁?答案是父容器宽度。比如父容器1000px,左边200px,那margin-left: 20%就是200px,正好和左栏一样宽。但如果你直接用margin-left: 200px,在父容器变窄时,右侧就会溢出或者产生难看的小空隙。
所以我之前在项目里写过一种相对稳妥的流式写法:
.container { overflow: hidden; /* 清除浮动 */ } .sidebar { float: left; width: 25%; /* 左栏占25% */ } .main { margin-left: 25%; /* 右栏留出25%的空间 */ }这里的左栏宽度和margin-left百分比都参照同一个父容器宽度,所以两边始终精确对齐,不会因为padding、border产生偏差。那会儿"圣杯布局"和"双飞翼布局"里也大量使用了margin百分比。
4.3 垂直margin百分比在滚动和动画中的吃力
和水平方向相比,垂直方向的margin百分比使用起来很别扭。除了参照宽度这个"反直觉"的特性,还有几个附加问题。
第一,margin折叠。普通文档流中,两个相邻元素的垂直margin会合并取较大值。如果你给某个元素设了margin-top: 10%,和另一个元素的margin-bottom: 20%碰到一起,到底用哪个百分比计算?这个百分比是相对于父元素宽度还是相邻元素宽度?规则本身不复杂(折叠后取最大值,且仍参照父元素宽度),但这会让布局计算变得难预测。
第二,无法配合CSS动画平滑过渡。你可能想做一个手风琴展开动画,高度从0到auto,但如果用了padding-top: 5%这类值,动画中间态的百分比计算会有跳变,效果不自然。基于这个原因,做高度动画时我一般会避开padding/margin百分比。
所以在真实的响应式项目中,垂直间距的百分比需求,我优先考虑的顺序是:
- 简单的固定间距:用
rem或px配合媒体查询 - 跟随视口的间距:用
vh - 跟随父元素高度的间距:用定位或grid的
align-content - 实在复杂的场景:上JavaScript测量
margin/padding百分比从来不是垂直间距的首选。
5. 顽固的默认值:box-sizing对百分比边距的连锁影响
5.1 经典坑:整体宽度超出父容器
聊到padding和margin,必须得提box-sizing。因为百分比边距的真实表现,和盒模型的宽度计算强相关。
举个例子:
.parent { width: 800px; } .child { width: 80%; padding: 5%; margin: 5%; }你算一下child的实际占用宽度:宽度80% = 640px,左右padding各5% = 各40px,左右margin各5% = 各40px,总占用就是 640 + 40 + 40 + 40 + 40 = 800px。结果就是子元素加上padding和margin,正好顶满父容器,看起来还行。
但换个值就不一定了:
.child { width: 90%; padding: 5%; margin: 5%; }这种情况下:90% + 5%*2 + 5%*2 = 110%,子元素整体就超出了父容器宽度10%,页面出现横向滚动条。
很多新手在这里会困惑:为什么我用百分比设置的宽度、边距,加起来会超过100%?因为在默认的content-box盒模型下,width是不包含padding和margin的,所有数字累加起来自然就溢出了。
解决思路有两种:
- 直接不设width,让子元素自动铺满剩余空间(块级元素默认
width: auto),此时padding和margin会向内计算,不会溢出。 - 使用
box-sizing: border-box,让width包含padding,但注意margin仍然在盒子外,还是会计入总宽度。
所以我的建议是:使用百分比padding/margin做布局时,尽量配合box-sizing: border-box,并且不要给元素既设width: 100%又设左右padding百分比。宁可让宽度auto,让浏览器自动分配空间,省去不少溢出烦恼。
5.2 全局重置时的一个隐藏风险
现在很多项目开头都写着:
* { margin: 0; padding: 0; box-sizing: border-box; }这个reset本身没问题,但要注意:它把box-sizing全局设成了border-box,这意味着width: 50% + padding: 25%这种组合的溢出问题会以另一种方式出现。因为此时width: 50%包含了padding,但50%的宽度再加margin还是一样会超出。
另外,*选择器对::-webkit-scrollbar这类伪元素也可能会造成不必要的影响。我建议在实际项目中,用更精确的重置方式:
*, *::before, *::after { box-sizing: border-box; }并且在使用百分比边距时,始终记得"margin在外面、padding在里面"这个朴素的盒模型事实。
6. 百分比边距在flex和grid里的行为:不要想当然
6.1 flex容器内:依然参照容器宽度
CSS发展到flex时代后,很多人以为flex布局能"修正"百分比边距的怪癖。但事实是,在flex容器中,flex项(flex item)的padding和margin百分比,仍然参照flex容器的宽度(更准确说是flex容器的content box宽度),而不是flex项自身宽度。
看这个例子:
.flex-parent { display: flex; width: 1000px; } .flex-item { flex: 1; padding: 10%; /* 实际是 1000px 的 10% = 100px */ }如果一个性能考虑不周,flex项明明只有300px的实际宽度,padding: 10%却按1000px的10%算出100px,百分比边距会让整个flex布局的空间膨胀,产生内容溢出。在flex的自动收缩机制下,这种"看似很小的百分比"可能引发比较隐蔽的布局bug。
同样,margin: auto在flex中的经典居中效果,本质上是把剩余空间分给了auto margin,而不是按百分比计算。所以flex布局里我一般用gap替代margin,或者用flex-basis来控制空间分配,尽量避免在flex项上用百分比margin做间距。
6.2 grid布局里:网格轨道和百分比边距的配合
grid布局相对友好一些。grid项(grid item)的百分比margin和padding,仍然参照grid容器宽度,但由于grid轨道的大小可以明确用fr、%等指定,这种参照关系反而变得可预测。
比如:
.grid-parent { display: grid; grid-template-columns: 1fr 1fr; gap: 2%; } .grid-item { margin: 5%; }这里的margin 5%是参照grid父容器的宽度。因为grid轨道可能不是均分(比如第一列2fr第二列1fr),所以两个grid项内部的margin百分比数值相同,但实际占用的空间比例不同。这个逻辑一开始可能有点绕,但只要记住"百分比参照容器宽度"这个总规则,写grid的时候就能推算出实际效果。
6.3 flex/grid下的边距动画问题
不管是flex还是grid,百分比边距在过渡动画里的表现依然糟糕。因为浏览器对百分比边距的动画支持不如transform、opacity等属性成熟,过渡中间态可能出现瞬间跳变。做展开/收起动画时,我建议:
- 水平方向的间距:优先用
gap或margin配合transition: margin,且用固定单位或width的百分比 - 垂直方向的展开/收起:优先用
grid-template-rows: 0fr -> 1fr配合min-height: 0,这是一个比较新的但很高效的技巧 - 绕不开的百分比动画场景:用JavaScript算好px再赋给元素
7. 实际开发中的决策指南:什么时候用百分比,什么时候别用
7.1 一张表说清楚各种场景的推荐方案
我根据多年的开发经验,把边距使用场景和推荐单位整理成了一张表,方便你直接对照:
| 场景 | 推荐写法 | 原因 |
|---|---|---|
| 卡片间距,希望随屏幕宽度变化 | gap: 2%或margin: 0 2% | 百分比参照容器宽度,水平方向表现稳定 |
| 保持宽高比的容器 | height: 0; padding-bottom: 56.25% | 百分比参照宽度,垂直padding正好跟随宽度 |
| 距容器顶部的间距 | margin-top: 30vh或定位top: 30% | 垂直间距的百分比不参照高度,vH/定位更可控 |
| 元素水平居中 | margin-inline: auto | 比百分比更语义化,且不受宽度溢出影响 |
| 等分间隔 | gap(flex/grid) | 不需要计算margin正负值,天然处理间隙 |
| 响应式安全间距 | clamp(16px, 3vw, 48px) | 上下限可控,不会在极端屏幕上过大或过小 |
7.2 真实项目的取舍经验
我在做大型后台管理系统和移动端H5时,对百分比边距的态度是这样的:
水平方向的百分比边距:可以用,但要看具体场景。如果间距需要随容器宽度等比缩放(比如流式卡片),那百分比挺好。如果间距本来就是视觉上固定的"呼吸感",我倾向用固定单位加媒体查询,免得在小屏上间距过小或过大。
垂直方向的百分比边距:基本不用。因为它的参照是宽度,语义上就不对。遇到"垂直间距需要响应式"的需求,我优先想到的是
vh单位。比如底部固定的操作栏距离内容的安全距离,margin-bottom: calc(12px + env(safe-area-inset-bottom))配合vh做变体。等比例盒子的场景:固定用padding-bottom。这里百分比边距的"反直觉"反而成了优点,因为需求就是比例盒子,参照宽度完全合理。就算使用
aspect-ratio,你也应该理解原理解释。老项目兼容:如果浏览器要兼容到IE11,
aspect-ratio不可用,那就回归padding百分比方案。这套技术是久经考验的。
7.3 一个调试建议:用浏览器开发者工具验证百分比基准
每次我自己写百分比边距之前,都会用开发者工具确认一下父元素的实际尺寸。选中元素后,浏览器会弹出盒模型示意图,并且把计算后的px值标注出来。看一眼padding-top的实际像素值,再除以父元素宽度,马上就能验证百分比基准。
碰到奇怪的间距问题,先在开发者工具里确认两点:
- 父元素的宽度是不是我想的那个值(有没有被flex、grid或其他布局影响)
- 元素的盒模型计算值是否符合预期(padding/margin是否因为百分比而膨胀)
一般情况下,这两步就能解决90%的百分比边距困惑。
8. 别忘了逻辑属性:百分比的方向在vertical writing mode下会变
8.1 书写模式改变时参照基准也在变化
CSS发展到现在,引入了逻辑属性(logical properties),比如margin-inline-start、padding-block-end。这些问题触及了百分比边距的一个深层问题:当文档的书写模式(writing mode)变成垂直排布时,百分比参照的"宽度"概念也会跟着变成"高度"。
举个例子,在普通的水平书写模式(writing-mode: horizontal-tb)下,padding-block-start(相当于padding-top)的百分比参照包含块的宽度。但在垂直书写模式(writing-mode: vertical-rl)下,padding-block-start就变成了右侧的间距,它参照的是包含块的高度。
这个规则对只做水平方向网页的团队可能没啥用,但如果你开发多语言站点(比如日文、蒙文的竖排文本),或者做那种"纵向滚动翻页"的阅读类应用,逻辑属性的百分比基准就要格外小心。
8.2 兼容性现状和采用建议
逻辑属性现在现代浏览器的支持已经非常好了,但在一些老旧浏览器里还有兼容问题。如果你问我日常写CSS到底用物理属性还是逻辑属性,我的建议是:
- 新项目、团队规范干净:直接上逻辑属性,尤其是
margin-inline、padding-block这些方向性明确的属性 - 维护老项目:先在关键样式里用物理属性,后续借这次重构再逐步过渡
- 做国际化项目:必须用逻辑属性,否则竖排文本下你会被各种方向问题折磨
不过无论如何,这些都改变不了"百分比参照包含块尺寸"的根本规则——只是"尺寸"在逻辑属性里会根据书写模式动态变化而已。
8.3 延伸:自定义属性(CSS变量)配合百分比边距
最后分享一个我常搭配使用的小技巧:如果你不想在代码里散落大量裸的百分比数值,可以把它们提取成CSS变量,提升可读性和可维护性:
:root { --card-padding: 4%; --card-gap: 2%; } .card { padding: var(--card-padding); margin-bottom: var(--card-gap); }这样当设计稿调整间距的时候,直接改变量值,所有引用地方自动生效。而且因为百分比参照的是包含块宽度,变量语义化之后,后面接手的人看到--card-padding: 4%,也会去思考它到底是相对谁的4%,反而促进了团队对这个知识点的理解。
9. 踩坑实录:我在真实项目中遇到的三个百分比边距问题
9.1 坑1:移动端横向滚动条之谜
有次做一个H5活动页,测试反馈页面在iPhone上可以左右滑动,出现横向滚动条。我排查了半天,最后发现是一个卡片组件里写了:
.card { width: 100%; padding: 5%; }在没有box-sizing: border-box的情况下,这个卡片的实际渲染宽度是100% + 左右padding 10%,妥妥超出了视口宽度。而body又没有设置overflow-x: hidden,于是横向滚动条就出来了。
后来我把全局的box-sizing改为border-box,并且把卡片的width: 100%去掉(让块级元素自动撑满),问题立马解决。现在我对这个套路已经形成条件反射了:只要看到横向滚动条,先检查是不是有元素同时设了宽度百分比和padding百分比。
9.2 坑2:底部导航被弹出层遮挡
另一个项目里,我为了实现一个跟随按钮位置的弹窗提示,给弹窗加了margin-top: 10%。结果在宽屏电脑上还好,到了手机横屏时,弹窗位置突然变得很高,离按钮十万八千里。
因为手机上视口宽度变大了,10%对应的px值也变大,而弹窗实际上想相对按钮定位,根本不该用百分比margin。后来我换成用position: absolute配合按钮的offsetTop动态计算,效果才完美。这个教训是:定位类需求不要用margin百分比,它是为文档流准备的属性,不是为绝对定位准备的。
9.3 坑3:grid布局里padding百分比导致的行高膨胀
还有一个场景:grid布局中给每一项设置padding: 10%,本意是让卡片内部有点呼吸空间。结果发现卡片高度超出预期很多。后来才意识到,grid项默认拉伸填满网格区域,但padding-bottom的百分比在宽度较宽的容器下会变得很大,从而推高了整个网格行的高度。
解决方式是改用固定单位的内边距,或者用grid-template-rows明确指定行高,给padding一个更可控的环境。这也再次说明了:百分比边距不是不能用,而是在严格要求尺寸的布局容器里,要非常谨慎地控制数值。
10. 一个务实的学习路径:从规则到应用
聊了这么多,我其实想强调的不只是"记住padding/margin百分比参照父元素宽度这个事实",而是这种思维模式:每个CSS属性都有自己明确的参照系,写之前先想清楚"这个百分比是相对哪个值算的"。
初学者最容易犯的错,就是靠直觉写CSS,然后出了问题再去调试。但CSS的很多规则就是和直觉反着来的。padding和margin的百分比相对宽度,就是一个典型的例子。
如果你正在学习CSS,我建议你按这样一个路径来:
- 先把盒模型彻底掌握,包括content-box和border-box的区别
- 把百分比参照系的规则整理成一张小卡片:width参照父宽度、height参照父高度、padding/margin参照父宽度、top/bottom参照定位父高度、left/right参照定位父宽度、transform百分比参照自身尺寸
- 遇到每个属性时,都停下来问一句"这个百分比的基准是什么"
- 多写多练,尤其是用百分比做等比例盒子、响应式布局
- 再往后接触flex和grid时,自动检查百分比边距在这些新布局中的表现,不要默认和文档流一样
这套思路不仅能帮你掌握padding/margin百分比,还能推及到CSS里所有带百分比的属性,形成一套自己的判断框架。等你形成了这种框架,就会发现CSS其实并没有那么神秘,很多"怪异行为"背后都是几套有限的规则在运转。而这套规则虽然反直觉,但一旦吃透,就再也不会在布局上栽跟头了。