在本教程中,您将学习如何利用“css 复选框黑客技术”和 CSS 变量来创建纯 CSS 主题切换器。
准备好迎接另一个 CSS 挑战了吗?
注意:本教程假设您熟悉这种特殊的 CSS 技术以及高级 CSS 选择器(例如通用兄弟组合器)。如果您以前没有听说过这些内容,或者需要复习,请查看本教程末尾的资源。
我们的 CSS 主题切换器
这是我们将在本教程中创建的主题切换器:
See the Pen How to Build a Simple Theme Switcher With the CSS Checkbox Hack by Envato Tuts+ (@tutsplus) on CodePen.
单击右上角的任何颜色以查看页面外观的变化。您还可以使用键盘的箭头键来切换配色方案。
1.从 html 标记开始
我们将从代表可用主题颜色的八个单选按钮开始。默认情况下,将选中第一个单选按钮。
然后,我们将定义一个控制页面颜色的包装元素。在其中,我们将放置:
这些单选按钮的相关标签和
页面的主要内容。这个页面将介绍一些关于??的事情。
这是页面结构:
<input type="radio" id="white" name="colors" value="white" checked>
<input type="radio" id="dark" name="colors" value="dark">
<input type="radio" id="red" name="colors" value="red">
<input type="radio" id="green" name="colors" value="green">
<input type="radio" id="yellow" name="colors" value="yellow">
<input type="radio" id="blue" name="colors" value="blue">
<input type="radio" id="purple" name="colors" value="purple">
<input type="radio" id="olive" name="colors" value="olive">
<div class="page-wrapper">
<div class="color-palette">
<label for="white"></label>
<label for="dark"></label>
<label for="red"></label>
<label for="green"></label>
<label for="yellow"></label>
<label for="blue"></label>
<label for="purple"></label>
<label for="olive"></label>
</div>
<article class="post">
<div class="container">...</div>
</article>
</div>
2.定义一些基本样式
像往常一样,我们将继续介绍一些常见的重置样式。
最重要的是,请注意以下事项:
我们将使用自定义属性来定义八种不同的配色方案。每个方案将包括两个颜色定义,它们代表特定主题的页面颜色。
我们将通过将单选按钮移出屏幕来在视觉上隐藏它们。我们将提供它们position: fixed,因为在布局中,当我们滚动时,调色板应该保持固定。请记住,如果我们给它们position: absolute,每次我们点击一个主题颜色,浏览器都会跳转到页面顶部。
以下是重置样式:
:root {
/*WHITE*/
--white-bg-color: #fff;
--white-text-color: #000;
/*DARK*/
--dark-bg-color: #434343;
--dark-text-color: #fff;
/*RED*/
--red-bg-color: #ce8082;
--red-text-color: #020202;
/*GREEN*/
--green-bg-color: #40de7c;
--green-text-color: #020202;
/*YELLOW*/
--yellow-bg-color: #fdc011;
--yellow-text-color: #110d02;
/*BLUE*/
--blue-bg-color: #2943a1;
--blue-text-color: #d4cbcd;
/*PURPLE*/
--purple-bg-color: #dbdbed;
--purple-text-color: #29262e;
/*OLIVE*/
--olive-bg-color: #838b74;
--olive-text-color: #f7f5e4;
}
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
a {
color: inherit;
}
img {
max-width: 100%;
height: auto;
}
[type="radio"] {
position: fixed;
left: -9999px;
}
label {
cursor: pointer;
}
body {
font: 300 20px / 1.5 "Ubuntu", sans-serif;
}
3. 设置主要样式
接下来,我们将设置主要样式。
最重要的是:
如上所述,当我们滚动时,调色板将始终停留在右上角。
每个标签/主题颜色看起来像一个圆圈,其颜色将取决于*-bg-color 相关配色方案的 CSS 变量的值。
当页面颜色发生变化时,我们将添加一些过渡。
以下是关键样式:
/*CUSTOM VARIABLES HERE*/
[id="white"] ~ .page-wrapper [for="white"] {
background: var(--white-bg-color);
}
[id="dark"] ~ .page-wrapper [for="dark"] {
background: var(--dark-bg-color);
}
[id="red"] ~ .page-wrapper [for="red"] {
background: var(--red-bg-color);
}
[id="green"] ~ .page-wrapper [for="green"] {
background: var(--green-bg-color);
}
[id="yellow"] ~ .page-wrapper [for="yellow"] {
background: var(--yellow-bg-color);
}
[id="blue"] ~ .page-wrapper [for="blue"] {
background: var(--blue-bg-color);
}
[id="purple"] ~ .page-wrapper [for="purple"] {
background: var(--purple-bg-color);
}
[id="olive"] ~ .page-wrapper [for="olive"] {
background: var(--olive-bg-color);
}
.page-wrapper {
padding: 30px 0;
transition: all 0.3s ease-in-out;
}
.color-palette {
position: fixed;
top: 30px;
right: 15px;
display: grid;
grid-row-gap: 10px;
padding: 10px;
border-radius: 20px;
background: rgba(0, 0, 0, 0.4);
}
.color-palette label {
position: relative;
width: 20px;
height: 20px;
border-radius: 50%;
}
.color-palette label::before {
display: none;
content: "";
position: absolute;
top: 50%;
left: -30px;
transform: translateY(-50%);
width: 10px;
height: 2px;
}
4. Checkbox Hack:在主题之间切换
现在是有趣的部分!每次单击标签/主题颜色(即变为活动状态)时,都会发生以下情况:
将出现活动标签的::before伪元素。此外,它的颜色将取决于 *-text-color 相关配色方案的 CSS 变量的值。
页面颜色将根据活动配色方案平滑更改。
以下是相关样式:
/*CUSTOM VARIABLES HERE*/
[type="radio"]:checked ~ .page-wrapper label::before {
display: block;
}
[id="white"]:checked ~ .page-wrapper {
color: var(--white-text-color);
background: var(--white-bg-color);
}
[id="white"]:checked ~ .page-wrapper [for="white"]::before {
background: var(--white-text-color);
}
[id="dark"]:checked ~ .page-wrapper {
color: var(--dark-text-color);
background: var(--dark-bg-color);
}
[id="dark"]:checked ~ .page-wrapper [for="dark"]::before {
background: var(--dark-text-color);
}
[id="red"]:checked ~ .page-wrapper {
color: var(--red-text-color);
background: var(--red-bg-color);
}
[id="red"]:checked ~ .page-wrapper [for="red"]::before {
background: var(--red-text-color);
}
[id="green"]:checked ~ .page-wrapper {
color: var(--green-text-color);
background: var(--green-bg-color);
}
[id="green"]:checked ~ .page-wrapper [for="green"]::before {
background: var(--green-text-color);
}
[id="yellow"]:checked ~ .page-wrapper {
color: var(--yellow-text-color);
background: var(--yellow-bg-color);
}
[id="yellow"]:checked ~ .page-wrapper [for="yellow"]::before {
background: var(--yellow-text-color);
}
[id="blue"]:checked ~ .page-wrapper {
color: var(--blue-text-color);
background: var(--blue-bg-color);
}
[id="blue"]:checked ~ .page-wrapper [for="blue"]::before {
background: var(--blue-text-color);
}
[id="purple"]:checked ~ .page-wrapper {
color: var(--purple-text-color);
background: var(--purple-bg-color);
}
[id="purple"]:checked ~ .page-wrapper [for="purple"]::before {
background: var(--purple-text-color);
}
[id="olive"]:checked ~ .page-wrapper {
color: var(--olive-text-color);
background: var(--olive-bg-color);
}
[id="olive"]:checked ~ .page-wrapper [for="olive"]::before {
background: var(--olive-text-color);
}
您可能需要一些时间来了解上述样式的工作原理。如果是这种情况,浏览器检查器以及其他类似教程是您最好的朋友!
结论
就是这样,伙计们!在这个简短的教程中,我们结合了“CSS 复选框 hack 技术”和 CSS 变量的强大功能来构建具有动态颜色主题的页面。希望你喜欢这个练习,并且你会在你即将到来的项目中尝试它。
请注意,这只是一个有趣的练习,展示了您可以使用 CSS 实现什么。label 出于可访问性原因,不建议将 元素留空,并取消其角色。
如果您还想构建一个更高级的主题开关,在页面加载时保持选定的主题颜色,请务必阅读 本教程。