面试题:line-height: 100% 和 line-height: 1 有什么区别?

这是一个考察对 CSS line-height 属性计算方式深刻理解的经典面试题。虽然 100%1 看似等价,但在 line-height 的上下文中,它们的行为有本质区别

核心区别

计算方式是否继承实际效果
line-height: 1无单位数值。计算为 当前元素字体大小 × 1继承计算后的数值。子元素继承的是一个绝对数值(如 16px)。推荐使用。行为可预测,是设置行高的最佳实践。
line-height: 100%百分比。计算为 当前元素字体大小 × 100%继承计算表达式。子元素继承的是 100% 这个百分比值不推荐用于 line-height。在子元素上会基于子元素自身的字体大小重新计算,可能导致意外结果。

详细解释与示例

1. line-height: 1 (推荐)

  • 计算line-height = font-size × 1
  • 继承:子元素继承的是一个具体的像素值(或计算后的绝对值)。
<div class="parent">
    父元素文本
    <span class="child">子元素文本</span>
</div>
.parent {
    font-size: 16px;
    line-height: 1; /* 计算为 16px × 1 = 16px */
}

.child {
    font-size: 24px; /* 子元素字体更大 */
    /* line-height 继承自父元素,是 16px 这个具体值 */
}
  • 结果
    • .parent 的行高 = 16px
    • .child 的行高 = 16px(继承了父元素计算后的绝对值)。
    • 问题:子元素的行高 (16px) 小于其字体大小 (24px),文字会被挤压,非常难看!

注意:这个例子说明了即使使用 line-height: 1,如果子元素字体变大,也可能出现问题。但关键是继承的是一个固定值

2. line-height: 100% (不推荐)

  • 计算line-height = 当前元素 font-size × 100%
  • 继承:子元素继承的是 100% 这个百分比符号,然后基于自己的 font-size 重新计算。
.parent {
    font-size: 16px;
    line-height: 100%; /* 计算为 16px × 100% = 16px */
}

.child {
    font-size: 24px;
    /* 继承了 line-height: 100%,所以它的行高 = 24px × 100% = 24px */
}
  • 结果
    • .parent 的行高 = 16px
    • .child 的行高 = 24px(基于自己的字体大小重新计算)。
    • 结果更合理:每个元素的行高都等于自己的字体大小。

看似 100% 更好? 不一定。如果父元素 font-size: 16px, line-height: 100%,子元素 font-size: 12px,那么子元素行高就是 12px,可能太紧凑。


关键对比与最佳实践

场景line-height: 1line-height: 100%
父元素行高 = font-size × 1行高 = font-size × 100% (结果相同)
子元素继承继承一个固定数值 (如 16px)继承一个百分比 (100%),基于自身 font-size 重新计算
可预测性✅ 高。继承的是绝对值。❌ 低。子元素行高取决于其自身字体大小,行为复杂。
推荐度✅✅✅ 强烈推荐不推荐用于 line-height

为什么 line-height: 1 是最佳实践?

  1. 无单位数值是相对的:它相对于当前元素font-size 计算。
  2. 继承的是计算结果:子元素继承的是一个数字,然后这个数字会相对于子元素自己的 font-size 再次应用。
    • 如果父元素 line-height: 1.5, font-size: 16px (行高=24px)。
    • 子元素 font-size: 20px
    • 子元素的行高 = 20px × 1.5 = 30px
    • 这正是我们期望的:行高与字体大小成比例。

line-height: 100% 的正确用途

line-height: 100%line-height 上表现不佳,但它在其他属性上很常用,例如:

/* 让元素高度严格等于字体大小 */
.element {
    font-size: 16px;
    line-height: 100%; /* 高度 ≈ 16px */
    height: 100%; /* 高度基于父元素,但 line-height 限制了内容高度 */
}

但这通常不是好做法,容易导致文字溢出。


总结回答示例

line-height: 1line-height: 100% 的主要区别在于继承机制

  • line-height: 1 是一个无单位数值,它基于当前元素的 font-size 计算出行高,并且子元素继承的是这个计算后的绝对值
  • line-height: 100% 是一个百分比,它也基于当前元素 font-size 计算,但子元素继承的是 100% 这个百分比值,会基于子元素自身的 font-size 重新计算。

虽然两者在父元素上效果可能相同,但由于继承行为的差异,line-height: 100% 在复杂嵌套中可能导致不可预测的结果。因此,强烈推荐使用无单位数值(如 1, 1.5, 2)来设置 line-height,这是最佳实践。

THE END
喜欢就支持一下吧
点赞6 分享