第38章 常见问题

第三十八章:常见问题与坑

踩坑是成长的必经之路,这一章帮你提前知道这些坑在哪里!

38.1 盒模型

38.1.1 父元素高度塌陷

浮动元素导致父容器高度塌陷。

1
2
/* 解决方案 */
.parent { display: flow-root; }

38.1.2 margin上下重叠

1
2
3
4
5
6
7
8
/* 方案1:父元素 overflow: hidden(简单但可能有副作用)*/
.parent { overflow: hidden; }

/* 方案2:父元素 padding 代替子元素 margin(推荐)*/
.parent { padding: 20px 0; }

/* 方案3:子元素使用单方向 margin(推荐)*/
.child { margin-top: 20px; } /* 只用 top 或 bottom */

38.2 布局

38.2.1 Flex项目被压缩

1
.item { flex-shrink: 0; }

38.2.2 inline-block间隙

inline-block元素之间会产生空白间距,解决方案是把父元素设为flex或grid。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
/* 方案1:父元素用flex(最简单粗暴)*/
.parent { display: flex; }

/* 方案2:父元素font-size归零 */
.parent {
  font-size: 0;
}
.parent > * {
  font-size: 16px; /* 子元素恢复字体大小 */
}

38.3 动画

38.3.1 height:auto无法过渡

height: auto 是无法参与过渡动画的——浏览器根本不知道 auto 该渐变到哪个值。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/* ❌ 这样写,动画不会生效 */
.box {
  height: 0;
  transition: height 0.3s;
}
.box.open {
  height: auto; /* 浏览器:auto 是多少?我不会渐变到 auto 啊 */
}

/* ✅ 正确做法:用 max-height 代替,指定一个足够大的具体值 */
.collapsible {
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.3s ease;
}
.collapsible.open {
  max-height: 1000px; /* 足够大,大过内容实际高度即可 */
}

💡 进阶方案:用 grid-template-rows: 0fr / 1fr 配合 transition(CSS Grid 特有),可以实现真正意义的 height: auto 动画,且无需估算具体数值。

38.3.2 动画性能差

CSS 动画的性能取决于你动了什么属性。记住一个原则:能不动 layout 就别动,能跳过 paint 就跳过

属性类型示例性能代价
** compositor-only **transformopacity🚀 极快仅 CPU/合成器参与
paint 相关backgroundcolorbox-shadow🐢 较慢触发重绘
layout 相关widthheightmarginpaddingtop/left🐌 慢触发回流重绘
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
/* ✅ 好:transform 和 opacity 由合成器处理,不触发 layout 和 paint */
.fast {
  transform: translateX(100px);
  opacity: 0.5;
}

/* ❌ 差:left/top 每次动画都会触发回流,性能极差 */
.slow {
  left: 100px;
  top: 100px;
}

💡 所有现代动画库(Framer Motion、GSAP 等)底层都在用 transform + opacity,原因就在这里。所以下次想给元素做位移动画时,请默念:left 是魔鬼,transform 是朋友。


本章小结

踩坑是成长!

下章预告

最后一章UI组件!