【发布时间】:2017-12-01 23:28:19
【问题描述】:
Vmware Clarity 0.10.16 刚刚发布了新的深色主题。这太棒了!
他们描述了如何添加新主题,但没有说明在页面内动态更改它的可能性。是因为不可行吗?
如果是,我该如何使用 Angular 4+ 来做到这一点?任何网站可以帮助我解释如何实现这一点?
提前致谢!
【问题讨论】:
Vmware Clarity 0.10.16 刚刚发布了新的深色主题。这太棒了!
他们描述了如何添加新主题,但没有说明在页面内动态更改它的可能性。是因为不可行吗?
如果是,我该如何使用 Angular 4+ 来做到这一点?任何网站可以帮助我解释如何实现这一点?
提前致谢!
【问题讨论】:
Clarity 现在附带浅色和深色主题的样式表。我们记录了如何使用 here 和 angular-cli 或 webpack 构建配置来使用它们。这意味着一旦构建了应用程序,这就是它唯一的风格。
我对如何实现主题切换器以在两者之间切换有一些想法。下面是一个粗略的想法,我可能会从我的原型开始:
<head> 中的样式表编写一个指令或组件,该指令或组件可以采用src 的@Input
/path/to/light.css 和 /path/to/dark.css 存储在服务中,以便应用程序可以传递活动主题值并在需要时对其进行修改。 这是否为您的应用提供了一些想法?
我将在原型工作后在这里更新,以便您可以看到它的实际效果并找到源代码。
【讨论】:
CSS custom properties (CSS variables),以便可以从应用程序方面应用主题。最大的障碍是 IE11 缺乏支持。 (Edge v15 确实支持它)所以这也意味着添加一个 polyfill 以支持 IE11。
我已经建立了一个概念证明,你可以如何做到这一点,但它确实有一些限制。由于一次只能包含一个主题文件,因此渲染正确的主题可能会有一些延迟,因为它发生在 Angular 渲染周期的后期。只有当浏览器的缓存为空时才会有大问题,因为后续访问会很快呈现,但这是这里的主要考虑因素。这是一个开始,您也许可以在此基础上构建更强大的东西。
https://stackblitz.com/edit/clarity-theme-switcher?file=app%2Fapp.component.ts
【讨论】:
这是我所做的:
angular.json 配置中。在样式表 1 中,导入 Clarity default 主题。在样式表 2 中,在类选择器中导入 Clarity dark 主题。像这样:.dark-mode {
@import "~@clr/ui/src/utils/theme.dark.clarity"; // Dark theme variables
@import '~@clr/ui/src/utils/components.clarity';
// @import third party styling...
// Fix styling HTML-tag.
// node_modules\@clr\ui\src\typography\_typography.clarity.scss
& html {
color: $clr-global-font-color;
font-family: $clr-font;
font-size: $clr-baseline-px;
}
}
AppComponent 构造函数中导入@Inject(DOCUMENT) private document: Document。this.document.documentElement.classList.add('dark-mode');
我使用localStorage 来存储用户的偏好。
这样做的优点是:
缺点是:
.dark-mode 类选择器中复制。这会使文件大小加倍。我不认为这有什么问题。html-元素样式进行小修复。上述示例中包含的解决方案。【讨论】:
我已经实现了它,在 index.html 中添加了一个链接
<link id="theme" rel="stylesheet" href="https://unpkg.com/@clr/ui/clr-ui.min.css" />
然后在你的 app.component.ts 中
linkRef: HTMLLinkElement;
themes = [
'https://unpkg.com/@clr/ui/clr-ui.min.css',
'https://unpkg.com/@clr/ui/clr-ui-dark.min.css'
];
constructor(){
this.linkRef = document.getElementById('theme') as HTMLLinkElement;
// you could change here the theme if you have it stored in local storage
// for example
// const theme = localStorage.getItem('theme')
// if(theme) this.linkRef.href = this.themes[parseInt(theme)]
}
setTheme(dark:bool){
this.linkRef.href = this.themes[dark ? 1 : 0]
}
【讨论】: