构建一个 web 项目时,通过 :root 定义 CSS 变量 (css custom Properties) 可以统一设计体系、提升可维护性
颜色体系
颜色变量需覆盖品牌色、功能色、状态色、文本/背景等,多使用 「用途 + 场景」 命名方式。
品牌主色 (Brand Colors)
- 主品牌色(核心视觉色,用于按钮、关键交互):
--color-primary: #2563eb;(蓝色系) - 主体的变体(浅/深/透明):
--color-primary-light: #eff6ff;(浅)--color-primary-dark: #1d4ed8;(深)--color-primary-50: #f0f9ff;(透明)
- 辅助品牌色(次核心,用于标签、次要操作):
--color-secondary: #8b5cf6;(辅助)
功能色(Functional Colors)
- 成功/完成状态:
--color-success: #22c55e;(绿色) - 警告/注意状态:
--color-warning: #f59e0b;(橙色) - 错误/危险状态:
--color-error: #ef4444;(红色) - 信息/提示状态:
--color-info: #06b6d4;(青色)
中性色(Neutrals)
- 文本色(不同层级,如标题/正文/辅助文本):
--color-text-primary: #111827;(深灰)--color-text-secondary: #4b5563;(中灰)--color-text-tertiary: #6b7280;(浅灰)
- 背景色(页面/容器/分隔线):
--color-bg-primary: #ffffff;(白)--color-bg-secondary: #f8fafc;(浅白)--color-border: #e5e7eb;(边框灰)
- 禁用状态:
--color-disabled: #f3f4f6;(禁用背景)--color-disabled-text: #9ca3af;(禁用文本)
扩展支持
- 可动态切换的变量(通过 JS 修改 :root 变量实现主题切换):
--color-bg-primary: var(--color-bg-primary-light);(默认浅色模式)--color-text-primary: var(--color-text-primary-dark);(默认深色模式)
色系
不同的色系带给用户的视觉效果不同、展现网站的风格不同
蓝色系
- 纯蓝色(#0000FF)常用于标题、重要提示信息等,以突出显示内容。例如,在新闻网站中,文章的标题可以使用纯蓝色,在不同背景下都能让用户快速识别。
- 天蓝色(#87CEEB)) 适合用于正文文本,既不会过于刺眼,又能保证在不同背景下的可读性。比如,在一些文艺风格的网站中,天蓝色的正文文本能营造出温馨的氛围。
其他蓝色:
- 天蓝色
--blue-azure: #0080ff; - 蔚蓝色
--blue-blue: #246bfb; - 浅蓝色
--blue-light: #e0ffff; - 海军蓝
--blue-navy: #000080; - 海蓝色
--blue-ocean: #00456b; - 浅海蓝
--blue-: #a1d8e6; - 鸭翅绿
--blue-: #008080;
绿色系
- 纯绿色(#008000)
- 效果:在白色背景上,纯绿色显得生机勃勃;在黑色背景下,它同样清晰可见,能传达出积极、健康的信息。
- 使用建议:可用于表示成功、安全等含义的文本,如注册成功提示、系统正常运行状态等。
- 草绿色 (#7CFC00)
- 效果:草绿色比较明亮,在白色背景下具有一定的视觉冲击力;在黑色背景下,它能提供很好的对比度,使文本易于阅读。
- 使用建议:适合用于需要强调的部分,如活动的限时优惠信息等。
橙色系
- 橙色(#FFA500)
- 效果:橙色是一种非常醒目的颜色,在白色背景下十分耀眼;在黑色背景下,它能与黑色形成鲜明对比,吸引用户的目光。
- 使用建议:常用于突出重要操作按钮上的文本,如“立即购买”“下载”等,提高用户的点击率。
- 淡橙色(#FFB90F)
- 效果:淡橙色相对柔和一些,在白色背景下给人一种温暖的感觉;在黑色背景下,也能清晰地显示文本内容。
- 使用建议:可用于导航栏的链接文本,让用户在不同背景下都能轻松找到导航入口。
紫色系
- 深紫色(#800080)
- 效果:在白色背景下,深紫色显得高贵、神秘;在黑色背景下,它依然具有一定的对比度,能清晰呈现文本。
- 使用建议:适用于一些具有文化、艺术氛围的网站,用于标题或重要段落的文本,增添独特的气质。
- 淡紫色(#EE82EE)
- 效果:淡紫色比较柔和且醒目,在白色背景下有较好的视觉效果;在黑色背景下,也能保证文本的可读性。
- 使用建议:可用于提示性文本,如消息通知等。
其他色
- 暗红 (#900022)
- 米色 (#f0f2e6)
- 橘黄色 (#c99e8c)
- 滇红 (#d80010)
- 浅黄 (#f0f2e5)
- 浅黄 (#f0f2e5)
尺寸与间距(布局的基础单位)
统一间距、字体大小、元素尺寸的变量,避免硬编码数字,方便全局调整。
间距(Spacing)
- 基础单位(建议以
4px或8px为基准,符合多数设计系统):--spacing-unit: 8px; - 衍生间距(通过
calc()组合基础单位,覆盖常用场景):--spacing-1: calc(var(--spacing-unit) * 0.5);(4px)--spacing-2: var(--spacing-unit);(8px)--spacing-4: calc(var(--spacing-unit) * 2);(16px)--spacing-8: calc(var(--spacing-unit) * 4);(32px)--spacing-12: calc(var(--spacing-unit) * 6);(48px)--spacing-16: calc(var(--spacing-unit) * 8);(64px)--spacing-20: calc(var(--spacing-unit) * 10);(80px)--spacing-24: calc(var(--spacing-unit) * 12);(96px)
- 方向性间距(简化调用,如 margin/padding 的简写):
--space-inset-2: var(--spacing-2);(上下左右均为 8px)--space-inset-4: var(--spacing-4);(上下左右均为 16px)--space-inset-squash: var(--spacing-2) var(--spacing-8);(上下 8px,左右 32px)
字体大小(Font Sizes)
基于 rem(根字体大小建议设为 16px,兼容浏览器默认),定义层级:
--font-size-base: 1rem;(16px,正文默认)--font-size-sm: 0.875rem;(14px,辅助文本)--font-size-md: 1.125rem;(18px,小标题)--font-size-lg: 1.5rem;(24px,大标题)--font-size-xl: 2.25rem;(36px,主标题)--font-size-2xl: 3rem;(48px,超大标题)
元素尺寸(Component Sizes)
- 按钮/输入框等组件的高度:
--height-sm: 2rem;(32px,小按钮)--height-md: 2.5rem;(40px,常规按钮)--height-lg: 3rem;(48px,大按钮)
- 输入框内边距:
--input-padding: var(--spacing-2) var(--spacing-4);(8px 16px)
圆角
卡片圆角:
--radius-sm: 0.25rem;(4px,小圆角)--radius-md: 0.5rem;(8px,中等圆角)--radius-card: 0.75rem;(12px,卡片圆角)--radius-full: 100vmax;(全尺寸圆角)
边框
边框配置:
--border-width: 1px;--border-style: solid;--border-color: var(--color-border);
组合使用 border: var(--border-width) var(--border-style) var(--border-color);
阴影(Shadows)
定义不同层次的阴影,用于卡片、模态框、悬停效果等,按「强度」分级。
- 浅阴影(卡片/列表项):
--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05); - 中阴影(模态框/下拉菜单):
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); - 强阴影(弹出层/悬停按钮):
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); - 悬浮阴影(按钮/卡片悬停):
--shadow-hover: 0 2px 8px -1px rgba(0, 0, 0, 0.15);
透明度 (opacity)
配置不同的透明度有助于统一风格和提升用户适应
--opacity-disabled: 0.6;(禁用元素透明度)
字体(Typography)
统一字体家族、字重、行高,提升文字可读性。
- 字体家族(优先系统默认,可选自定义字体):
--font-family-base: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;--font-family-mono: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;(等宽字体) - 字重(对应字体文件的 weight):
--font-weight-light: 300;--font-weight-regular: 400;--font-weight-medium: 500;--font-weight-bold: 700;
- 行高(与字体大小关联,或独立定义):
--line-height-base: 1.5;(常规正文)--line-height-tight: 1.2;(标题)
过渡与动画(Interactions)
统一交互反馈的时间和缓动函数,让操作更流畅。
- 过渡时间:
--transition-fast: 0.1s;(快速反馈,如按钮 hover)--transition-medium: 0.2s;(常规交互,如模态框展开)--transition-slow: 0.3s;(复杂动画)
- 缓动函数:
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);(推荐,符合 Material Design)--ease-out: cubic-bezier(0, 0, 0.2, 1);
响应式断点(Media Queries)
定义全局断点,统一不同屏幕尺寸下的布局逻辑(可选,也可直接在媒体查询中使用变量)。
常用的响应式媒体条件:
@media screen and (min-width: 992px)大屏设备(台式机、笔记本等)@media screen and (max-width: 991px) and (min-width: 768px)平板和小型显示器@media (max-width: 767px)智能手机或小型平板设备@media only screen and (max-width: 768px)only screen 用于排除打印和其他非屏幕媒体类型@media (pointer: fine)输入设备(如鼠标、触控笔)能够精确指向屏幕上的元素@media (prefers-reduced-motion:reduce)减少动画或界面中的运动效果时@media print当文档被打印时@media (hover: hover)当用户的输入设备支持悬停
使用自定义量
- 移动端(小屏):
--breakpoint-sm: 480px; - 平板(中屏):
--breakpoint-md: 768px; - 桌面(大屏):
--breakpoint-lg: 1024px; - 超宽屏:
--breakpoint-xl: 1280px;
// 超大屏
@media screen and (min-width: var(--breakpoint-xl)) {
body {
margin: 100px;
}
}
// 桌面端
@media screen and (min-width: var(--breakpoint-lg)) {
body {
margin: 80px;
}
}
// 平板
@media screen and (max-width: var(--breakpoint-lg)) and (min-width: var(--breakpoint-md)) {
body {
margin: 60px;
}
}
// 手持端机
@media screen and (max-width: var(--breakpoint-md)) {
body {
margin: 40px;
}
}
// 所有的 :hover 放到这里是极好的,省得在触屏手机上残留 `:hover` 样式
// 光标可触发 hover 且光标已就位
@media (hover: hover) and (pointer: fine) {
body:hover {
box-shadow: var(--shadow-hover);
}
}