CSS实现切换主题
CSS实现切换主题
方式一:主题层
这是最常用的一种方法。
首先我们的站点会有一个最初的基础样式,后续通过添加一些额外的CSS来覆盖与重新定义部分样式。
@import "style.css"; // 基础样式、默认样式
@import "button.css"; // 比如说自定义了一个按钮的样式,部分覆盖style.css中的按钮
优点:
- 实现方法简单
- 可以实现将主题应用与所有元素
缺点:
- 过多的冗余代码
- 许多CSS其实是无用的,浪费了带宽
- 把样式文件切分到许多文件中,更加的繁琐
方式二:有状态的主题
该方式可以实现基于条件选择不同的主题皮肤,并允许用户在客户端随时切换主题。
非常适合需要对站点的某一个部分,进行独立样式设置的场景。
.u-color-current {
.t-red & {
color: blue;
}
.t-blue & {
color: red;
}
}
这样子,我们在不同主题的上下文环境下使用u-color-current时,就可以控制元素展示出不同主题的字体颜色。
<body class="t-red">
<h1 class="page-title u-color-current">...</h1>
</body>
上面这段代码会控制<h1>元素字体颜色为红色主题时的颜色。
优点:
- 非常适合主题切换的功能
- 非常适合站点局部的主题化
缺点:
- 许多主题混杂在了同一块代码中
- 可能会存在冗余
方式三:配置主题
使用sass配置文件,例如setting.config.scss,在这里面定义当前的主题值以及一些其他变量
$config: {
theme: red,
env: dev
}
// 从$config中获取响应的配置变量
@function config($key) {
@return map-get($config, $key);
}
定义tab组件样式:
.tab {
margin: 0;
padding: 0;
@if (config(theme) == red) {
background-color: red;
} @else {
background-color: gray;
}
}
引入:
@import "settings.config";
@import "components.tabs";
优点:
- 访问网站时,只会传输所需要的CSS,节省带宽
- 将主题的控制位置放在了一个地方
缺点:
- 在Sass中会有非常多的逻辑代码
- 只支持数量有限的主题
- 添加一个新的主题会十分费劲
方式四:主题调色板
为客户端提供完全的定制化主题,并经常希望更新或添加主题的时候,这种模式是不错的选择。
专门创建一个settings.palette.red.scss文件:
$color: red;
$color-tabs-background: $color-red;
tab组件样式:
.tabs {
margin: 0;
padding: 0;
backgroung-color: $color-tabs-background;
}
引入:
@import "settings.palette.red";
@import "components.tabs";
可以看见,与方式三相比,这里没有关于主题的逻辑判断,只需要专注于编辑样式,剩下的交给主题调色板即可。
优点:
- 编译出来的样式代码无冗余
- 非常适合做一些定制化主题
缺点:
- 由于主要通过设定不同的变量,所以代码确定以后,可以修改的范围是有限的
方式五:用户定制化
“用户定制化”在社交媒体产品、SaSS 平台或者是 Brandable Software 中最为常见。
要实现定制化,需要使用到util class(工具类)
首先,页面中支持自定义的元素,会被预先添加util class,例如u-user-color-background
<ul class="tabs u-user-color-background">...</ul>
此时,u-user-color-background还并未定义任何样式。而当用户输入了一个背景色时,我们会创建一个style标签,并将 hex 值注入其中
<style id="my-custom">
.u-user-color-background {
background-color: #00ffff;
}
</style>
这时用户就得到了一个红色的 Tab
优点:
- 用户自定义
- 允许用户拥有自己独一无二的站点
- 非常实用
缺点:
- 需要处理更多的“不可控”的情况
- 会有许多的冗余
- 会浪费CSS的带宽
- 失去部分CSS的浏览器缓存能力