什么是 CSS 单位转换?
CSS 单位转换器是一种将长度值在不同 CSS 测量体系之间相互转换的工具。CSS 定义了十余种长度单位,分为两类:绝对单位(如 px、pt、cm、in)映射到固定的物理尺寸;相对单位(如 rem、em、vw、vh 和 %)则依赖上下文,例如字体大小或视口尺寸。
浏览器在渲染过程中会将所有 CSS 长度解析为像素。当你写 1.5rem 时,浏览器将 1.5 乘以根字体大小(通常为 16px),得到 24px。当你写 50vw 时,浏览器取当前视口宽度的一半。理解这些换算关系是构建能够跨设备自适应、并尊重用户偏好(例如浏览器中设置的自定义字体大小)的布局的必要基础。
W3C 的 CSS 值与单位模块第四级规范定义了所有绝对单位之间的精确换算比例:1in = 96px = 72pt = 2.54cm = 25.4mm。相对单位没有固定的换算比例,因为它们依赖于运行时的上下文。免费的 CSS 单位转换器可让你在给定具体根字体大小和视口尺寸的情况下即时计算这些换算关系,无需编写任何代码。
为什么使用 CSS 单位转换器?
手动换算 CSS 单位需要记住比例、打开计算器并反复核验结果。本工具在浏览器中完成换算,零摩擦,即用即得。
CSS 单位转换器使用场景
CSS 长度单位参考
CSS 定义了 10 种常用长度单位。绝对单位具有固定的像素换算比例。相对单位依赖上下文:rem 相对于根元素字体大小,em 相对于父级字体大小,vw 和 vh 相对于浏览器视口。
| 单位 | 名称 | 默认大小 | 相对于 |
|---|---|---|---|
| px | Pixel | 1px | Fixed; 1px = 1/96 of 1in on screens |
| rem | Root em | 16px (default) | Relative to <html> font-size |
| em | Em | Inherited | Relative to parent element font-size |
| vw | Viewport width | 1% of viewport | Relative to browser window width |
| vh | Viewport height | 1% of viewport | Relative to browser window height |
| % | Percentage | Varies | Relative to parent property value |
| pt | Point | 1.333px | Print unit; 1pt = 1/72 of 1in |
| cm | Centimeter | 37.795px | Physical unit; 1cm = 96px / 2.54 |
| mm | Millimeter | 3.7795px | Physical unit; 1mm = 1cm / 10 |
| in | Inch | 96px | Physical unit; 1in = 96px (CSS spec) |
绝对单位与相对单位
选择绝对单位还是相对单位,会影响布局在不同屏幕和用户设置下的响应方式。两类单位各有不同的权衡取舍。
常用 px 转 rem 换算表
下表假设根字体大小为 16px(浏览器默认值)。如果你的项目使用不同的基础值,则将像素值除以你的基础值即可得到 rem 等效值。
| px | rem | pt | 典型用途 |
|---|---|---|---|
| 10 | 0.625 | 7.5 | Small caption text |
| 12 | 0.75 | 9 | Body text (compact) |
| 14 | 0.875 | 10.5 | Default body text |
| 16 | 1 | 12 | Root font-size (browser default) |
| 18 | 1.125 | 13.5 | Large body text |
| 20 | 1.25 | 15 | H4 heading |
| 24 | 1.5 | 18 | H3 heading |
| 32 | 2 | 24 | H2 heading |
| 48 | 3 | 36 | H1 heading |
| 64 | 4 | 48 | Display / hero text |
代码示例
以下示例展示如何在 JavaScript、Python、CSS 自定义属性和 Sass 中以编程方式转换 CSS 单位。
// px to rem (given root font-size of 16px) const pxToRem = (px, base = 16) => px / base pxToRem(24) // → 1.5 // rem to px const remToPx = (rem, base = 16) => rem * base remToPx(1.5) // → 24 // px to vw (given viewport width of 1440px) const pxToVw = (px, viewport = 1440) => (px / viewport) * 100 pxToVw(360) // → 25 // Dynamic calculation using getComputedStyle const rootFontSize = parseFloat( getComputedStyle(document.documentElement).fontSize ) // → 16 on most browsers
# CSS unit converter functions
def px_to_rem(px: float, base: float = 16) -> float:
return px / base
def rem_to_px(rem: float, base: float = 16) -> float:
return rem * base
def px_to_vw(px: float, viewport: float = 1440) -> float:
return (px / viewport) * 100
def px_to_pt(px: float) -> float:
return px * 72 / 96
print(px_to_rem(24)) # → 1.5
print(rem_to_px(2.5)) # → 40.0
print(px_to_vw(720)) # → 50.0
print(px_to_pt(16)) # → 12.0/* Define a base scale using rem */
:root {
--base: 16px; /* root font-size */
--space-1: 0.25rem; /* 4px */
--space-2: 0.5rem; /* 8px */
--space-4: 1rem; /* 16px */
--space-8: 2rem; /* 32px */
}
/* Fluid typography: scales between 1rem (16px) and 2.5rem (40px) */
h1 {
font-size: clamp(1rem, 2.5vw + 0.5rem, 2.5rem);
}
/* Viewport-relative hero height */
.hero {
height: calc(100vh - 4rem); /* full viewport minus 64px header */
}
/* Percentage-based grid */
.sidebar { width: 25%; } /* 360px on 1440px screen */
.content { width: 75%; } /* 1080px on 1440px screen */// Reusable px-to-rem function in Sass
@use "sass:math";
$base-font-size: 16px !default;
@function rem($px) {
@return math.div($px, $base-font-size) * 1rem;
}
// Usage
.card {
padding: rem(24px); // → 1.5rem
margin-bottom: rem(32px); // → 2rem
border-radius: rem(8px); // → 0.5rem
font-size: rem(14px); // → 0.875rem
}