css
encoding formats
Section titled “encoding formats”是的,CSS 中颜色有多种编码格式,每种格式都有其优缺点和适用场景。
颜色名称 (Color Names)
Section titled “颜色名称 (Color Names)”CSS 提供了 140+ 预定义颜色名称:
/* 基本颜色 */.red { color: red; }.blue { color: blue; }.green { color: green; }
/* 扩展颜色 */.light-blue { color: lightblue; }.dark-red { color: darkred; }.medium-violet-red { color: mediumvioletred; }优点:
- 易读易写
- 无需记忆数值
缺点:
- 颜色有限
- 不够精确
十六进制 (Hexadecimal)
Section titled “十六进制 (Hexadecimal)”最常用的颜色格式:
/* 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/RGBA
Section titled “RGB/RGBA”基于红绿蓝三原色的颜色模型:
/* 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/HSLA
Section titled “HSL/HSLA”基于色相、饱和度、亮度的颜色模型:
/* 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+
other formats
Section titled “other formats”HWB (Hue, Whiteness, Blackness)
Section titled “HWB (Hue, Whiteness, Blackness)”.red { color: hwb(0 0% 0%); } /* 红色 */.white { color: hwb(0 100% 0%); } /* 白色 */.black { color: hwb(0 0% 100%); } /* 黑色 */LAB (更精确的颜色空间)
Section titled “LAB (更精确的颜色空间)”.pure-red { color: lab(50% 100 50); }| 格式 | 示例 | 透明度支持 | 浏览器支持 | 推荐使用场景 |
|---|---|---|---|---|
| 颜色名称 | red | ❌ | 完全支持 | 简单颜色,快速原型 |
| 十六进制 | #ff0000 | ✅ (8位) | 完全支持 | 大多数项目,设计工具导出 |
| RGB/RGBA | rgb(255,0,0) | ✅ | 完全支持 | 需要精确控制,编程生成 |
| HSL/HSLA | hsl(0,100%,50%) | ✅ | 现代浏览器 | 需要颜色调整,主题系统 |
| HWB | hwb(0 0% 0%) | ❌ | 现代浏览器 | 设计师偏好 |
| OKLCH | oklch(50% 0.3 0) | ✅ | 现代浏览器 | 高级色彩控制,未来导向 |
-
选择合适的格式:
- 快速原型:颜色名称
- 生产环境:十六进制或 HSL
- 需要透明度:RGBA 或 HSLA
- 高级色彩控制:OKLCH
-
保持一致性:
- 在项目中统一使用一种格式
- 或根据使用场景选择最合适的格式
-
使用工具:
- 浏览器开发者工具的颜色选择器
- 在线颜色转换工具
- 设计软件的颜色导出功能
-
可访问性考虑:
- 确保颜色对比度足够
- 考虑色盲用户
- 提供深色模式支持
🎨 Catppuccin 调色板
Section titled “🎨 Catppuccin 调色板”什么是 Catppuccin?
Section titled “什么是 Catppuccin?”Catppuccin 是一个现代化的调色板,专为程序员和设计师设计,提供了温暖且护眼的配色方案。它因其优雅的外观和出色的可读性而在开发者社区中广受欢迎。
官网: https://catppuccin.com/palette
🌙 四种主题变体
Section titled “🌙 四种主题变体”Catppuccin 提供四种不同的主题变体,适应不同的使用场景:
1. Latte (拿铁) - 浅色主题
Section titled “1. Latte (拿铁) - 浅色主题”/* 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;}3. Macchiato (玛奇朵) - 深色主题
Section titled “3. Macchiato (玛奇朵) - 深色主题”/* 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;}4. Mocha (摩卡) - 极深色主题
Section titled “4. Mocha (摩卡) - 极深色主题”/* 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;}🎯 实际应用示例
Section titled “🎯 实际应用示例”网站主题切换
Section titled “网站主题切换”/* 基础样式 */.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); }JavaScript 主题切换
Section titled “JavaScript 主题切换”// 主题切换功能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);🌈 颜色用途指南
Section titled “🌈 颜色用途指南”| 颜色名称 | 主要用途 | 示例场景 |
|---|---|---|
| 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 | 最深背景 | 状态栏、最深层背景 |
🛠️ 开发工具集成
Section titled “🛠️ 开发工具集成”Tailwind CSS 插件
Section titled “Tailwind CSS 插件”npm install @catppuccin/tailwindcssmodule.exports = { plugins: [ require("@catppuccin/tailwindcss")({ prefix: "ctp", defaultFlavour: "mocha" }) ]}🎯 Tailwind CSS 语义化颜色映射
Section titled “🎯 Tailwind CSS 语义化颜色映射”将 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 -> bgtext (主文本) ↓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-shadow、border、z-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); }}📊 颜色映射对照表 (完整版)
Section titled “📊 颜色映射对照表 (完整版)”| 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 | 焦点环 | - | 焦点状态 |
🎨 不同主题的变体
Section titled “🎨 不同主题的变体”/* 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; /* ... 其他颜色 */}🔍 层次优化说明
Section titled “🔍 层次优化说明”修改前的问题(Latte 主题):
/* ❌ 视觉层次反转 */--ctp-base: #eff1f5; /* 背景太浅 */--ctp-surface0: #ccd0da; /* 卡片太深 */修改后的改进(Latte 主题):
/* ✅ 正确的视觉层次 */--ctp-base: #ccd0da; /* 背景:有一定深度 */--ctp-surface0: #eff1f5; /* 卡片:浮在背景上 */--ctp-surface1: #e6e9ef; /* 弹窗:介于两者之间 */--ctp-surface2: #dce0e8; /* 输入框:比卡片稍深但比背景浅 */📊 优化效果对比
Section titled “📊 优化效果对比”| 主题 | 层次结构 | 视觉效果 | 用户感受 |
|---|---|---|---|
| Latte (修改前) | Base浅 → Surface0深 | ❌ 卡片”凹陷” | 不自然,违背直觉 |
| Latte (修改后) | Base深 → Surface0浅 | ✅ 卡片”浮起” | 符合现代设计 |
| 深色主题 | Base深 → Surface浅 | ✅ 正确层次 | 保持一致性 |
💡 设计原理
Section titled “💡 设计原理”浅色模式的视觉原理:
- 光源来自上方: 卡片接受更多光线,应该更亮(更浅)
- 深度感: 浅色元素在视觉上更接近用户
- 品牌一致性: 大多数应用的浅色卡片都是白色或接近白色
深色模式的视觉原理:
- 光源稀少: 表面反射少量光线,浅色表示发光
- 层次递增: 越接近用户的元素越亮
- 护眼考虑: 背景足够深,减少眼部疲劳
🌈 个性化主色彩搭配方案
Section titled “🌈 个性化主色彩搭配方案”您说得对!主色彩完全可以根据喜好自定义。 以下是不同主色彩的推荐搭配:
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); /* 焦点环与主色一致 */}2. Green 主色系 (自然清新风格)
Section titled “2. Green 主色系 (自然清新风格)”:root { --primary: var(--ctp-green); /* #a6e3a1 或 #40a02b */ --accent: var(--ctp-teal); /* 青绿:邻近色和谐 */ /* 或者 */ --accent: var(--ctp-yellow); /* 黄色:暖色对比 */ /* 或者 */ --accent: var(--ctp-sapphire); /* 蓝宝石:冷暖平衡 */}3. Pink 主色系 (温暖可爱风格)
Section titled “3. Pink 主色系 (温暖可爱风格)”:root { --primary: var(--ctp-pink); /* #f5c2e7 或 #ea76cb */ --accent: var(--ctp-lavender); /* 薰衣草:同色系深浅 */ /* 或者 */ --accent: var(--ctp-peach); /* 桃色:暖色渐变 */ /* 或者 */ --accent: var(--ctp-sky); /* 天蓝:经典粉蓝配 */}4. Teal 主色系 (现代专业风格)
Section titled “4. Teal 主色系 (现代专业风格)”:root { --primary: var(--ctp-teal); /* #94e2d5 或 #179299 */ --accent: var(--ctp-sapphire); /* 蓝宝石:邻近色 */ /* 或者 */ --accent: var(--ctp-yellow); /* 黄色:互补色活力 */ /* 或者 */ --accent: var(--ctp-mauve); /* 紫色:优雅对比 */}🎯 色彩搭配原则
Section titled “🎯 色彩搭配原则”| 搭配策略 | 效果 | 推荐场景 | 示例 |
|---|---|---|---|
| 邻近色搭配 | 和谐统一 | 专业应用、企业官网 | 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); /* 深紫 *//* 效果:高端、神秘、有深度,适合艺术类、奢侈品类网站 */🎨 实际配色预览
Section titled “🎨 实际配色预览”/* 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); /* 警告提示:黄色 */}💡 实际使用示例
Section titled “💡 实际使用示例”/* 使用语义化变量 */.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 前景色最佳实践
Section titled “🎨 Lavender 前景色最佳实践”对于 Lavender 背景色,前景色选择建议:
🥇 首选:Base 色 (最高对比度)
Section titled “🥇 首选:Base 色 (最高对比度)”/* 主按钮、重要操作 */.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 - 深色背景 */}🥈 次选:Text 色 (柔和对比)
Section titled “🥈 次选:Text 色 (柔和对比)”/* 装饰性元素、大面积背景 */.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 - 较柔和 */}⚠️ 谨慎使用:Subtext 色
Section titled “⚠️ 谨慎使用:Subtext 色”/* 仅用于次要信息、标签 */.lavender-muted { background-color: var(--ctp-lavender); color: var(--ctp-subtext1); /* 次要文本色 */ /* 对比度: 较低,仅用于装饰 */}📊 实际对比度测试
Section titled “📊 实际对比度测试”| 配色方案 | Latte 效果 | Mocha 效果 | WCAG 等级 | 推荐用途 |
|---|---|---|---|---|
| Lavender + Base | 紫底白字 | 紫底黑字 | AAA | 主按钮、重要操作 |
| Lavender + Text | 紫底深灰字 | 紫底浅灰字 | AA | 装饰元素、标签 |
| Lavender + Subtext1 | 紫底中灰字 | 紫底中浅字 | A | 次要标签、装饰 |
🎯 最终建议
Section titled “🎯 最终建议”对于 Lavender 背景,强烈推荐使用 --ctp-base 作为前景色:
/* 推荐的 Lavender 配色 */:root { --primary: var(--ctp-lavender); /* 背景:紫色 */ --primary-foreground: var(--ctp-base); /* 前景:白色/深色 */ --ring: var(--ctp-lavender); /* 焦点环:与主色一致 */}原因:
- ✅ 对比度最佳 - 确保在所有设备上都清晰可读
- ✅ 符合规范 - 与 Catppuccin 其他主色的前景色选择保持一致
- ✅ 通用性强 - 适用于按钮、链接、标签等各种 UI 元素
- ✅ 可访问性 - 满足 WCAG AAA 级别要求
#### 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;}🎨 设计原则
Section titled “🎨 设计原则”- 温暖护眼: 避免纯黑纯白,使用温暖的色调
- 对比适中: 确保可读性,但不过于刺眼
- 语义化色彩: 每个颜色都有明确的用途
- 一致性: 四个主题间保持相同的色彩逻辑
🔗 生态系统
Section titled “🔗 生态系统”Catppuccin 不仅仅是 CSS 调色板,还有:
- 编辑器主题: VS Code, Vim, Neovim 等
- 终端主题: iTerm2, Windows Terminal 等
- 应用主题: Discord, Spotify, GitHub 等
- 系统主题: macOS, Windows, Linux 桌面环境
💡 使用建议
Section titled “💡 使用建议”- 选择合适的变体:
- 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 的”勉强合格”对比度实际上是刻意的设计选择:
对比度与疲劳的关系:
-
过低对比度 (< 4:1):
- ❌ 文字模糊,眼睛用力
- ❌ 阅读困难,容易疲劳
-
适中对比度 (4-10:1) - Catppuccin 范围:
- ✅ 最佳平衡点
- ✅ 清晰可读,不刺眼
- ✅ 长时间使用舒适
-
高对比度 (15:1+):
- ❌ 过于刺眼,瞳孔频繁调节
- ❌ 强烈边缘效应,视觉疲劳
- ❌ 暗适应能力下降
🎨 Catppuccin 的设计哲学
Section titled “🎨 Catppuccin 的设计哲学”温和对比度的科学依据:
/* 传统高对比度主题的问题 */.high-contrast-bad { background: #000000; /* 纯黑 */ color: #ffffff; /* 纯白 */ /* 对比度: 21:1 - 过于刺眼! */}
/* Catppuccin 的解决方案 */.catppuccin-good { background: #1e1e2e; /* 温暖的深色 */ color: #cdd6f4; /* 柔和的浅色 */ /* 对比度: 12:1 - 完美平衡! */}为什么 Catppuccin 没有真正的高对比度主题:
- 护眼优先: 避免纯黑纯白的刺眼感
- 长期使用: 适合程序员长时间工作
- 视觉舒适: 减少瞳孔频繁调节
- 颜色和谐: 保持温暖色调的一致性
📊 实际测试数据对比
Section titled “📊 实际测试数据对比”| 主题类型 | 对比度 | 长期使用感受 | 适用场景 |
|---|---|---|---|
| 纯黑白 | 21:1 | 😵 极度刺眼 | 短时间阅读 |
| Mocha | 12:1 | 😊 清晰舒适 | 大多数场景 |
| Macchiato | 8.5:1 | 😌 柔和舒适 | 长时间编程 |
| Frappé | 7.2:1 | 😊 温和过渡 | 黄昏时分 |
| 低对比度 | < 4:1 | 😟 模糊费眼 | 不推荐 |
🧠 视觉疲劳的真正原因
Section titled “🧠 视觉疲劳的真正原因”您说得对!对比度适中反而更护眼:
- 瞳孔稳定: 不需要频繁调节大小
- 边缘柔和: 减少视觉”震颤”效应
- 色温温暖: 蓝光更少,更接近自然光
- 渐变自然: 符合人眼的适应特性
💡 专业建议
Section titled “💡 专业建议”长时间编程 (6+ 小时):
// 推荐 Macchiato - 8.5:1 对比度最舒适defaultFlavour: "macchiato"一般使用 (2-4 小时):
// Mocha - 12:1 对比度,清晰度和舒适度平衡defaultFlavour: "mocha"短时间使用:
// 任何 Catppuccin 主题都很好您的理解完全正确:
- Macchiato 的”勉强合格”是优势,不是缺陷
- 适中对比度确实减少疲劳
- Catppuccin 整体设计避免了高对比度的问题
- “看起来奇怪”的高对比度确实存在视觉问题
Catppuccin 的成功正是因为它理解了对比度的甜蜜点:足够清晰,但不过度刺激。
📊 选择建议对比
Section titled “📊 选择建议对比”| 使用场景 | 推荐主题 | 原因 |
|---|---|---|
| 👁️ 眼部敏感用户 | Macchiato | 背景更柔和,减少眼疲劳 |
| 💻 长时间编程 | Macchiato | 对比度适中,不刺眼 |
| 🌙 深夜工作 | Macchiato | 温和的深色更适合昏暗环境 |
| 📱 OLED 设备 | Mocha | 更深的黑色更省电 |
| 👥 团队协作 | Mocha | 最流行,兼容性最好 |
| 🎨 代码高亮 | Mocha | 更强对比度,语法高亮更清晰 |
| 🔧 工具默认 | Mocha | 大多数插件默认配置 |
💡 专业建议
Section titled “💡 专业建议”护眼优先用户:
// 推荐 Macchiatomodule.exports = { plugins: [ require("@catppuccin/tailwindcss")({ prefix: "ctp", defaultFlavour: "macchiato" // 护眼首选 }) ]}社区兼容性优先:
// 推荐 Mochamodule.exports = { plugins: [ require("@catppuccin/tailwindcss")({ prefix: "ctp", defaultFlavour: "mocha" // 社区默认 }) ]}🔍 实际差异对比
Section titled “🔍 实际差异对比”/* 背景色亮度对比 (越小越深) *//* Latte: Lightness ~95% (最亮) *//* Frappé: Lightness ~20% *//* Macchiato: Lightness ~15% (护眼平衡点) *//* Mocha: Lightness ~12% (最深最黑) */结论: Macchiato 确实更护眼,但 Mocha 因为社区采用率高而成为事实标准。选择时建议:
- 个人使用 → Macchiato (护眼)
- 团队项目 → Mocha (兼容性)
- 开源项目 → Mocha (用户习惯)
-
渐进式采用:
- 先从主要颜色开始
- 逐步添加语义化颜色
- 最后完善细节
-
可访问性优先:
- 测试颜色对比度
- 提供主题切换选项
- 考虑色盲用户需求
这个调色板的美妙之处在于它不仅美观,还非常实用,已经成为许多开发者的首选配色方案!
- 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/container attributes
Section titled “flex/container attributes”| 属性 | 作用 | 常用值 |
|---|---|---|
flex-direction | 主轴方向 | row(默认)、row-reverse、column、column-reverse |
flex-wrap | 是否换行 | nowrap(默认)、wrap、wrap-reverse |
justify-content | 主轴对齐方式 | flex-start(默认)、center、flex-end、space-between、space-around、space-evenly |
align-items | 交叉轴对齐方式 | stretch(默认)、flex-start、center、flex-end、baseline |
align-content | 多行时交叉轴对齐方式 | 同上(只在多行时生效) |
gap | 主轴和交叉轴 的 间距 | 长度值(如 10px)或百分比(如 5%) |
flex/items attributes
Section titled “flex/items attributes”| 属性 | 作用 | 常用值 |
|---|---|---|
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-directionjustify-contentalign-itemsflex-wrap
justify
Section titled “justify”justifyorjustify-content用于设置 flex 容器内 item 的 方向 上的 对齐方式。
值:
start:项目向容器方向上的起始边界对齐。center:项目在容器方向上内居中对齐。end:项目向容器方向上的结束边界对齐。betweenorspace-between:项目在容器方向上两端对齐,项目之间的间隔相等。- …
items or align-items 用于设置 flex 容器内 item 的 交叉轴 上的 对齐方式。
grid-cols-[1fr_auto]
解释: grid-template-columns: 1fr auto;
也就是说这是一个两列的 Grid 布局:第一列占剩余可用空间(1fr),第二列按内容宽度自适应(auto)
1fr 与 auto 的区别
- 1fr:表示弹性份额,分配剩余可用空间(常用作主列,拉伸填充)。
- auto:宽度由内容和内边距等决定,不会拉伸去占剩余空间(常用作按钮、工具栏、侧栏等宽度随内容变化的列)
:has()
Section titled “:has()”<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>