Skip to content

css

是的,CSS 中颜色有多种编码格式,每种格式都有其优缺点和适用场景。

CSS 提供了 140+ 预定义颜色名称:

/* 基本颜色 */
.red { color: red; }
.blue { color: blue; }
.green { color: green; }
/* 扩展颜色 */
.light-blue { color: lightblue; }
.dark-red { color: darkred; }
.medium-violet-red { color: mediumvioletred; }

优点:

  • 易读易写
  • 无需记忆数值

缺点:

  • 颜色有限
  • 不够精确

最常用的颜色格式:

/* 6位十六进制 */
.primary { color: #ff0000; } /* 红色 */
.secondary { color: #00ff00; } /* 绿色 */
.accent { color: #0000ff; } /* 蓝色 */
/* 3位十六进制 (简化形式) */
.primary { color: #f00; } /* 等同于 #ff0000 */
.secondary { color: #0f0; } /* 等同于 #00ff00 */
.accent { color: #00f; } /* 等同于 #0000ff */
/* 8位十六进制 (带透明度) */
.transparent-red { color: #ff000080; } /* 红色,50% 透明度 */

优点:

  • 简洁
  • 广泛支持
  • 易于从设计工具复制

缺点:

  • 不直观(难以从代码看出颜色)

基于红绿蓝三原色的颜色模型:

/* RGB (不透明) */
.primary { color: rgb(255, 0, 0); } /* 红色 */
.secondary { color: rgb(0, 255, 0); } /* 绿色 */
.accent { color: rgb(0, 0, 255); } /* 蓝色 */
/* RGBA (带透明度) */
.transparent { color: rgba(255, 0, 0, 0.5); } /* 红色,50% 透明度 */
.semi-transparent { color: rgba(0, 0, 0, 0.8); } /* 黑色,80% 不透明度 */

优点:

  • 直观(RGB 值易理解)
  • 支持透明度
  • 易于编程生成

缺点:

  • 较长
  • 不如十六进制简洁

基于色相、饱和度、亮度的颜色模型:

/* HSL */
.primary { color: hsl(0, 100%, 50%); } /* 红色 */
.secondary { color: hsl(120, 100%, 50%); } /* 绿色 */
.accent { color: hsl(240, 100%, 50%); } /* 蓝色 */
/* HSLA (带透明度) */
.light-red { color: hsl(0, 100%, 75%); } /* 浅红色 */
.dark-blue { color: hsl(240, 100%, 25%); } /* 深蓝色 */
.transparent { color: hsla(0, 100%, 50%, 0.5); } /* 红色,50% 透明度 */

参数说明:

  • 色相 (Hue): 0-360° (0°=红, 120°=绿, 240°=蓝)
  • 饱和度 (Saturation): 0%-100% (0%=灰色, 100%=纯色)
  • 亮度 (Lightness): 0%-100% (0%=黑, 100%=白, 50%=标准)

优点:

  • 直观(易于调整颜色)
  • 易于创建颜色变体
  • 支持透明度

缺点:

  • 较新,旧浏览器支持有限

基于 LCH 颜色空间的现代颜色格式,提供了更直观和精确的颜色控制:

/* OKLCH 格式 */
.primary { color: oklch(50% 0.3 0); } /* 红色 */
.secondary { color: oklch(50% 0.3 120); } /* 绿色 */
.accent { color: oklch(50% 0.3 240); } /* 蓝色 */
/* 带透明度 */
.transparent { color: oklch(50% 0.3 0 / 0.5); } /* 红色,50% 透明度 */
/* 实际示例 */
.vibrant-red { color: oklch(60% 0.25 25); } /* 鲜艳的红色 */
.muted-blue { color: oklch(40% 0.1 240); } /* 柔和的蓝色 */
.bright-yellow { color: oklch(80% 0.2 90); } /* 明亮的黄色 */

参数说明:

  • Lightness (亮度): 0%-100% (0%=黑, 100%=白)
  • Chroma (色度): 0-1 (色彩饱和度,0=灰色,1=最大饱和度)
  • Hue (色相): 0-360° (颜色角度,0°=红, 120°=绿, 240°=蓝)
  • Alpha (透明度): 0-1 (可选,用于透明度)

优点:

  • 更直观的颜色调整(色度比饱和度更自然)
  • 更好的色彩保真度
  • 支持现代色彩空间
  • 易于创建颜色变体

缺点:

  • 相对较新,浏览器支持有限
  • 语法较复杂

浏览器支持:

  • Chrome 101+
  • Firefox 96+
  • Safari 15.4+
.red { color: hwb(0 0% 0%); } /* 红色 */
.white { color: hwb(0 100% 0%); } /* 白色 */
.black { color: hwb(0 0% 100%); } /* 黑色 */
.pure-red { color: lab(50% 100 50); }
格式示例透明度支持浏览器支持推荐使用场景
颜色名称red完全支持简单颜色,快速原型
十六进制#ff0000✅ (8位)完全支持大多数项目,设计工具导出
RGB/RGBArgb(255,0,0)完全支持需要精确控制,编程生成
HSL/HSLAhsl(0,100%,50%)现代浏览器需要颜色调整,主题系统
HWBhwb(0 0% 0%)现代浏览器设计师偏好
OKLCHoklch(50% 0.3 0)现代浏览器高级色彩控制,未来导向
  1. 选择合适的格式:

    • 快速原型:颜色名称
    • 生产环境:十六进制或 HSL
    • 需要透明度:RGBA 或 HSLA
    • 高级色彩控制:OKLCH
  2. 保持一致性:

    • 在项目中统一使用一种格式
    • 或根据使用场景选择最合适的格式
  3. 使用工具:

    • 浏览器开发者工具的颜色选择器
    • 在线颜色转换工具
    • 设计软件的颜色导出功能
  4. 可访问性考虑:

    • 确保颜色对比度足够
    • 考虑色盲用户
    • 提供深色模式支持

Catppuccin 是一个现代化的调色板,专为程序员和设计师设计,提供了温暖且护眼的配色方案。它因其优雅的外观和出色的可读性而在开发者社区中广受欢迎。

官网: https://catppuccin.com/palette

Catppuccin 提供四种不同的主题变体,适应不同的使用场景:

/* Latte 主要颜色 */
:root {
--ctp-latte-rosewater: #dc8a78;
--ctp-latte-flamingo: #dd7878;
--ctp-latte-pink: #ea76cb;
--ctp-latte-mauve: #8839ef;
--ctp-latte-red: #d20f39;
--ctp-latte-maroon: #e64553;
--ctp-latte-peach: #fe640b;
--ctp-latte-yellow: #df8e1d;
--ctp-latte-green: #40a02b;
--ctp-latte-teal: #179299;
--ctp-latte-sky: #04a5e5;
--ctp-latte-sapphire: #209fb5;
--ctp-latte-blue: #1e66f5;
--ctp-latte-lavender: #7287fd;
/* 中性色 */
--ctp-latte-text: #4c4f69;
--ctp-latte-subtext1: #5c5f77;
--ctp-latte-subtext0: #6c6f85;
--ctp-latte-overlay2: #7c7f93;
--ctp-latte-overlay1: #8c8fa1;
--ctp-latte-overlay0: #9ca0b0;
--ctp-latte-surface2: #dce0e8;
--ctp-latte-surface1: #e6e9ef;
--ctp-latte-surface0: #eff1f5;
--ctp-latte-base: #ccd0da;
--ctp-latte-mantle: #bcc0cc;
--ctp-latte-crust: #acb0be;
}

2. Frappé (法拉佩) - 中等深色主题

Section titled “2. Frappé (法拉佩) - 中等深色主题”
/* Frappé 主要颜色 */
:root {
--ctp-frappe-rosewater: #f2d5cf;
--ctp-frappe-flamingo: #eebebe;
--ctp-frappe-pink: #f4b8e4;
--ctp-frappe-mauve: #ca9ee6;
--ctp-frappe-red: #e78284;
--ctp-frappe-maroon: #ea999c;
--ctp-frappe-peach: #ef9f76;
--ctp-frappe-yellow: #e5c890;
--ctp-frappe-green: #a6d189;
--ctp-frappe-teal: #81c8be;
--ctp-frappe-sky: #99d1db;
--ctp-frappe-sapphire: #85c1dc;
--ctp-frappe-blue: #8caaee;
--ctp-frappe-lavender: #babbf1;
/* 中性色 */
--ctp-frappe-text: #c6d0f5;
--ctp-frappe-subtext1: #b5bfe2;
--ctp-frappe-subtext0: #a5adce;
--ctp-frappe-overlay2: #949cbb;
--ctp-frappe-overlay1: #838ba7;
--ctp-frappe-overlay0: #737994;
--ctp-frappe-surface2: #626880;
--ctp-frappe-surface1: #51576d;
--ctp-frappe-surface0: #414559;
--ctp-frappe-base: #303446;
--ctp-frappe-mantle: #292c3c;
--ctp-frappe-crust: #232634;
}
/* Macchiato 主要颜色 */
:root {
--ctp-macchiato-rosewater: #f4dbd6;
--ctp-macchiato-flamingo: #f0c6c6;
--ctp-macchiato-pink: #f5bde6;
--ctp-macchiato-mauve: #c6a0f6;
--ctp-macchiato-red: #ed8796;
--ctp-macchiato-maroon: #ee99a0;
--ctp-macchiato-peach: #f5a97f;
--ctp-macchiato-yellow: #eed49f;
--ctp-macchiato-green: #a6da95;
--ctp-macchiato-teal: #8bd5ca;
--ctp-macchiato-sky: #91d7e3;
--ctp-macchiato-sapphire: #7dc4e4;
--ctp-macchiato-blue: #8aadf4;
--ctp-macchiato-lavender: #b7bdf8;
/* 中性色 */
--ctp-macchiato-text: #cad3f5;
--ctp-macchiato-subtext1: #b8c0e0;
--ctp-macchiato-subtext0: #a5adcb;
--ctp-macchiato-overlay2: #939ab7;
--ctp-macchiato-overlay1: #8087a2;
--ctp-macchiato-overlay0: #6e738d;
--ctp-macchiato-surface2: #5b6078;
--ctp-macchiato-surface1: #494d64;
--ctp-macchiato-surface0: #363a4f;
--ctp-macchiato-base: #24273a;
--ctp-macchiato-mantle: #1e2030;
--ctp-macchiato-crust: #181926;
}
/* Mocha 主要颜色 */
:root {
--ctp-mocha-rosewater: #f5e0dc;
--ctp-mocha-flamingo: #f2cdcd;
--ctp-mocha-pink: #f5c2e7;
--ctp-mocha-mauve: #cba6f7;
--ctp-mocha-red: #f38ba8;
--ctp-mocha-maroon: #eba0ac;
--ctp-mocha-peach: #fab387;
--ctp-mocha-yellow: #f9e2af;
--ctp-mocha-green: #a6e3a1;
--ctp-mocha-teal: #94e2d5;
--ctp-mocha-sky: #89dceb;
--ctp-mocha-sapphire: #74c7ec;
--ctp-mocha-blue: #89b4fa;
--ctp-mocha-lavender: #b4befe;
/* 中性色 */
--ctp-mocha-text: #cdd6f4;
--ctp-mocha-subtext1: #bac2de;
--ctp-mocha-subtext0: #a6adc8;
--ctp-mocha-overlay2: #9399b2;
--ctp-mocha-overlay1: #7f849c;
--ctp-mocha-overlay0: #6c7086;
--ctp-mocha-surface2: #585b70;
--ctp-mocha-surface1: #45475a;
--ctp-mocha-surface0: #313244;
--ctp-mocha-base: #1e1e2e;
--ctp-mocha-mantle: #181825;
--ctp-mocha-crust: #11111b;
}
/* 基础样式 */
.catppuccin-theme {
background-color: var(--ctp-base);
color: var(--ctp-text);
transition: all 0.3s ease;
}
/* 按钮样式 */
.btn-primary {
background-color: var(--ctp-blue);
color: var(--ctp-base);
border: 2px solid var(--ctp-blue);
}
.btn-primary:hover {
background-color: var(--ctp-sky);
border-color: var(--ctp-sky);
}
/* 代码块样式 */
.code-block {
background-color: var(--ctp-surface0);
color: var(--ctp-text);
border: 1px solid var(--ctp-surface1);
border-radius: 8px;
}
/* 侧边栏 */
.sidebar {
background-color: var(--ctp-mantle);
border-right: 1px solid var(--ctp-surface0);
}
/* 链接样式 */
a {
color: var(--ctp-blue);
text-decoration: none;
}
a:hover {
color: var(--ctp-sky);
text-decoration: underline;
}
/* 警告颜色 */
.warning { color: var(--ctp-yellow); }
.error { color: var(--ctp-red); }
.success { color: var(--ctp-green); }
.info { color: var(--ctp-blue); }
// 主题切换功能
const themes = ['latte', 'frappe', 'macchiato', 'mocha'];
let currentTheme = 0;
function switchTheme() {
document.documentElement.className = `catppuccin-${themes[currentTheme]}`;
currentTheme = (currentTheme + 1) % themes.length;
}
// 根据系统偏好设置默认主题
function setSystemTheme() {
const prefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches;
const defaultTheme = prefersDark ? 'mocha' : 'latte';
document.documentElement.className = `catppuccin-${defaultTheme}`;
}
// 页面加载时设置主题
document.addEventListener('DOMContentLoaded', setSystemTheme);
颜色名称主要用途示例场景
Red错误、危险、删除错误消息、删除按钮
Maroon次要警告重要提示
Peach警告、提醒表单验证警告
Yellow注意、等待加载状态、提醒标签
Green成功、确认成功消息、确认按钮
Teal信息、中性信息提示、辅助按钮
Sky次要信息链接悬停、次要操作
Sapphire特殊信息特殊标签、高亮
Blue主要操作、链接主按钮、链接
Lavender装饰、强调边框、图标
Mauve特殊状态VIP 标签、特殊功能
Pink喜欢、收藏点赞按钮、收藏
Flamingo柔和警告、温馨提示温和提醒、友好警告
Rosewater装饰、强调装饰元素、强调文本
文本色彩层级
Text主要文本正文、标题
Subtext1次要文本辅助信息、次级标题
Subtext0辅助文本注释、次要信息
界面层级(从浅到深)
Overlay2边框、分隔线卡片边框、分割线
Overlay1次级边框输入框边框、次级分割线
Overlay0轻微边框轻微分割线、背景阴影
Surface2浮起元素背景弹窗、模态框背景
Surface1次级卡片背景次级卡片、列表项背景
Surface0主要卡片背景主要卡片、容器背景
Base页面背景主背景色
Mantle次级背景侧边栏、导航栏背景
Crust最深背景状态栏、最深层背景
Terminal window
npm install @catppuccin/tailwindcss
tailwind.config.js
module.exports = {
plugins: [
require("@catppuccin/tailwindcss")({
prefix: "ctp",
defaultFlavour: "mocha"
})
]
}

将 Catppuccin 颜色映射到 Tailwind CSS 的语义化变量:

/* Catppuccin + Tailwind CSS 语义化颜色映射 (完整层次版) */
:root {
/* 基础背景和前景 */
--background: var(--ctp-base); /* 主背景 */
--foreground: var(--ctp-text); /* 主文本 */
/* 卡片相关 */
--card: var(--ctp-surface0); /* 卡片背景 */
--card-foreground: var(--ctp-text); /* 卡片文本 */
/* 弹窗相关 */
--popover: var(--ctp-surface0); /* 弹窗背景 - 与卡片同色,靠阴影/边框区分层次 */
--popover-foreground: var(--ctp-text); /* 弹窗文本 */
/* 主要操作色 */
--primary: var(--ctp-blue); /* 主按钮背景 */
--primary-foreground: var(--ctp-base); /* 主按钮文本 */
/* 次要操作色 */
--secondary: var(--ctp-surface2); /* 次按钮背景 - 与输入框同层次 */
--secondary-foreground: var(--ctp-text); /* 次按钮文本 */
/* 静音/柔和色 */
--muted: var(--ctp-surface0); /* 静音背景 */
--muted-foreground: var(--ctp-subtext0); /* 静音文本 - 更好的层次区分 */
/* 强调色 */
--accent: var(--ctp-sky); /* 强调背景 */
--accent-foreground: var(--ctp-base); /* 强调文本 */
/* 危险/破坏性操作 */
--destructive: var(--ctp-red); /* 删除按钮等 */
/* 边框和输入 - 简化层次映射! */
--border: var(--ctp-overlay0); /* 一般边框 */
--input: var(--ctp-surface2); /* 输入框背景 - 统一顶层元素 */
--ring: var(--ctp-blue); /* 焦点环 */
/* 图表颜色 */
--chart-1: var(--ctp-blue); /* 图表色1 */
--chart-2: var(--ctp-green); /* 图表色2 */
--chart-3: var(--ctp-yellow); /* 图表色3 */
--chart-4: var(--ctp-red); /* 图表色4 */
--chart-5: var(--ctp-mauve); /* 图表色5 */
/* 侧边栏相关 */
--sidebar: var(--ctp-mantle); /* 侧边栏背景 */
--sidebar-foreground: var(--ctp-text); /* 侧边栏文本 */
--sidebar-primary: var(--ctp-blue); /* 侧边栏主色 */
--sidebar-primary-foreground: var(--ctp-base); /* 侧边栏主色文本 */
--sidebar-accent: var(--ctp-sky); /* 侧边栏强调色 */
--sidebar-accent-foreground: var(--ctp-base); /* 侧边栏强调色文本 */
--sidebar-border: var(--ctp-surface0); /* 侧边栏边框 */
--sidebar-ring: var(--ctp-blue); /* 侧边栏焦点环 */
}
/* 🔍 完整层次结构说明 */
/*
深度层级 (从浅到深), color: text -> bg
text (主文本)
subtext1 (预留层次)
subtext0 (muted-foreground, caption, metadata, placeholder)
overlay2
overlay1
overlay0 (border, divider)
surface2 (input, select, secondary)
surface1 (popover: 弹窗; 模态框)
surface0 (card)
base (bg)
mantle
crust (最深)

🎯 通用层次色规范 (视觉深度原理)

Section titled “🎯 通用层次色规范 (视觉深度原理)”

🏗️ 基础层次原理:

  • 浅度 card > bg: 卡片比背景更”浅”(明亮),产生浮在 bg 上的视觉效果
  • popover == card: 弹窗与卡片同色,通过阴影/边框等其他视觉元素区分层次
  • input == secondary: 终端交互元素,视觉优先级高于容器元素

🎨 具体映射逻辑:

/* 深色模式:越浅越突出 */
background (base) → card/popover (surface0) → input/secondary (surface2)
最深 中等 最浅
/* 浅色模式:遵循光源物理学 */
background (surface0) → input/secondary (surface2) → card/popover (base)
中等深度 稍深 最浅(白)

💡 层次区分策略:

  • popover: 依靠 box-shadowborderz-index 区分层次
  • 用户感知: 动画、位置、交互反馈已足够表明层级关系

📝 语义映射:

  • text: text - 主要文本
  • input == secondary: 同等层次的交互元素,共享 surface2
  • popover == card: 同色简化层次,依靠其他视觉元素区分
  • border: 接近 bg 的边框灰色 surface2 - 既不会太突出,也不会与其他元素冲突
  • muted-foreground: 接近 text 的文本灰色 subtext0

🎨 Secondary 按钮设计原则(防冲突):

/* Secondary 的两种设计模式 - 避免颜色冲突 */
/* 模式1: 实色背景,无边框 */
.btn-secondary-solid {
background-color: var(--secondary); /* surface2 实色 */
border: none; /* 无边框 ✅ */
color: var(--secondary-foreground);
}
/* 模式2: 透明背景,有边框 */
.btn-secondary-ghost {
background-color: transparent; /* 透明背景 ✅ */
border: 1px solid var(--border); /* surface2 边框 */
color: var(--foreground);
}
/* ✅ 原理: 同一颜色不会在同一元素上既做背景又做边框 */

🎨 Popover 层次区分最佳实践:

.popover {
background-color: var(--card); /* 与卡片同色 ✅ */
border: 1px solid var(--border); /* 边框区分 */
box-shadow: 0 10px 25px rgba(0,0,0,0.15); /* 阴影表明层次 */
z-index: 50; /* 层级控制 */
}
/* 动画增强层次感知 */
.popover-enter {
animation: popover-slide-in 0.2s ease-out;
}
@keyframes popover-slide-in {
from { opacity: 0; transform: translateY(-8px); }
to { opacity: 1; transform: translateY(0); }
}
Tailwind 语义变量Catppuccin 对应说明层次深度适用场景
--background--ctp-base主背景色0 (最浅)页面背景
--foreground--ctp-text主文本色-所有文本
--card--ctp-surface0卡片背景1普通卡片、容器
--input--ctp-surface2输入框背景 - 统一顶层顶层所有输入框
--popover--ctp-surface0弹窗背景 - 与卡片同色1下拉菜单、提示框
--primary--ctp-blue主操作色-主按钮、链接
--secondary--ctp-surface2次要操作色 - 与输入框同层次顶层次要按钮
--muted--ctp-surface0静音背景1禁用状态
--muted-foreground--ctp-subtext0静音文本 - 更好的层次区分-辅助信息
--accent--ctp-sky强调色-悬停、高亮
--destructive--ctp-red危险操作色-删除、警告
--border--ctp-overlay0边框色-所有边框
--ring--ctp-blue焦点环-焦点状态
/* Latte (浅色) 主题 - 优化视觉层次 */
[data-theme="latte"] {
--ctp-base: #ccd0da; /* 背景:稍深的灰色 */
--ctp-text: #4c4f69;
--ctp-surface0: #eff1f5; /* 卡片:更浅的白色 - 视觉上浮起 */
--ctp-surface1: #e6e9ef; /* 弹窗:中间色 */
--ctp-surface2: #dce0e8; /* 输入框:稍深于卡片 */
--ctp-blue: #1e66f5;
--ctp-sky: #04a5e5;
--ctp-red: #d20f39;
/* ... 其他颜色 */
}
/* Mocha (深色) 主题 - 保持原有层次 */
[data-theme="mocha"] {
--ctp-base: #1e1e2e; /* 背景:最深 */
--ctp-text: #cdd6f4;
--ctp-surface0: #313244; /* 卡片:比背景浅 ✓ */
--ctp-surface1: #45475a; /* 弹窗:更浅 ✓ */
--ctp-surface2: #585b70; /* 输入框:最浅 ✓ */
--ctp-blue: #89b4fa;
--ctp-sky: #89dceb;
--ctp-red: #f38ba8;
/* ... 其他颜色 */
}

修改前的问题(Latte 主题):

/* ❌ 视觉层次反转 */
--ctp-base: #eff1f5; /* 背景太浅 */
--ctp-surface0: #ccd0da; /* 卡片太深 */

修改后的改进(Latte 主题):

/* ✅ 正确的视觉层次 */
--ctp-base: #ccd0da; /* 背景:有一定深度 */
--ctp-surface0: #eff1f5; /* 卡片:浮在背景上 */
--ctp-surface1: #e6e9ef; /* 弹窗:介于两者之间 */
--ctp-surface2: #dce0e8; /* 输入框:比卡片稍深但比背景浅 */
主题层次结构视觉效果用户感受
Latte (修改前)Base浅 → Surface0深❌ 卡片”凹陷”不自然,违背直觉
Latte (修改后)Base深 → Surface0浅✅ 卡片”浮起”符合现代设计
深色主题Base深 → Surface浅✅ 正确层次保持一致性

浅色模式的视觉原理:

  1. 光源来自上方: 卡片接受更多光线,应该更亮(更浅)
  2. 深度感: 浅色元素在视觉上更接近用户
  3. 品牌一致性: 大多数应用的浅色卡片都是白色或接近白色

深色模式的视觉原理:

  1. 光源稀少: 表面反射少量光线,浅色表示发光
  2. 层次递增: 越接近用户的元素越亮
  3. 护眼考虑: 背景足够深,减少眼部疲劳

您说得对!主色彩完全可以根据喜好自定义。 以下是不同主色彩的推荐搭配:

1. Lavender 主色系 (紫色优雅风格)
Section titled “1. Lavender 主色系 (紫色优雅风格)”
:root {
/* 主色彩:Lavender */
--primary: var(--ctp-lavender); /* #b4befe 或 #7287fd */
--primary-foreground: var(--ctp-base);
/* 建议的 Accent 搭配 */
--accent: var(--ctp-pink); /* 粉色:温柔对比 */
/* 或者 */
--accent: var(--ctp-mauve); /* 深紫:同色系渐变 */
/* 或者 */
--accent: var(--ctp-sky); /* 天蓝:互补色对比 */
--ring: var(--ctp-lavender); /* 焦点环与主色一致 */
}
:root {
--primary: var(--ctp-green); /* #a6e3a1 或 #40a02b */
--accent: var(--ctp-teal); /* 青绿:邻近色和谐 */
/* 或者 */
--accent: var(--ctp-yellow); /* 黄色:暖色对比 */
/* 或者 */
--accent: var(--ctp-sapphire); /* 蓝宝石:冷暖平衡 */
}
:root {
--primary: var(--ctp-pink); /* #f5c2e7 或 #ea76cb */
--accent: var(--ctp-lavender); /* 薰衣草:同色系深浅 */
/* 或者 */
--accent: var(--ctp-peach); /* 桃色:暖色渐变 */
/* 或者 */
--accent: var(--ctp-sky); /* 天蓝:经典粉蓝配 */
}
:root {
--primary: var(--ctp-teal); /* #94e2d5 或 #179299 */
--accent: var(--ctp-sapphire); /* 蓝宝石:邻近色 */
/* 或者 */
--accent: var(--ctp-yellow); /* 黄色:互补色活力 */
/* 或者 */
--accent: var(--ctp-mauve); /* 紫色:优雅对比 */
}
搭配策略效果推荐场景示例
邻近色搭配和谐统一专业应用、企业官网Blue + Sky, Green + Teal
互补色搭配活力对比创意项目、个人博客Lavender + Yellow, Pink + Green
同色系搭配优雅层次高端品牌、艺术网站Lavender + Mauve, Blue + Sapphire
三角搭配丰富平衡多功能应用、仪表板Blue + Yellow + Red

💡 Lavender 主色的最佳 Accent 推荐

Section titled “💡 Lavender 主色的最佳 Accent 推荐”

基于您的问题,如果主色选择 Lavender,我推荐以下 accent 搭配:

🥇 首选:Pink (温柔和谐)

--primary: var(--ctp-lavender); /* 紫色 */
--accent: var(--ctp-pink); /* 粉色 */
/* 效果:优雅、温柔、女性化,适合设计类、美妆类网站 */

🥈 次选:Sky (清新对比)

--primary: var(--ctp-lavender); /* 紫色 */
--accent: var(--ctp-sky); /* 天蓝 */
/* 效果:清新、现代、通用性强,适合科技类、工具类应用 */

🥉 特色:Mauve (深度层次)

--primary: var(--ctp-lavender); /* 浅紫 */
--accent: var(--ctp-mauve); /* 深紫 */
/* 效果:高端、神秘、有深度,适合艺术类、奢侈品类网站 */
/* Lavender + Pink 搭配示例 */
.lavender-pink-theme {
--primary: var(--ctp-lavender); /* 主按钮:紫色 */
--accent: var(--ctp-pink); /* 悬停、高亮:粉色 */
--secondary: var(--ctp-surface2); /* 次要按钮:与输入框同层次 */
--destructive: var(--ctp-red); /* 危险操作:红色 */
--success: var(--ctp-green); /* 成功提示:绿色 */
--warning: var(--ctp-yellow); /* 警告提示:黄色 */
}
/* 使用语义化变量 */
.button-primary {
background-color: var(--primary);
color: var(--primary-foreground);
border: 1px solid var(--border);
}
.button-primary:focus {
outline: 2px solid var(--ring);
outline-offset: 2px;
}
.card {
background-color: var(--card);
color: var(--card-foreground);
border: 1px solid var(--border);
border-radius: 8px;
}
.sidebar {
background-color: var(--sidebar);
color: var(--sidebar-foreground);
border-right: 1px solid var(--sidebar-border);
}

对于 Lavender 背景色,前景色选择建议:

/* 主按钮、重要操作 */
.lavender-primary {
background-color: var(--ctp-lavender);
color: var(--ctp-base); /* 白色(Latte) 或 深色(Mocha) */
/* 对比度: Latte ~8.5:1, Mocha ~12:1 - 优秀可读性 */
}
/* 实际效果 */
.btn-lavender {
background: #7287fd; /* Latte Lavender */
color: #eff1f5; /* Latte Base - 白色背景 */
}
.btn-lavender-dark {
background: #b4befe; /* Mocha Lavender */
color: #1e1e2e; /* Mocha Base - 深色背景 */
}
/* 装饰性元素、大面积背景 */
.lavender-soft {
background-color: var(--ctp-lavender);
color: var(--ctp-text); /* 主文本色 */
/* 对比度: Latte ~3.2:1, Mocha ~4.8:1 - 良好可读性 */
}
/* 适用场景 */
.lavender-badge {
background: #7287fd; /* Latte Lavender */
color: #4c4f69; /* Latte Text - 较柔和 */
}
/* 仅用于次要信息、标签 */
.lavender-muted {
background-color: var(--ctp-lavender);
color: var(--ctp-subtext1); /* 次要文本色 */
/* 对比度: 较低,仅用于装饰 */
}
配色方案Latte 效果Mocha 效果WCAG 等级推荐用途
Lavender + Base紫底白字紫底黑字AAA主按钮、重要操作
Lavender + Text紫底深灰字紫底浅灰字AA装饰元素、标签
Lavender + Subtext1紫底中灰字紫底中浅字A次要标签、装饰

对于 Lavender 背景,强烈推荐使用 --ctp-base 作为前景色:

/* 推荐的 Lavender 配色 */
:root {
--primary: var(--ctp-lavender); /* 背景:紫色 */
--primary-foreground: var(--ctp-base); /* 前景:白色/深色 */
--ring: var(--ctp-lavender); /* 焦点环:与主色一致 */
}

原因:

  1. 对比度最佳 - 确保在所有设备上都清晰可读
  2. 符合规范 - 与 Catppuccin 其他主色的前景色选择保持一致
  3. 通用性强 - 适用于按钮、链接、标签等各种 UI 元素
  4. 可访问性 - 满足 WCAG AAA 级别要求
_catppuccin.scss
#### SCSS/Sass 变量
```scss
$ctp-mocha-base: #1e1e2e;
$ctp-mocha-text: #cdd6f4;
$ctp-mocha-blue: #89b4fa;
// 使用示例
.primary-button {
background-color: $ctp-mocha-blue;
color: $ctp-mocha-base;
}
  1. 温暖护眼: 避免纯黑纯白,使用温暖的色调
  2. 对比适中: 确保可读性,但不过于刺眼
  3. 语义化色彩: 每个颜色都有明确的用途
  4. 一致性: 四个主题间保持相同的色彩逻辑

Catppuccin 不仅仅是 CSS 调色板,还有:

  • 编辑器主题: VS Code, Vim, Neovim 等
  • 终端主题: iTerm2, Windows Terminal 等
  • 应用主题: Discord, Spotify, GitHub 等
  • 系统主题: macOS, Windows, Linux 桌面环境
  1. 选择合适的变体:
    • Latte: 白天使用,护眼浅色主题
    • Frappé: 黄昏时分,温和过渡主题
    • Macchiato: 夜晚编程,最护眼的深色主题 🌙
    • Mocha: 深夜工作,最受欢迎的极深色主题 🖤

🌙 Macchiato vs Mocha:护眼性 vs 流行度

Section titled “🌙 Macchiato vs Mocha:护眼性 vs 流行度”

重要理解:Catppuccin 整体都是舒适对比度设计,没有真正的高对比度主题

Macchiato (玛奇朵) - 护眼优先

/* Macchiato 的背景色更温和 */
--ctp-macchiato-base: #24273a; /* 深灰蓝,更柔和 */
--ctp-macchiato-text: #cad3f5; /* 对比度约 8.5:1 */
--ctp-macchiato-mantle: #1e2030; /* 温暖的深色 */
--ctp-macchiato-crust: #181926; /* 不是纯黑 */

Mocha (摩卡) - 流行度第一

/* Mocha 的背景色更深更黑 */
--ctp-mocha-base: #1e1e2e; /* 接近纯黑 */
--ctp-mocha-text: #cdd6f4; /* 对比度约 12:1 */
--ctp-mocha-mantle: #181825; /* 更深的背景 */
--ctp-mocha-crust: #11111b; /* 极深背景 */

🔍 对比度与视觉疲劳的科学解释

Section titled “🔍 对比度与视觉疲劳的科学解释”

对比度等级分析:

/* 对比度参考值 (WCAG 标准) */
/* AA 级别: 4.5:1 (普通文本最低要求) */
/* AAA 级别: 7:1 (高质量文本要求) */
/* 高对比: 15:1+ (纯黑白,过于刺眼) */
/* Catppuccin 实际对比度 */
Latte: 4.8:1 /* 刚好合格,温和 */
Frappé: 7.2:1 /* AAA 级别,舒适 */
Macchiato: 8.5:1 /* 勉强合格但舒适 */
Mocha: 12:1 /* 相对较高但仍温和 */
/* 真正高对比度 (Catppuccin 故意避免) */
Pure Black/White: 21:1 /* 过于刺眼 */

💡 “勉强合格”实际上是设计优势

Section titled “💡 “勉强合格”实际上是设计优势”

您的理解完全正确! Macchiato 的”勉强合格”对比度实际上是刻意的设计选择:

对比度与疲劳的关系:

  1. 过低对比度 (< 4:1):

    • ❌ 文字模糊,眼睛用力
    • ❌ 阅读困难,容易疲劳
  2. 适中对比度 (4-10:1) - Catppuccin 范围:

    • 最佳平衡点
    • ✅ 清晰可读,不刺眼
    • ✅ 长时间使用舒适
  3. 高对比度 (15:1+):

    • ❌ 过于刺眼,瞳孔频繁调节
    • ❌ 强烈边缘效应,视觉疲劳
    • ❌ 暗适应能力下降

温和对比度的科学依据:

/* 传统高对比度主题的问题 */
.high-contrast-bad {
background: #000000; /* 纯黑 */
color: #ffffff; /* 纯白 */
/* 对比度: 21:1 - 过于刺眼! */
}
/* Catppuccin 的解决方案 */
.catppuccin-good {
background: #1e1e2e; /* 温暖的深色 */
color: #cdd6f4; /* 柔和的浅色 */
/* 对比度: 12:1 - 完美平衡! */
}

为什么 Catppuccin 没有真正的高对比度主题:

  1. 护眼优先: 避免纯黑纯白的刺眼感
  2. 长期使用: 适合程序员长时间工作
  3. 视觉舒适: 减少瞳孔频繁调节
  4. 颜色和谐: 保持温暖色调的一致性
主题类型对比度长期使用感受适用场景
纯黑白21:1😵 极度刺眼短时间阅读
Mocha12:1😊 清晰舒适大多数场景
Macchiato8.5:1😌 柔和舒适长时间编程
Frappé7.2:1😊 温和过渡黄昏时分
低对比度< 4:1😟 模糊费眼不推荐

您说得对!对比度适中反而更护眼:

  1. 瞳孔稳定: 不需要频繁调节大小
  2. 边缘柔和: 减少视觉”震颤”效应
  3. 色温温暖: 蓝光更少,更接近自然光
  4. 渐变自然: 符合人眼的适应特性

长时间编程 (6+ 小时):

// 推荐 Macchiato - 8.5:1 对比度最舒适
defaultFlavour: "macchiato"

一般使用 (2-4 小时):

// Mocha - 12:1 对比度,清晰度和舒适度平衡
defaultFlavour: "mocha"

短时间使用:

// 任何 Catppuccin 主题都很好

您的理解完全正确:

  • Macchiato 的”勉强合格”是优势,不是缺陷
  • 适中对比度确实减少疲劳
  • Catppuccin 整体设计避免了高对比度的问题
  • “看起来奇怪”的高对比度确实存在视觉问题

Catppuccin 的成功正是因为它理解了对比度的甜蜜点:足够清晰,但不过度刺激。

使用场景推荐主题原因
👁️ 眼部敏感用户Macchiato背景更柔和,减少眼疲劳
💻 长时间编程Macchiato对比度适中,不刺眼
🌙 深夜工作Macchiato温和的深色更适合昏暗环境
📱 OLED 设备Mocha更深的黑色更省电
👥 团队协作Mocha最流行,兼容性最好
🎨 代码高亮Mocha更强对比度,语法高亮更清晰
🔧 工具默认Mocha大多数插件默认配置

护眼优先用户:

// 推荐 Macchiato
module.exports = {
plugins: [
require("@catppuccin/tailwindcss")({
prefix: "ctp",
defaultFlavour: "macchiato" // 护眼首选
})
]
}

社区兼容性优先:

// 推荐 Mocha
module.exports = {
plugins: [
require("@catppuccin/tailwindcss")({
prefix: "ctp",
defaultFlavour: "mocha" // 社区默认
})
]
}
/* 背景色亮度对比 (越小越深) */
/* Latte: Lightness ~95% (最亮) */
/* Frappé: Lightness ~20% */
/* Macchiato: Lightness ~15% (护眼平衡点) */
/* Mocha: Lightness ~12% (最深最黑) */

结论: Macchiato 确实更护眼,但 Mocha 因为社区采用率高而成为事实标准。选择时建议:

  • 个人使用 → Macchiato (护眼)
  • 团队项目 → Mocha (兼容性)
  • 开源项目 → Mocha (用户习惯)
  1. 渐进式采用:

    • 先从主要颜色开始
    • 逐步添加语义化颜色
    • 最后完善细节
  2. 可访问性优先:

    • 测试颜色对比度
    • 提供主题切换选项
    • 考虑色盲用户需求

这个调色板的美妙之处在于它不仅美观,还非常实用,已经成为许多开发者的首选配色方案!

  • Latte
  • Frappé
  • Macchiato
  • Mocha
.flex {
display: flex;
}

Flex 有两个角色:

  • 容器(container):设置 display: flex 的元素
  • 项目(items):容器里的直接子元素

Flex 有两条轴:

  • 主轴(main axis):项目排列的方向
  • 交叉轴(cross axis):与主轴垂直的方向

默认:主轴是 水平(从左到右),交叉轴是 垂直(从上到下)。

<div class="container flex">
<div class="item flex-1">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
属性作用常用值
flex-direction主轴方向row(默认)、row-reversecolumncolumn-reverse
flex-wrap是否换行nowrap(默认)、wrapwrap-reverse
justify-content主轴对齐方式flex-start(默认)、centerflex-endspace-betweenspace-aroundspace-evenly
align-items交叉轴对齐方式stretch(默认)、flex-startcenterflex-endbaseline
align-content多行时交叉轴对齐方式同上(只在多行时生效)
gap主轴和交叉轴 的 间距长度值(如 10px)或百分比(如 5%
属性作用常用值
flex-grow剩余空间分配比例数字(默认 0)
flex-shrink空间不足时的缩小比例数字(默认 1)
flex-basis初始大小长度值、(默认 auto)
flex上面三者的简写flex: 1 等价于 flex: 1 1 0
align-self单独项目的交叉轴对齐方式覆盖 align-items
<script src="https://cdn.jsdelivr.net/npm/@tailwindcss/browser@4"></script>
<div aria-label="container" class=" w-40 flex">
<div class="item flex-1">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>

然后在 .container 里不断调整:

  • flex-direction
  • justify-content
  • align-items
  • flex-wrap
  • justify or justify-content 用于设置 flex 容器内 item 的 方向 上的 对齐方式。

值:

  • start:项目向容器方向上的起始边界对齐。
  • center:项目在容器方向上内居中对齐。
  • end:项目向容器方向上的结束边界对齐。
  • between or space-between:项目在容器方向上两端对齐,项目之间的间隔相等。

items or align-items 用于设置 flex 容器内 item 的 交叉轴 上的 对齐方式。

grid-cols-[1fr_auto]

解释: grid-template-columns: 1fr auto;

也就是说这是一个两列的 Grid 布局:第一列占剩余可用空间(1fr),第二列按内容宽度自适应(auto)

1fr 与 auto 的区别

  • 1fr:表示弹性份额,分配剩余可用空间(常用作主列,拉伸填充)。
  • auto:宽度由内容和内边距等决定,不会拉伸去占剩余空间(常用作按钮、工具栏、侧栏等宽度随内容变化的列)
<style>
div:has(.highlight) { /* 使用 :has() 选择包含 .highlight 的 div */
border: 2px solid red;
padding: 10px;
margin-bottom: 10px;
}
div { /* 普通 div 的样式 */
border: 2px solid gray;
padding: 10px;
margin-bottom: 10px;
}
.highlight { /* .highlight 的样式 */
background-color: yellow;
padding: 5px;
}
</style>
<div><!-- 不包含 .highlight 的 div -->
<p>这是一个普通的 div,没有 .highlight 元素。</p>
</div>
<div><!-- 包含 .highlight 的 div -->
<p>这是一个包含 <span class="highlight">高亮内容</span> 的 div。</p>
</div>
<div><!-- 不包含 .highlight 的 div -->
<p>这是另一个普通的 div,没有 .highlight 元素。</p>
</div>
t1