← 课程 目录 CSS 课堂演示 · 第 4 章 颜色·单位·变量

CH 04 · 对应教材单元四

颜色 · 单位 · 变量

颜色怎么写才规范?px、em、rem 各管什么?CSS 变量怎么实现「一处定义、处处生效、一键换肤」?

4.1颜色的四种写法

同一个陶土红,四种表达:关键字、十六进制、rgb()、hsl()。

#B04A2C
十六进制
最常用
rgb(176,74,44)
RGB 函数
三通道 0-255
hsl(14,60%,43%)
HSL 函数
调亮暗最直观
rgba(...,.55)
半透明
第四位 0-1
.sw1 { background: #B04A2C; }          /* 十六进制 */
.sw2 { background: rgb(176,74,44); }   /* 等价的 RGB */
.sw3 { background: hsl(14,60%,43%); }  /* 色相14° 饱和60% 亮度43% */
.sw4 { background: rgba(176,74,44,.55); } /* + 55% 透明 */

/* hsl 的好处:色相不变,
   只调第三个数字就能出
   同色系的深浅层次 */

十六进制支持缩写:#FF0000 可写 #F00。设计稿取色一般直接给 #RRGGBB,粘过来就能用。

4.2绝对单位与相对单位

px 是死尺寸;% 跟着父元素走;em 跟着自己字号走;rem 跟着根元素走。

width: 160px(定死)
width: 50%(父元素的50%)
width:12em · font-size:12px → 实际 144px
width: 12rem → 恒等于 192px
.u-px  { width: 160px; }   /* 绝对:屏幕上量多少就是多少 */
.u-pct { width: 50%; }     /* 相对父元素宽度 */
.u-em  { width: 12em; }    /* 相对「自己」的 font-size
                              (12px × 12 = 144px) */
.u-rem { width: 12rem; }   /* 相对根元素 html 的 font-size
                              (16px × 12 = 192px,全站统一) */

/* 拖窄窗口试试:px 不动,
   % 跟着容器缩 */

经验:字号用 rem、组件内间距用 em、宽度栅格用 %,做响应式才不乱。

4.3em 与 rem 的取值现场

1.5em 和 1.5rem 差在哪?em 会「继承父级的字号」再放大,rem 永远锚定根字号。

父元素 font-size: 16px

font-size: 1.5em → 若父级是 16px,我就是 24px;父级若变大,我也跟着膨胀

font-size: 1.5rem → 永远是 16×1.5 = 24px,谁也影响不了我

套两层嵌套列表用 em 会「指数放大」,用 rem 才稳。

/* em:相对「父元素(继承来)的字号」 */
.em-p { font-size: 1.5em; }

/* rem:相对根元素 html 的字号,
   默认 16px */
.rem-p { font-size: 1.5rem; }

/* em 的经典翻车:
   嵌套 li 里 font-size:0.8em
   一层套一层,越套越小 */

老项目改版常用一招:html{font-size:62.5%} 让 1rem = 10px,方便心算。

4.4CSS 变量:一键换肤看三个色块同一套变量

把颜色存进 --变量,:root 定义全站用,局部重定义就是「换主题」。

主题一 · 陶土红

标题和按钮颜色都来自 --td-brand。

主题二 · 松石绿

同一套 CSS,只换了三个变量的值。

主题三 · 赭黄

这就是网站的深色模式原理。

/* 1. 在 :root 里定义(全局可用) */
:root {
  --td-brand: #B04A2C;   /* 主色 */
  --td-bg: #FFFDF8;      /* 底色 */
  --td-ink: #2B2520;     /* 文字色 */
}

/* 2. 处处引用 */
.theme-demo .bar { background: var(--td-brand); }
.theme-demo .body { background: var(--td-bg); }
.theme-demo p { color: var(--td-ink); }

/* 3. 换肤 = 换变量值,
   用到它的地方全部跟着变 */
.theme-demo.sw2 {
  --td-brand: #3F6E6A;
  --td-bg: #EFF5F3;
  --td-ink: #23403D;
}

本站顶栏的「深色模式」按钮,就是用 JS 切换 data-theme 属性 + 一组变量实现的,原理一模一样。

4.5calc():让单位之间做算术

百分比和像素能直接加减——「比容器窄 80px」这种需求一行的写完。

width: calc(100% - 80px)
虚线框多宽,我就比它窄 80px —— 拖动窗口看它自适应
/* 百分比 - 像素,混算合法 */
.card {
  width: calc(100% - 80px);
}

/* 常见用途:自适应 + 固定侧栏 */
.main {
  width: calc(100% - 240px);  /* 扣掉侧栏 */
}

/* 注意:减号两边必须有空格!
   calc(100%-80px) 是非法的 */

calc() 也能乘除数字,如 calc(100% / 3) 三等分——不过布局任务交给第 8 章的 Flex/Grid 更省心。