CSS 面试题 目录

请解释 em 和 rem 的区别。在实际开发中,你会如何选择使用它们?

推荐答案

emrem 都是 CSS 中用于设置长度单位的相对单位,它们的主要区别在于它们相对的参照物不同:

  • em: 相对于当前元素font-size 计算。如果当前元素没有设置 font-size,则会继承父元素的 font-size。这意味着 em 的大小会层层嵌套地受父元素的影响,导致计算变得复杂。

  • rem: 相对于 根元素 (html)font-size 计算。无论元素嵌套层级多深,rem 的大小始终相对于根元素的 font-size。这使得 rem 的大小更加可控和易于管理。

实际开发中的选择:

在实际项目中,强烈推荐使用 rem 作为主要的长度单位,原因如下:

  1. 可预测性: rem 的大小始终基于根元素的 font-size,避免了 em 的层叠计算问题,使得布局更加清晰和易于维护。
  2. 响应式设计: 通过修改根元素的 font-size,可以轻松实现整个网站的缩放,方便适配不同的屏幕尺寸。
  3. 易于维护: 避免了因父元素字体大小变化导致的子元素样式错乱,提高了代码的可维护性。

什么时候考虑使用 em

em 主要适用于以下一些特定的场景:

  1. 局部组件: 当需要某个组件内元素大小相对于组件的字体大小进行调整时,可以使用 em。例如,按钮内部的 padding 可以使用 em 相对于按钮字体大小进行调整。
  2. 媒体查询的断点: 在媒体查询中使用 em 设置断点,可以实现更灵活的响应式布局。

本题详细解读

em 的工作原理

em 的计算方式是: 当前元素的 em 值 * 当前元素的 font-size。如果当前元素没有定义 font-size,会向上继承父元素的 font-size 直到找到一个显式声明的 font-size。这会导致嵌套元素的大小随父元素的字体大小而变化,形成层叠计算。

例如:

在这个例子中,p 标签的字体大小是 16px * 1.5 = 24px。而 span 标签的字体大小是 24px * 1.5 = 36px,因为它是相对于父元素 p 的字体大小计算的。

rem 的工作原理

rem 的计算方式是: 元素的 rem 值 * 根元素的 font-size。 根元素通常是 <html> 元素,或者在某些特殊情况下会被覆盖。rem 的大小不会受其他父元素字体大小的影响,始终保持一致。

例如:

在这个例子中,p 标签和嵌套的 p 标签的字体大小都是 16px * 1.5 = 24px。无论嵌套层级多深,它们的 font-size 都始终相对于根元素的 font-size

为什么推荐使用 rem

  1. 减少复杂性: em 的层叠计算容易导致布局混乱,尤其在大型项目中,而 rem 可以避免此类问题。
  2. 统一缩放: 通过只修改根元素的 font-size,就可以实现整个网站的整体缩放,更容易适配不同屏幕尺寸,实现响应式设计。
  3. 可维护性: rem 的大小总是基于根元素,使其更容易理解和维护。

何时使用 em

虽然 rem 更常用,但 em 在某些场景下依然有用:

  1. 组件内部: 在组件内部,可以使用 em 来控制组件内部元素的相对大小,例如按钮内部的 padding,使其根据字体大小变化而调整。
  2. 媒体查询: 在媒体查询中使用 em 作为断点,可以相对于浏览器的默认字体大小进行断点设置,让响应式布局更加灵活。例如,可以使用 em 设置当浏览器默认字体放大时,页面布局进行相应的调整。

总结来说,优先使用 rem,在需要局部控制或者特定场景时考虑使用 em

纠错
反馈