HTML 相关
CSS 相关
长度单位 px、em 和 rem 的区别是什么?
这三者的区别在于它们所依据的参考基准不同。
1. px (像素)
- 定义:绝对单位。1px 代表屏幕上的一个物理像素点。
- 特点:
- 固定值:无论父元素或根元素如何设置,
10px就永远是10px。 - 精确控制:非常适合需要精确尺寸的场景,例如边框宽度、图标大小等。
- 不灵活:在响应式设计中,完全使用 px 会使得字体和布局难以随屏幕大小或用户设置而自适应调整。
- 固定值:无论父元素或根元素如何设置,
示例:
.element {
font-size: 16px; /_ 永远显示为 16 像素 _/
padding: 10px; /_ 永远显示为 10 像素 _/
}2. em
- 定义:相对单位。它的值不是固定的,而是相对于当前元素的直接父元素的字体大小。
- 计算规则:
- 如果当前元素设置了
font-size,1em就等于父元素的font-size值。 - 如果当前元素没有设置
font-size,则会一直向上继承,最终相对于根元素的font-size。 - 注意:当 em 用于非
font-size属性(如width,margin,padding)时,它是相对于当前元素本身的font-size。
- 如果当前元素设置了
- 特点:
- 继承性:具有层级关系,会受到所有父级元素字体大小的影响。
- 适合局部缩放:非常适合用于组件内部的相对缩放。例如,在一个模块内,希望行高和边距都与模块的字体大小成比例。
示例:
假设父元素 <div class="parent"> 的 font-size 为 20px。
.parent {
font-size: 20px;
}
.child {
font-size: 1.5em; /_ 计算为 20px * 1.5 = 30px _/
margin: 2em; /_ 计算为 30px * 2 = 60px (相对于自身的 font-size) _/
padding: 0.5em; /_ 计算为 30px * 0.5 = 15px (相对于自身的 font-size) /
}3. rem (Root Em)
- 定义:相对单位。它的值相对于文档的根元素(通常是
<html>) 的字体大小。 - 计算规则:
1rem=<html>元素的font-size值。- 默认情况下,浏览器的根元素字体大小通常是
16px,所以1rem = 16px。
- 特点:
- 一致性:避免了 em 的多层嵌套问题,整个页面中的
1rem在任何地方都是相同的大小。 - 易于控制和缩放:只需改变
<html>元素的font-size,整个使用 rem 的布局都会按比例缩放。这使得实现响应式布局变得非常简单。 - 可访问性:尊重用户的浏览器默认字体设置。如果用户放大了浏览器字体,整个布局也能良好地适配。
- 一致性:避免了 em 的多层嵌套问题,整个页面中的
示例:
设置根元素字体大小为 10px(方便计算,1.6rem 就是 16px),然后定义一个卡片。
html {
font-size: 10px; /* 1rem = 10px */
}
.card {
font-size: 1.6rem; /* 计算为 16px *_*/
padding: 2rem; /*_* 计算为 20px *_*/
margin: 1rem; /*_* 计算为 10px *_*/
}
/* 即使.card 在另一个 font-size 为 20px 的父元素中,它的 rem 值依然只参考 html 的字体大小 */总结与对比
| 特性 | px | em | rem |
|---|---|---|---|
| 参考基准 | 设备像素 | 父元素的 font-size | 根元素(<html>) 的 font-size |
| 继承性 | 无 | 有,受多层父元素影响 | 无,只受根元素影响 |
| 计算复杂度 | 简单,固定值 | 复杂,需要关注上下文层级 | 简单,全局统一 |
| 适用场景 | 边框、固定大小的图标 | 组件内部、与父元素字体成比例的元素 | 全局布局、间距、字体,响应式设计 |
| 响应式 | 差 | 中等(需管理好层级) | 优秀(只需修改根字体大小) |
如何选择?
-
使用
rem:用于大多数情况,特别是布局、边距、内边距和字体大小。这能确保整个设计的一致性并简化响应式开发。 -
使用
em:用于需要与其直接上下文(父元素字体大小)紧密相关的设计。例如:- 按钮的内边距和大小相对于按钮的字体大小。
- 在一个标题旁边的小图标,其大小相对于标题的字体。
- 实现文本缩进或某些特定比例的效果。
-
使用
px:用于绝对不应该被缩放的元素。最常见的就是border(边框)、box-shadow(盒阴影)以及一些固定大小的图片或图标。
最佳实践:很多开发者会将根元素 (html) 的 font-size 设置为 62.5%(因为浏览器默认通常是 16px,16px * 0.625 = 10px)。这样之后,1rem 就等于 10px,1.6rem 就等于 16px,计算起来非常直观方便。
CSS 选择器优先级
详细可阅读:CSS 选择器优先级和覆盖样式
遵循顺序:
通配符/继承样式 > 元素/伪元素选择器 > 类/属性/伪类选择器 > ID 选择器 > 内联样式 > !important 声明
从低到高:
/* 权重: 0-0-0-1 */
p { color: black; }
/* 权重: 0-0-1-0 */
.text { color: blue; }
/* 权重: 0-0-1-1 */
p.text { color: green; }
/* 权重: 0-1-0-0 */
#header { color: red; }
/* 权重: 0-1-1-1 */
#header p.text { color: purple; }
/* 权重: 1-0-0-0 (内联样式) */
<p style="color: orange;">内容</p>