Themes
在 webforJ 中,主题是一组命名的 CSS 自定义属性(设计令牌),用于控制每个组件的外观。切换主题会瞬间重新计算整个应用中的颜色、阴影、表面和边框,而无需重建。
内置主题
webforJ 默认提供三种应用主题:
| 主题 | 背景 | 色调 |
|---|---|---|
light | 明亮(默认) | 微妙的主色调色调 |
dark | 暗色 | 微妙的主色调色调 |
dark-pure | 暗色 | 无(纯中性色调) |
任何应用都可以在运行时在它们之间切换,并且可以在现有主题的基础上定义额外的自定义主题。
应用主题
使用 @AppTheme 注解声明性设置活动主题,或使用 App.setTheme() 以编程方式设置。主题名称必须是 system、light、dark、dark-pure 或自定义主题的名称之一。
@AppTheme("dark-pure")
class MyApp extends App {
// 应用代码
}
// 或者以编程方式
App.setTheme("dark-pure");
随时再次调用 App.setTheme() 将应用切换到不同的主题。
颜色方案
color-scheme CSS 声明告诉浏览器如何渲染其内置表面,例如原生滚动条、表单控件小部件、自动填充高亮和默认页面背景,CSS 加载之前。内置的 dark 和 dark-pure 主题已经为您设置了 color-scheme: dark,因此浏览器界面会自动与暗色表面融合。
当定义您自己的自定义暗主题时,您才需要考虑这个问题。在这种情况下,请在主题选择器上包含 color-scheme: dark:
html[data-app-theme="brand-dark"] {
--dwc-dark-mode: 1;
color-scheme: dark;
}
如果您跳过它,滚动条和自动填充矩形默认为亮色模式,并且在暗色表面上看起来不协调。亮主题不需要该声明,浏览器默认使用亮色模式。
跟随用户的偏好
大多数操作系统允许用户选择全局的亮色或暗色外观。webforJ 可以尊重该偏好并自动选择正确的主题。
通过 @AppLightTheme 和 @AppDarkTheme(或 App.setLightTheme() 和 App.setDarkTheme())注册每个外观状态要应用的主题,然后将保留关键字 "system" 传递给 App.setTheme()(或 @AppTheme("system")),让 webforJ 根据用户的操作系统偏好在它们之间进行选择。
@AppTheme("system")
@AppLightTheme("light")
@AppDarkTheme("dark")
class MyApp extends App {
// 应用代码
}
等效的编程形式:
App.setLightTheme("light");
App.setDarkTheme("dark");
App.setTheme("system");
"system" 是一个保留关键字。webforJ 在运行时将其解析为注册的亮色或暗色主题,并在操作系统偏好更改时自动重新解析。一旦解析,页面上的实际 data-app-theme 属性为 light 或 dark,因此任何 CSS 覆盖应针对这些名称,而不是 "system"。
用户启用系统范围的外观设置的位置因平台而异:
- Windows 10/11:设置 > 个性化 > 颜色 > 选择您的颜色
- macOS:系统设置 > 外观
- iOS:设置 > 显示与亮度 > 外观
- Android:设置 > 显示 > 暗色主题
覆盖默认主题
大多数品牌工作是通过覆盖现有主题而不是创建 新主题来完成的。重新调整内置的 light、dark 和 dark-pure 主题的种子颜色(或任何其他令牌),每个组件都会自动采用新的外观。
您可以通过在 :root 选择器中重新定义 CSS 自定义属性来覆盖 light 主题。
:root 伪类:root CSS 伪类定位文档的根元素。在 HTML 中,它表示 <html> 元素,并且具有比普通 html 选择器更高的特异性。
:root {
--dwc-color-primary-h: 215;
--dwc-color-primary-s: 100%;
--dwc-font-size: var(--dwc-font-size-l);
}
要覆盖 dark 或 dark-pure 主题,请对 <html> 元素使用属性选择器:
html[data-app-theme="dark"] {
--dwc-color-primary-seed: #a855f7;
}
html[data-app-theme="dark-pure"] {
--dwc-color-primary-seed: #a855f7;
}
使用 App.setTheme("dark") 切换主题将激活重新品牌的暗主题,无需新的主题名称。
创建自定义主题
仅在需要与内置主题共存的全新主题时创建 (例如,高对比度变体或特定客户的皮肤)。选择一个唯一的名称,并在其自己的 html[data-app-theme='THEME_NAME'] 选择器下定义它:
html[data-app-theme="new-theme"] {
--dwc-color-primary-h: 280;
--dwc-color-primary-s: 100%;
}
要使自定义主题暗色,请设置 --dwc-dark-mode: 1 和 color-scheme: dark:
html[data-app-theme="new-dark-theme"] {
--dwc-dark-mode: 1;
--dwc-color-primary-h: 280;
--dwc-color-primary-s: 100%;
color-scheme: dark;
}
然后在您的应用中:
@AppTheme("new-theme")
class MyApp extends App {
// 应用代码
}
// 或者以编程方式
App.setTheme("new-theme");
使用 DWC 令牌
一些习惯可以使自定义 CSS 与设计系统保持一致,并防止其在暗模式或未来版本中漂移。
始终使用 var(...) 引用令牌
硬编码颜色字面量(#3b82f6、rgb(59 130 246)、oklch(0.6 0.18 250))不能适应暗模式,并且无法跟踪调色板的变化。请使用令牌。
/* 避免 */
.my-panel {
background: #ffffff;
color: #1f2937;
border: 1px solid #e5e7eb;
}
/* 优选 */
.my-panel {
background: var(--dwc-surface-3);
color: var(--dwc-color-body-text);
border: 1px solid var(--dwc-border-color);
}