CSS长度单位分类

绝对单位

  • px - 像素
  • pt - 点(印刷单位)
  • pc - 派卡
  • in - 英寸
  • cm - 厘米
  • mm - 毫米

相对单位

  • em - 相对于父元素字体大小
  • rem - 相对于根元素字体大小
  • % - 百分比
  • vw/vh - 视口宽度/高度
  • vmin/vmax - 视口最小/最大尺寸
  • ex - 相对于字符”x”的高度
  • ch - 相对于字符”0”的宽度

主要单位详解

1. px(像素)

.element {
  width: 200px;        /* 固定200像素 */
  font-size: 16px;     /* 固定16像素字体 */
  margin: 10px;        /* 固定10像素边距 */
}
 
/* 特点:
   ✅ 精确控制
   ✅ 易于理解
   ❌ 不响应用户字体设置
   ❌ 在高DPI屏幕上可能显示过小
*/

2. em(相对于父元素字体大小)

.parent {
  font-size: 20px;
}
 
.child {
  font-size: 1.2em;    /* 20px × 1.2 = 24px */
  margin: 0.5em;       /* 24px × 0.5 = 12px(基于自身字体大小)*/
  padding: 1em;        /* 24px × 1 = 24px */
}
 
/* em的嵌套问题 */
.level1 {
  font-size: 1.2em;    /* 假设父元素16px,这里是19.2px */
}
 
.level1 .level2 {
  font-size: 1.2em;    /* 19.2px × 1.2 = 23.04px */
}
 
.level1 .level2 .level3 {
  font-size: 1.2em;    /* 23.04px × 1.2 = 27.65px(复合增长)*/
}

3. rem(相对于根元素字体大小)

/* 设置根元素字体大小 */
html {
  font-size: 16px;     /* 基准大小 */
}
 
.element {
  font-size: 1.5rem;   /* 16px × 1.5 = 24px */
  margin: 2rem;        /* 16px × 2 = 32px */
  padding: 0.5rem;     /* 16px × 0.5 = 8px */
}
 
/* rem不会复合增长 */
.level1 {
  font-size: 1.2rem;   /* 始终是 16px × 1.2 = 19.2px */
}
 
.level1 .level2 {
  font-size: 1.2rem;   /* 仍然是 16px × 1.2 = 19.2px */
}

4. 百分比(%)

.container {
  width: 800px;
  height: 600px;
  font-size: 20px;
}
 
.child {
  width: 50%;          /* 800px × 50% = 400px */
  height: 25%;         /* 600px × 25% = 150px */
  font-size: 120%;     /* 20px × 120% = 24px */
  
  /* 不同属性参考不同的基准 */
  margin-top: 10%;     /* 参考父元素的宽度:800px × 10% = 80px */
  padding-top: 10%;    /* 也参考父元素的宽度:800px × 10% = 80px */
}

5. 视口单位(vw, vh, vmin, vmax)

.viewport-demo {
  /* 视口宽度单位 */
  width: 50vw;         /* 视口宽度的50% */
  
  /* 视口高度单位 */
  height: 100vh;       /* 视口高度的100%(全屏高度)*/
  
  /* 视口最小尺寸 */
  font-size: 4vmin;    /* min(4vw, 4vh) */
  
  /* 视口最大尺寸 */
  line-height: 6vmax;  /* max(6vw, 6vh) */
}
 
/* 响应式字体示例 */
.responsive-title {
  font-size: calc(2rem + 2vw); /* 基础2rem + 响应式2vw */
}

实际应用场景对比

1. 响应式设计

/* 使用rem的响应式设计 */
html {
  font-size: 16px;
}
 
@media (max-width: 768px) {
  html {
    font-size: 14px;    /* 小屏幕缩小基准字体 */
  }
}
 
.card {
  padding: 1rem;       /* 会随着基准字体缩放 */
  margin: 0.5rem;
  font-size: 1.2rem;
}
 
/* 使用vw的响应式字体 */
.hero-title {
  font-size: calc(1.5rem + 3vw); /* 基础大小 + 视口响应 */
  min-font-size: 1.2rem;          /* 最小字体大小 */
  max-font-size: 3rem;            /* 最大字体大小 */
}

2. 组件设计

/* 按钮组件 - 使用em实现内部比例一致 */
.button {
  font-size: 1rem;     /* 基准大小 */
  padding: 0.5em 1em;  /* 内边距随字体大小缩放 */
  border-radius: 0.25em; /* 圆角也随字体大小缩放 */
}
 
.button--large {
  font-size: 1.25rem;  /* 只需改变字体大小 */
  /* padding和border-radius会自动缩放 */
}
 
.button--small {
  font-size: 0.875rem;
}

3. 布局设计

/* 网格布局 - 混合使用不同单位 */
.grid-container {
  max-width: 1200px;   /* 固定最大宽度 */
  margin: 0 auto;      /* 居中 */
  padding: 2rem 5%;    /* 固定内边距 + 响应式边距 */
  
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 2rem;
}
 
.grid-item {
  padding: 1.5rem;     /* 使用rem保持一致性 */
  min-height: 40vh;    /* 最小高度基于视口 */
}

单位选择指南

1. 字体大小

/* 推荐使用rem */
body {
  font-size: 1rem;     /* 遵循用户浏览器设置 */
}
 
h1 { font-size: 2.5rem; }
h2 { font-size: 2rem; }
h3 { font-size: 1.5rem; }
 
/* 组件内部使用em */
.card {
  font-size: 1rem;
}
 
.card__title {
  font-size: 1.25em;   /* 相对于卡片字体大小 */
}
 
.card__subtitle {
  font-size: 0.875em;
}

2. 间距和尺寸

/* 布局级别使用rem */
.section {
  margin: 4rem 0;      /* 大的间距使用rem */
  padding: 2rem;
}
 
/* 组件级别使用em */
.button {
  padding: 0.5em 1em;  /* 相对于按钮字体大小 */
  margin: 0.25em;
}
 
/* 精确控制使用px */
.border {
  border: 1px solid #ccc;  /* 边框通常使用px */
}
 
.icon {
  width: 24px;         /* 图标固定尺寸 */
  height: 24px;
}

3. 响应式设计

/* 视口单位用于全屏元素 */
.hero {
  height: 100vh;       /* 全屏高度 */
  width: 100vw;        /* 全屏宽度 */
}
 
/* 响应式字体 */
.responsive-text {
  font-size: clamp(1rem, 2.5vw, 2rem); /* 最小1rem,理想2.5vw,最大2rem */
}
 
/* 百分比用于相对布局 */
.sidebar {
  width: 25%;          /* 相对于容器宽度 */
}
 
.content {
  width: 75%;
}

现代CSS函数

/* calc() - 混合单位计算 */
.element {
  width: calc(100% - 2rem);    /* 百分比减去固定值 */
  height: calc(100vh - 4rem);  /* 视口高度减去固定值 */
  font-size: calc(1rem + 0.5vw); /* 固定基础 + 响应式增量 */
}
 
/* clamp() - 响应式数值范围 */
.responsive {
  font-size: clamp(1rem, 4vw, 2rem);     /* 最小值,理想值,最大值 */
  padding: clamp(1rem, 5%, 3rem);
}
 
/* min() / max() - 取最小/最大值 */
.flexible {
  width: min(90%, 800px);      /* 取90%和800px中的较小值 */
  height: max(200px, 30vh);    /* 取200px和30vh中的较大值 */
}

最佳实践总结

推荐的单位选择

  1. 字体大小:优先使用 rem,组件内部使用 em
  2. 布局间距:使用 rem%
  3. 组件内部间距:使用 em
  4. 边框、阴影:使用 px
  5. 响应式设计:使用 vw/vhclamp()
  6. 容器尺寸:使用 %fr(Grid布局)

这样的搭配能够创建既灵活又一致的响应式设计。