05颜色与单位
CSS 里出现频率最高的两类值:颜色和长度。 颜色有四种写法外加一个「变色龙」关键字;长度单位分绝对与相对两派—— 弄懂「百分比到底相对谁」这个反直觉问题,你才算真正摸到了 CSS 的脾气。
一、颜色的四种写法
给 color、background、border 上色,
写法有四种:颜色关键字(keyword)、十六进制(hexadecimal)、
rgb()、hsl()。它们只是「同一个颜色的四张名片」,表达能力完全等价。
十六进制 #rrggbb 每两位表示红 / 绿 / 蓝通道,范围 00~FF(即 0~255);
三位缩写 #f80 每位自动翻倍,等价于 #ff8800。
hsl() 三个参数是色相(hue,0~360 的色环角度)、饱和度(saturation,%)、亮度(lightness,%),
想调「同一色系的深浅」,改第三个数就行,比 hex 直观得多。
| 写法 | 示例 | 特点与场景 |
|---|---|---|
| 关键字 | tomato、steelblue | 140+ 个预定义名字,学习演示方便;正式项目少用 |
| 十六进制 | #FF6347;#f80 = #ff8800 | 设计稿取色标配,两位一组对应 R / G / B |
| rgb() | rgb(255, 99, 71) | 0~255 三通道直写;要配透明度用 rgba() |
| hsl() | hsl(9, 100%, 64%) | 色相 + 饱和度 + 亮度,调同色系深浅最顺手 |
.sw-hsl 里的 9(色相)改成 210,只有它变成蓝色系二、透明度:给颜色开个「天窗」
每种颜色写法都能追加第四个参数——alpha 透明度,
取值 0(全透明)~1(不透明):
rgba()、hsla()、8 位十六进制
(#B8552F80 的 80 = 128/255 ≈ 50%)。
还有一个特殊关键字 transparent,等价于全透明的黑。
.ov-b 的 .55 改成 1,它和左边实心盒再无区别;改成 .2 看棋盘格透得更多#B8552F
rgba .55
#B8552F66
transparent / rgba 的透明度只作用于「这一个颜色值」;
而 opacity: 0.5 会让整个元素连同里面的文字、图片一起变透明。
想要「背景透、字不透」,用 rgba 背景,别用 opacity。三、currentColor:跟着 color 走的「变色龙」
currentColor 是一个特殊关键字,代表当前元素 color 的计算值。
边框、阴影、下划线……哪里写了它,哪里就自动跟随 color 变色。
冷知识:border 省略颜色时,默认值就是 currentColor。
.cham 的 color 改成 #4E7A52,边框、投影、下划线、圆点一起变绿——它们都没写死颜色变色龙卡片
边框、投影、下划线、圆点都没写颜色值——它们全部吃 color 这一套。
fill="currentColor"——
图标放进按钮就是按钮的文字色,放进导航就是导航色,一份图标走天下。四、绝对单位 px:它其实不是「物理像素」
px 是 CSS 的参考像素(reference pixel),
不是屏幕上的物理发光点。浏览器按设备像素比(devicePixelRatio)自动换算:
普通屏 1px = 1 个物理像素,2 倍 Retina 屏 1px = 2 个物理像素。
所以你写的 1px 细线在高清屏上依然锐利——映射的事浏览器包了。
| 单位 | 含义 | 使用场景 |
|---|---|---|
| px | CSS 参考像素 | 网页唯一常用,其余基本只出现在打印样式表 |
| pt | 磅,1pt = 1/72 英寸 | 打印文档、Word 字号 |
| cm / mm | 厘米 / 毫米 | 打印样式表 |
| in | 英寸,1in = 96px | 打印样式表 |
.px-b 的 width 改成 200px 看它精确变化;拖动浏览器窗口,三个盒子一像素都不会变五、相对单位用在布局上:% 到底相对谁
相对单位的关键永远是「相对谁」。百分比的答案分属性:
width 的 % 相对父元素内容区宽度——好理解;
但 padding 和 margin 的 %,连上下方向都按父元素的宽度算!
这是 CSS 最著名的反直觉设计(好处是水平垂直能用同一把尺)。
| 属性 | % 相对谁 | 备注 |
|---|---|---|
| width | 父元素内容区宽度 | 最常见,符合直觉 |
| padding(含上下) | 父元素宽度 | 反直觉!纵方向也按宽度算 |
| margin(含上下) | 父元素宽度 | 同上,垂直 margin% 也看父宽 |
| height | 父元素高度 | 父元素必须有确定高度,否则失效 |
| font-size | 父元素字号 | 详见第 03 课 |
.parent 的 width 改成 400px,child 的 padding-top 跟着变大——纵方向的 % 竟然按父宽度算padding-top:25%
父宽 300px → 子宽 150px、上内边距 75px(是的,上下 padding 的 % 也按父【宽度】算)
em 和 rem 也能用在布局属性上:
em 相对元素自身的 font-size,
rem 相对根元素(html)的 font-size(默认 16px)。
至于它们在字号场景下的换算与选择,详见同章
第 03 课《文本与字体》第二节——这里只看它们在布局上的表现:
.btn-em 的 font-size 改成 22px:它的 padding、圆角全部等比变大;旁边 rem 按钮纹丝不动height: 50% 经常「无效」:父元素高度如果是被内容撑开的(auto),
子元素的高度百分比就无从算起。要么给父元素定高,要么改用别的方式。六、视口单位 vw / vh:拿浏览器窗口当尺子
视口(viewport)就是浏览器的可视区域。1vw = 视口宽度的 1%,1vh = 视口高度的 1%;
vmin / vmax 取两者中较小 / 较大的那个。
配上一句 clamp(最小值, 首选值, 最大值),就能写出「随窗缩放但不失控」的流体字号。
| 单位 | 含义 | 典型用途 |
|---|---|---|
| vw | 视口宽度的 1% | 流体字号、通栏横幅 |
| vh | 视口高度的 1% | 满屏 hero 区:100vh |
| vmin | vw、vh 中较小者 | 横竖屏切换都安全的尺寸 |
| vmax | vw、vh 中较大者 | 较少用,特殊装饰 |
clamp() 锁死在 12~18px 之间标题字号:6vw
副标题:clamp(12px, 2.5vw, 18px) —— 拖中间分隔条试试
100vw 包含滚动条的宽度!页面出现纵向滚动条时,
写 width: 100vw 会横向溢出几个像素。正文容器用 width: 100% 更安全。七、calc():混合单位的四则运算
calc() 让不同单位直接做加减乘除,最经典的场景是
「100% 减去一个定宽」——比如固定侧栏 + 弹性主栏的布局。
语法红线:+ 和 - 两侧必须有空格,否则整条声明失效。
calc(100% - 176px) 里的 176px 改成 240px 看主栏变窄;删掉减号两侧的空格——整条声明直接失效calc(100% - 176px)
固定 160px
八、本章小结
- 颜色四写法等价:关键字、十六进制(
#f80=#ff8800)、rgb()、hsl();调同色系深浅首选 hsl。 - 透明度四通道:rgba / hsla / 8 位 hex /
transparent;只透颜色用它们,整体透明才用opacity。 currentColor跟随当前 color;border 省略颜色时默认值就是它。px是参考像素而非物理像素,高清屏映射交给浏览器。- 反直觉重点:
padding/margin的 % 连上下方向都按父元素宽度计算。 em跟自身 font-size 走,rem只认根元素;非字号场景同样成立。- 视口单位 vw / vh 做流体排版,
clamp()负责兜底上下限;100vw小心滚动条。 calc()混合单位运算,+/-两侧空格是语法红线。
calc(100% - 32px),内边距用 4%——
然后拖窄父容器,验证上下 padding 也跟着宽度一起缩水。