我把一个前端新人经常背错的“标准答案”拿出来当引子:“CSS 里百分比都是相对于父容器计算的”。这句话在面试题里高频出现,在教程里也常被一笔带过,但只要你真正上手写过几个页面,马上就会发现不对劲:width: 50% 确实是相对父容器,可 padding-top: 50% 的基准竟然也是宽度;top: 50% 相对的是父容器的高度,transform: translateY(50%) 却相对的是自身高度。同样是百分比,为什么“参照物”五花八门?
这篇就专门把这个容易踩坑的知识点讲透。我会从 CSS 百分比的计算基准出发,拆解 width、padding、margin、top/left、transform、font-size 等常用属性的真实规则,再结合响应式布局、垂直居中、背景定位这些实际场景,说说我在项目中怎么用、怎么排错。适合刚入门 CSS 的新手,也适合写过不少页面但没系统梳理过百分比规则的开发者,看完这篇,你再遇到“百分比失效”“百分比撑破布局”之类的问题,心里就有底了。
1. 百分比计算的真相:每一类属性都有自己的“参照坐标系”
很多新手会默认“百分比 = 父元素的对应属性”,这个直觉对了一部分,但远远不是全貌。CSS 规范里,百分比的计算基准是由属性本身决定的,而不是由“父容器”这个笼统概念决定的。
1.1 width 和 height:最符合直觉,但隐藏着一个大坑
先看最常用的:
width: 50%:相对父元素的 content-box 宽度。height: 50%:相对父元素的 content-box 高度。
这里需要强调一个前提:height 的百分比要生效,父元素必须有一个“确定的”高度。什么叫确定?就是父元素的高度不是由内容撑开、也不是 auto 自动计算出来的。比如:
html复制<div class="parent">
<div class="child"></div>
</div>
css复制.parent {
height: auto; /* 或者不写 height */
}
.child {
height: 50%;
}
这种情况下,.child 的 height: 50% 会直接失效,最终高度是 0。原因很好理解:父元素自身的高度都是根据内容推算的,子元素又反过来按父元素高度算百分比,这就形成了循环依赖,浏览器没法解这个方程,只能放弃计算。
想要 height 百分比生效,常见的做法有两种。一是给父元素写死高度:
css复制.parent {
height: 400px;
}
.child {
height: 50%; /* 最终高度 200px */
}
二是用绝对定位。绝对定位元素的百分比高度基准不是普通父元素,而是“包含块”,包含块的高度一般是可以确定的:
css复制.parent {
position: relative;
}
.child {
position: absolute;
height: 50%;
}
这里有个我在实际项目里踩过的坑:height: 100% 在移动端 Webview 里经常出现“差一截”或“超出屏幕”的情况,根因就是 html、body 的高度没有显式设置,导致 100% 的基准高度不明确。常规做法是:
css复制html, body {
height: 100%;
}
但更推荐用 100vh 或者 min-height: 100vh 替代,vh 单位直接以视口高度为基准,不依赖父元素的链式传递,省去很多麻烦。
1.2 padding 和 margin:垂直方向百分比参考的是宽度
这一点是最容易让人意外的。按照直觉,padding-top: 10% 应该参考父元素的高度,但规范明确规定:padding 和 margin 的百分比值,无论是水平方向还是垂直方向,都参考父元素的 content-box 宽度。
我最早看到这个规则时也觉得不合理,但仔细想想,这是有意为之。核心原因是让布局计算更稳定:横向滚动条的出现会影响宽度,而宽度变动会导致垂直方向的百分比值重新计算,但反过来,高度变化不会影响水平方向的百分比。如果把 padding-top 的基准设为父元素高度,那子元素之间就会因为父元素高度变化产生连锁反应,布局很难保持稳定。
这个规则有一个著名的实战应用——固定宽高比容器:
css复制.ratio-box {
width: 100%;
padding-top: 56.25%; /* 16:9 比例 */
}
padding-top 的百分比参考宽度,所以无论屏幕多宽,这个容器的高度始终是宽度的 9/16。视频播放器封面、产品图占位、Banner 区域,都是靠这个技巧实现的。我做过一个图片瀑布流页面,列表项需要在图片加载前就撑开占位,当时就是给外层容器加了 padding-top: 100%,把正方形区域占住,加载完成后再把图片绝对定位铺满,布局全程没有跳动。
margin 的百分比规则和 padding 一样,垂直方向也是参考宽度。不过 margin 用百分比的情况相对少,因为外边距的百分比会引入“按宽度缩放间距”的副作用,在响应式设计里要谨慎使用,后面第 3 节我会细说。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 定位偏移和 transform:百分比的两个常见误解
定位相关的属性是重灾区,因为 top、left 和 transform 的基准完全不同,新手写垂直居中时经常两套混用,结果就是元素位置飘得莫名其妙。
2.1 top、left、right、bottom:相对包含块的对应尺寸
top: 10% 相对的是包含块的高度,left: 10% 相对的是包含块的宽度。这里的包含块不完全等同于父元素,需要展开说。
普通元素的包含块就是最近的块级父元素的 content-box。但绝对定位元素的包含块,是最近的 position 不为 static 的祖先元素(一般是 relative),并且是它的 padding-box,也就是说包含块的尺寸要算上 padding,但不算 border 和 margin。
举个例子:
css复制.parent {
position: relative;
width: 400px;
height: 200px;
}
.child {
position: absolute;
top: 25%;
left: 25%;
}
.child 的最终位置,是以 .parent 的 padding-box 为基准,向下移动 200px × 25% = 50px,向右移动 400px × 25% = 100px。这里要注意的是,如果父元素还设置了 padding,那包含块的尺寸和 content-box 的尺寸是不一致的,这解释了为什么有时候绝对定位元素的百分比定位和视觉预期对不上。
固定定位 position: fixed 的包含块是视口,所以 top: 50% 是视口高度的 50%,这个大家比较熟悉,但有个例外:如果祖先元素里有 transform、perspective、filter 等属性,它会成为固定定位的包含块。换句话说,transform 会把 position: fixed 降级成类似 position: absolute 的行为。我在弹窗组件里遇到过这个问题:某个按钮用了 filter 做置灰效果,结果组件里的固定定位弹层位置全乱了,排查了半天,最后定位到是 filter 改变了包含块。
2.2 transform: translate():相对自身尺寸
transform: translateX(50%) 和上面的所有规则都不同,它参考的 元素自身的宽度,translateY(50%) 参考的是 元素自身的高度。这是实现“完美垂直居中”的关键。
经典写法是:
css复制.center {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
拆开看:top: 50% 先把元素的上边缘移动到父容器高度的一半位置,left: 50% 再把左边缘移动到宽度一半的位置,但这只是让元素的左上角居中。随后 translate(-50%, -50%) 把元素沿 X、Y 轴各自向左、向上移动自身尺寸的一半,这时候元素的中心点才真正和父容器的中心点重合。
这个方法最大的优势是不需要知道元素自身宽高,内容自适应也适用。但它有一个副作用:transform 会创建新的层叠上下文和包含块,如果元素内部还有 fixed 定位的子元素,行为会受影响。另外 translate 发生在视觉层,不影响布局流,所以如果元素也参与了其他布局计算,视觉位置和占位位置可能不一致,需要留意。
2.3 margin 搭配定位的旧居中方案为什么不推荐
在 flex 和 transform 方案流行之前,有一种绝对定位配合负 margin 的居中方式:
css复制.center {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
height: 100px;
margin-top: -50px;
margin-left: -100px;
}
这个方案的原理是先把左上角定位到中心,再用负 margin 回拉自身宽高的一半。它的问题在于必须知道元素的确切尺寸,如果内容变化了,margin 值就得跟着改,维护成本高。在响应式布局里,元素宽度是百分比计算的,这个方法基本不可用。transform 方案之所以好,正是因为不需要写死尺寸。
3. 字体、行高、线条半径、背景位置:那些容易忽略的百分比规则
除了盒模型和定位,CSS 里还有一批属性的百分比规则藏得更深,但它们在排版和视觉细节里非常关键。
3.1 font-size 和 line-height:基准完全不同
font-size: 100% 相对的是 继承来的 font-size,也就是父元素的字体大小。所以 font-size: 150% 等价于 font-size: 1.5em,得到的实际像素值是父元素字体大小的 1.5 倍。这个规则在响应式字体里经常配合根元素使用:
css复制html {
font-size: 16px;
}
h1 {
font-size: 200%; /* 32px */
}
line-height 的百分比就更有意思了。line-height: 150% 相对的是 元素自身的 font-size,计算结果是“第一个”继承 line-height 属性值时,把这个值乘以百分比得到的绝对值,然后所有子元素继承的是这个绝对值,而不是比例关系。比如父元素 font-size: 20px; line-height: 150%,那么父元素的实际行高是 30px,子元素如果设置了 font-size: 10px,它继承到的 line-height 仍然是 30px,而不是 15px。
这里有个著名的坑:如果需要行高跟随字号等比缩放,应该用无单位数字:
css复制.parent {
font-size: 20px;
line-height: 1.5; /* 实际行高 30px,子元素继承比例 1.5 */
}
.child {
font-size: 10px;
/* 继承 line-height: 1.5,实际行高 15px */
}
无单位的 line-height 才是真正继承“比例”,带单位的 line-height: 150% 或 line-height: 30px 则是继承“固定值”。我在做多字号混合的卡片组件时,统一用 line-height: 1.6,不同字号的文字行距都能保持协调,反过来用 150% 就会在局部小字区域出现行距过大的问题。
3.2 border-radius:百分比参考的是元素自身的宽高
border-radius: 50% 能画一个正圆,很多刚入门的同学可能没细想过为什么。因为 border-radius 的百分比基准是元素自身的宽高:水平半径参考宽度,垂直半径参考高度。一个矩形元素 width: 200px; height: 100px; border-radius: 50%,它会得到一个椭圆角,水平和垂直半径分别是 100px 和 50px,整体形状像一个胶囊。
border-radius: 50% 在矩形上产生椭圆效果,而在正方形上产生正圆效果。如果需要严格的圆,更好的做法是设置一个足够大的像素值,比如 border-radius: 999px,无论宽高怎么变,边界都是圆润的,现在很多按钮组件都是用这种方式做的“全圆角”。我在生成头像缩略图时也踩过这个坑:图片容器的宽高并不总相等,用 border-radius: 50% 做出的头像是有轻微椭圆的,换成 border-radius: 999px 后视觉上完全舒服了。
3.3 background-position 和 radial-gradient:百分比规则绕了一个弯
background-position 的百分比规则比较冷门,但一旦弄懂,对背景定位的理解会上一个台阶。background-position: 50% 50% 是实现背景居中的常见写法,但它的计算方法有点绕:百分比不是直接把背景图尺寸乘以百分比来定位,而是让图片上和容器上对应的点对齐。
具体公式是:容器尺寸 × 百分比 - 图片尺寸 × 百分比 = 图片左上角的位置。当百分比为 0% 时,图片左上角对齐容器左上角;当百分比为 100% 时,图片右下角对齐容器右下角;当百分比为 50% 时,图片中心和容器中心重合。这就是为什么 background-position: 50% 50% 能实现背景居中。
这个规则的实用场景是雪碧图定位。以前做图标合并时,经常用 background-position: -40px -60px 这种像素值,但响应式下图标位置会滑动,后来改用百分比就稳多了。不过百分比的计算要心算,公式不熟练会容易懵,我一般先写成像素值调试好,再根据“图片宽容器宽”的关系换算成百分比。
radial-gradient 里的百分比同样是相对元素尺寸的。radial-gradient(circle at 30% 70%, #fff, #000) 的意思是圆形渐变圆心在元素水平 30%、垂直 70% 的位置。这是一个非常实用的光照效果参数,做按钮高光、卡片光晕时很常用。
4. 响应式布局里百分比的实际案列:既能救命,也能添乱
了解完规则,回到实际写页面。百分比在响应式布局里是最常用的单位之一,但用不好也会出各种奇怪问题。这一节分享几个我做项目总结出来的使用心得。
4.1 flex 布局下的 width: 100% 和 flex-basis 的配合
flex 布局出现后,很多人误以为 width 的百分比规则在 flex 容器里失效了。实际上 flex 子项的 width 仍然按父容器宽度计算,只是 flex 相关属性会参与最终尺寸的分配。
比如:
css复制.container {
display: flex;
}
.item {
width: 50%;
}
这里 .item 的宽度基准是 .container 的 content-box 宽度,但实际渲染的宽度还要受 flex-shrink 和 flex-grow 影响。如果一个 flex 容器里有三个 .item,每个 width: 50%,它们不会排成三行,而是每个都尝试占 50%,然后被压缩,最终宽度是三分之一左右。
这就出现了一个经典问题:当 flex 容器里的子项设置了 width: 100% 时,表现和普通块级元素一样,会占满一行,但如果容器本身也是 flex 项,且有固定宽度约束,width: 100% 可能会让内容溢出,因为 flex-basis: auto 会优先使用 width 值,随后 shrink 又参与收缩。实际开发中,我更推荐用 flex: 1 或 flex-basis: 百分比 来分配空间,而不是靠 width 配合 flex。
#container 宽度不确定时,flex 的 flex-basis: 33.33% 在大多数情况下比 width: 33.33% 更可靠,因为 flex-basis 直接决定主轴方向的初始尺寸,交给 flex 算法调度。
4.2 三列等宽布局的最简单实现方式
以前用 float 实现三列等宽布局,是每个子项 width: 33.33% 再处理边框和间距,非常啰嗦。现在用 flex 就干净很多:
css复制.columns {
display: flex;
gap: 16px;
}
.column {
flex: 1;
}
flex: 1 等价于 flex: 1 1 0,意思是 flex-basis 为 0,然后按比例瓜分剩余空间。这样就算容器宽度是 1000px 还是 800px,三列都自动等宽,间距用 gap 留出来,不会影响比例。
CSS Grid 的实现更简洁:
css复制.columns {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 16px;
}
1fr 是网格轨道单位,表示剩余空间的一份。它本身不是百分比,但效果类似,同样能自适应容器宽度。在实际项目里,如果列数是动态的,用 repeat(auto-fill, minmax(200px, 1fr)) 能让每列在小于 200px 时自动换行,这也是一种更高级的“百分比”逻辑。
4.3 百分比和视口单位的搭配准则
做响应式布局时,除了百分比,还有 vh、vw、vmin、vmax 这套视口单位。它们的计算基准是视口尺寸,和父容器无关。我常看到有人用 width: 100vw 做全宽容器,但在移动端会出现横向滚动,原因是 100vw 包含了滚动条的宽度(如果滚动条占据空间),而实际内容区只有 100% 宽度。
个人建议的搭配逻辑是:
- 容器宽度、栅格占比、间距这些结构化属性,优先用百分比或者
fr、flex。 - 全屏区域、高度基准、字体适配这类和视口强相关的场景,用
vh、vw、vmin。 - 因为字体响应式里,
clamp(16px, 2vw, 24px)这种写法比font-size: 2vw更稳,能限制上下限,避免在极窄或极宽屏幕上排版失控。
vmin 在移动端有一个特殊用途:把高度设置为 height: 100vmin 可以保证元素在竖屏时占满视口短边,这在需要展示二维码或方形海报时很好用。
5. 常见问题排查:百分比失效和布局错乱,多数情况是基准没对上
写 CSS 遇到百分比不生效,先别急着怀疑是浏览器 bug。我排查过的大多数问题,根源都在“基准不对”。
5.1 height 百分比失效的排查清单
一个常见场景:子元素设置 height: 50%,最终高度却是 0。按这个顺序排查:
- 父元素是否设置了
height?如果没有,height: auto导致的百分比失效。需要给父元素一个确定的高度,或者用绝对定位绕过去。 - 父元素的
display模式是否是块级?如果父元素是inline,子元素的高度计算基准会失效,改成inline-block或block。 - 子元素本身是否是块级?子元素如果是
inline元素,height压根不生效,要设display: block或inline-block。 - 是否存在
box-sizing干扰?border-box下,height: 100%包含 padding 和 border,如果父容器有较大 padding,视觉高度可能比预期小。
我调试一个网页嵌套 iframe 的页面时,遇到过 height: 100% 在 iframe 里失效的情况,最后发现 iframe 的父 div 没有明确高度。把 div 设为 height: 100vh 后,iframe 内部的所有百分比高度都正常了,因为基准链终于完整了。
5.2 padding-top 百分比导致布局被突然撑开
设置 padding-top: 50% 后,元素高度突然变大,很多人会以为写错了,其实这是正确行为。因为垂直 padding 参考宽度,当容器宽度是 600px 时,padding-top: 50% 是 300px 的垂直内边距。
这个特性可以做等比缩放容器,但如果不希望高度被撑开,就改用固定像素,或者把 padding 放在伪元素上,用绝对定位让它脱离主体文档流。我最常用的是把占位容器高度设为 0,再让绝对定位的子元素在里面铺满,避免 padding 对布局产生额外影响。
5.3 transform: translateY 视觉位置和布局位置不一致
这个问题的典型表现是:一个元素用 transform: translateY(30%) 向下移动,它下面另一个块级元素并没有被顶开,而是保持原来的位置。这是因为 transform 本质是视觉变换,不影响文档流。如果想让元素移动后后面的内容也跟着移动,就不能用 transform,应该用 margin-top、position: relative; top 这类会影响布局流的属性。
这里有一个取舍原则:颜色、旋转、轻微位移这种“装饰性效果”适合用 transform,因为它不触发回流的成本低,在动画里性能更好;但涉及真正的排版位移,还是要用布局属性。我写过许多动效,遇到需要推挤后续内容的移动,都会绕开 transform。
5.4 百分比和固定像素混用时的计算基准问题
还有一种情况:width: calc(50% + 20px)。calc 里的百分比规则和直接写百分比一致,50% 按父容器宽度计算,20px 是固定像素,两者可以相加。这解决了“百分比加间距导致换行”的问题。
之前做一个两列布局,列宽是 50% 但中间还要留 20px 间隙,直接写 width: 50% 会让两列挤爆容器,用 width: calc(50% - 10px) 配合 margin-right: 20px 才稳定。后来用 flex 的 gap 就不再依赖这个计算了,但 calc() 在处理固定 sidebar 加自适应主区域时,依然是利器:
css复制.main {
width: calc(100% - 200px);
}
这里 100% 始终是父容器宽度,无论字体大小、缩进怎么变,这一行都能精确留出 200px。用百分比做自适应,用固定像素做骨架约束,两者配合是响应式布局里的常用思路。
6. 实战复盘:一个卡片组件里的百分比灵活应用
前面原理讲了不少,最后用一个完整的例子把这些规则串起来。我最近做过的产品卡片组件,包含缩略图、标题、描述、操作按钮,就用到了好几类百分比规则。
6.1 组件布局结构和关键 CSS
HTML 结构大概是:
html复制<div class="card">
<div class="card-media"></div>
<div class="card-body">
<h3 class="card-title">标题</h3>
<p class="card-desc">描述文字</p>
<a class="card-btn" href="#">按钮</a>
</div>
</div>
CSS 关键部分:
css复制.card {
width: 100%;
max-width: 400px;
border-radius: 12px;
overflow: hidden;
}
.card-media {
width: 100%;
padding-top: 56.25%; /* 16:9 比例占位 */
background: #eee;
position: relative;
}
.card-media img {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
object-fit: cover;
}
.card-body {
padding: 16px;
}
.card-title {
font-size: 1.25rem; /* 相对根元素 16px × 1.25 = 20px */
line-height: 1.4; /* 无单位,继承比例 */
}
.card-desc {
font-size: 0.875rem; /* 相对根元素 14px */
line-height: 1.6;
}
.card-btn {
display: inline-block;
padding: 8px 20px;
background: #1677ff;
border-radius: 999px; /* 不用百分比,用大像素保证椭圆 */
transform: translateY(0); /* 占位,留一个动效钩子 */
}
这里有几个点值得说明:
.card-media的padding-top: 56.25%用的就是第 1 节讲的“垂直 padding 参考宽度”规则,让图片区域在加载前就固定为 16:9,不会跳动。- 图片用绝对定位铺满占位区域,因为
width: 100%和height: 100%的基准是.card-media容器的尺寸,而容器的高度正是由 padding 撑起来的,这正好形成闭环。 - 标题字号用
rem而不是百分比,因为根元素的font-size: 16px是确定的,1.25rem比125%写起来更直观。 - 按钮圆角用
999px,避免border-radius: 50%在按钮高度不同时出现椭圆。
6.2 改造成等比缩放的百分比方案
如果产品图要求是正方形占位,把 padding-top 改成 100% 就行:
css复制.card-media {
width: 100%;
padding-top: 100%;
}
这时候整个 card-media 区域的高度始终等于宽度,整个卡片在列表页里呈现出稳定的等比块。因为百分比是相对父容器计算,这个卡片放进任何宽度的网格里都能自动保持比例,省去了用 JavaScript 监听 resize 的麻烦。
6.3 组件里的百分比动效
给按钮加了一个 hover 效果,用 transform 做轻微上浮:
css复制.card-btn:hover {
transform: translateY(-4px);
box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
}
这里用固定 -4px 而不是百分比,因为按钮的位移幅度应该和自身高度有固定视觉关系,用 translateY(-5%) 在按钮很矮时几乎看不出来,在按钮很高时又过头。百分比适合做“跟随自身尺寸的比例缩放”,固定像素适合做“视觉上稳定的位移”,两者并不冲突。
不过这里要注意,给按钮加 transform 后,按钮会产生层叠上下文,如果按钮里还有子元素用了绝对定位,层级关系可能变化。我在复杂组件里一般会控制 transform 的使用范围,非必要不加,否则排 bug 时容易多一个维度。
7. 开发中直接可用的“百分比自查手册”
把规则整理成一个速查表,贴在编辑器旁边,每次写 CSS 拿不准时扫一眼,基本就能避开大部分坑:
| 属性 | 百分比的参照基准 | 特殊注意事项 |
|---|---|---|
| width | 父元素 content-box 宽度 | 在 flex 中受 flex-basis 影响 |
| height | 父元素 content-box 高度 | 父元素必须有确定高度,否则失效 |
| padding-top/bottom | 父元素 content-box 宽度 | 经典技巧:固定宽高比占位 |
| padding-left/right | 父元素 content-box 宽度 | 和垂直方向一致 |
| margin 四个方向 | 父元素 content-box 宽度 | 垂直方向也是宽度,易被忽略 |
| top/bottom | 包含块(padding-box)高度 | 绝对定位的包含块不等于父元素 |
| left/right | 包含块(padding-box)宽度 | 注意 transform 会改变 fixed 包含块 |
| transform: translate | 元素自身宽高 | 不触发布局流,适合做动画 |
| border-radius | 元素自身宽高 | 正方形 50% 为圆,矩形为椭圆 |
| font-size | 父元素字体大小 | 等价于 em,可级联继承 |
| line-height | 元素自身字体大小 | 用 1.4 比例写法更适合继承 |
| background-position | 容器尺寸和图片尺寸的差 | 50% 实现背景居中 |
| flex-basis | 主轴方向的容器尺寸 | 配合 flex-grow/flex-shrink 使用 |
这张表是我按踩坑频率排序的,前四个属性出问题的概率最高,特别是 height 的百分比失效和 padding-top 的宽度基准,几乎每个新人都要遇到。
再看一下常见的“为什么我写了没效果”排查口诀:
- 百分比不生效,先查父容器对应维度是否确定。
- 元素水平居中用 margin: auto,垂直居中优先 flex 或 grid。
- 需要随自身尺寸等比缩放,用 transform 百分比。
- 需要随父容器尺寸变化,用 width、padding 百分比。
前段时间处理一个用户反馈的适配问题:同一个页面在 iPhone 和 Android 上显示不一致,后来发现是 Android Webview 的默认字体大小被系统放大过,导致 rem 和百分比字体都跟着变大,布局被撑乱。解决方案是把 html 的 font-size 用 calc(16px + 0.5vw) 固定范围,或者直接用 clamp(16px, 0.5rem + 1vw, 20px),保证了不同设备上字体比例稳定。这个例子再次说明:CSS 里每一个百分比背后,都有一套约束条件,理解基准比背公式更重要。
我在实际开发中还有一个习惯:写复杂布局前,先在心里画出“父元素尺寸是否确定 → 子元素百分比会参考什么”,如果中间有一环是 auto,那链路就断了。排查时把父元素临时加上背景色和边框,能很快定位到基准是不是按预期走的。CSS 的属性很多,不可能每一条规则都背得一字不差,但把百分比的计算逻辑梳理清楚,写起布局来会踏实很多。
