CSS单位终极对决:PX、EM、REM、VW/VH - 看完这篇不再迷茫!🎯

235 阅读3分钟

还在为选择CSS单位头疼? 解锁 PX、EM、REM、VW/VH 的秘密,轻松打造响应式布局!💻✨


一、单位家族全解析 🌟

1. PX(像素) - 绝对单位元老 📏

.box {
  width: 300px; /* 固定尺寸 */
  font-size: 16px; /* 不受其他因素影响 */
}

特点

  • 绝对单位,1px=1个物理像素点 🔲
  • 优点:精确控制,设计稿1:1还原 ✅
  • 缺点:无法自适应不同屏幕 🚫

2. EM - 相对单位继承者 🔗

.container {
  font-size: 20px; /* 基准值 */
}

.title {
  font-size: 2em; /* 40px (20×2) */
  margin: 0.5em; /* 20px (40×0.5) */
}

特点

  • 相对父元素字体大小 🔄
  • 复合效果(层层相乘)⚙️
  • 适用场景:按钮内边距、图标尺寸 🖼️

3. REM - 根相对单位新贵 🌱

html {
  font-size: 62.5%; /* 1rem=10px (16×0.625) */
}

.card {
  width: 24rem; /* 240px */
  padding: 1.6rem; /* 16px */
}

特点

  • 相对根元素(html)字体大小 🌳
  • 不受父元素影响 🚀
  • 响应式布局核心单位 💪

4. VW/VH - 视口比例单位 🖥️

.hero-section {
  height: 100vh; /* 视口高度的100% */
  width: 80vw; /* 视口宽度的80% */
  font-size: 5vmin; /* 取视口宽高中较小值的5% */
}

特点

  • 1vw = 1%视口宽度 📐
  • 1vh = 1%视口高度 📏
  • 完美适配各种屏幕 🌍

二、单位对比表(决策指南) 📊

单位相对基准响应式继承影响典型应用场景
PX绝对单位边框、固定元素
EM父元素字体大小按钮内边距、局部缩放
REM根元素字体大小全局布局、间距
VW视口宽度全屏组件、宽度适配
VH视口高度全屏高度、垂直居中
%父元素尺寸传统流式布局

三、实战代码秘籍 🛠️

场景1:完美响应式布局(REM + VW) 📱💻

/* 动态根字体大小(移动端适配) */
html {
  font-size: calc(100vw / 37.5); /* 设计稿750px: 100vw/37.5=20px */
}

@media (min-width: 768px) {
  html {
    font-size: calc(100vw / 120); /* PC端调整比例 */
  }
}

/* 使用REM定义元素 */
.card {
  width: 18rem; /* 自动适配 */
  padding: 1.2rem;
}

场景2:全屏轮播图(VH + VW) 🎠

.slider {
  height: 100vh;
  width: 100vw;
  
  .slide {
    height: 80vh; /* 保持比例 */
    width: auto;
  }
  
  .caption {
    font-size: 5vmin; /* 自动缩放文本 */
  }
}

场景3:复合单位高级应用 🧩

/* 基于REM的间距 + EM的局部缩放 + VW的宽度限制 */
.article {
  max-width: 60rem; /* 960px (16px基准) */
  margin: 0 auto;
  padding: 2rem;

  .intro {
    font-size: 1.25em; /* 相对父级缩放 */
    margin-bottom: 1.5em;
  }

  @media (max-width: 480px) {
    width: 90vw; /* 小屏宽度自适应 */
  }
}

四、避坑指南(血泪经验) 🚨

陷阱1:EM的复合继承问题 😵

/* 错误示范 */
.parent { font-size: 20px; }
.child { font-size: 0.8em; } /* 16px */
.grandchild { font-size: 0.8em; } /* 12.8px! */

/* 解决方案:使用REM重置 */
.grandchild {
  font-size: 0.8rem; /* 回归根基准 */
}

陷阱2:VH在移动端的异常 📴

/* 移动端地址栏导致100vh超出 */
.modal {
  /* height: 100vh; 可能滚动 */
  height: 100dvh; /* 新标准! */
}

陷阱3:REM基准值被覆盖 ⚠️

// 动态计算时避免冲突
document.documentElement.style.setProperty(
  'font-size', 
  `${window.innerWidth / 37.5}px`
);

五、2024年最佳实践方案 🚀

  1. 全局布局:REM为主(间距、宽度、高度) 📐
  2. 字体系统
    /* 基准 + REM + 媒体查询 */
    html { font-size: 62.5%; }
    body { font-size: 1.6rem; }
    
    h1 { font-size: 3.2rem; }
    
    @media (max-width: 768px) {
      h1 { font-size: 2.4rem; }
    }
    
  3. 全屏元素:VH/DVH + VW 🌍
  4. 精细控制:PX用于边框、阴影等 🎨
  5. 组件内部:EM实现局部响应 🔗

六、单位转换神器(收藏必备) 🧰

// SCSS转换函数
@function rem($px) {
  @return ($px / 16) * 1rem;
}

@function vw($px) {
  @return ($px / 1920) * 100vw; // 基于设计稿宽度
}

// 使用示例
.button {
  padding: rem(12) rem(24);
  width: vw(300);
}

结语:智慧选择,优雅适配 🎨

真正的高手从不会死守单一单位,而是像调色师一样混合使用:

  • REM 搭建布局骨架 🏗️
  • EM 创造组件内部和谐 🎶
  • VW/VH 实现全屏魔法 ✨
  • PX 点缀精致细节 🎁

黄金公式

全局基准用REM,局部缩放用EM,视口比例VW/VH,精细控制PX上! 💡

现在,面对设计稿,你不再迷茫,而是自信满满:“主框架用REM,图标用EM,全屏交给VH!” 🚀

【思考题】如何结合CSS单位与媒体查询实现复杂响应式设计?欢迎分享你的创意!💬


#CSS #单位 #PX #EM #REM #VW #VH #响应式设计 #前端开发 #最佳实践