• 日常搜索
  • 百度一下
  • Google
  • 在线工具
  • 搜转载

使用 CSS 变量和 JavaScript 在配色方案之间切换

在本教程中,我们将讨论如何使用 css 变量和一行原生 javascript 在网站上实现不同的配色方案

首先,我们将实现一个简单的明暗模式切换开关。然后我们将对此进行扩展以实现尽可能多的主题;浅色模式、深色模式、90 年代霓虹灯模式,应有尽有!

我们还将根据用户的偏好使用媒体查询来显示暗模式或亮模式,并使用本地存储来记住他们选择了我们的哪种配色方案。

亮/暗模式拨动开关演示

让我们看一下明暗模式切换开关的演示。我们将首先构建它,然后对其进行扩展。

See the Pen  Dark/Light Mode with CSS variables by Envato Tuts+ (@tutsplus)  on CodePen.

1.如何创建暗模式切换

html

首先,我们将初始化两个按钮以允许我们控制明暗模式。 


<div class="toggle-container">    

<button class="theme-btn light" title="Light mode">   

<!--sun icon-->   

</button>    

<button class="theme-btn dark" title="Dark mode">    

<!--moon icon-->    

</button>    

</div>

我使用这些天气图标代表太阳和月亮来代表光明和黑暗的主题,但您可以将它们替换为您喜欢的任何内容。我还设置了title 属性来为屏幕阅读器提供上下文。


使用 CSS 变量和 JavaScript 在配色方案之间切换  第1张


CSS

我们的切换实现的大部分工作都是使用 CSS 完成的。我们可以对按钮进行样式设置以实现圆形图标效果:

.theme-btn {

    width: 3em;

    height: 3em;

    padding: 0.5em;

    border-radius: 50%;

    cursor: pointer;

    border: none;

    background-color: transparent;

    }

 

    .theme-btn img {

    height: 100%;

    width: 100%;

    object-fit: cover;

    }

我们使用CSS 自定义属性定义我们的主题颜色。

“自定义属性[...] 包含要在整个文档中重复使用的特定值。它们使用自定义属性表示法(例如,--main-color: black;)进行设置,并使用  函数(例如,  )进行访问”- MDNvar()color: var(--main-color);

自定义属性通常在:root伪类内部定义,它允许我们定位<html> 元素标签。:root在此示例中,我们为使用类名称 定义了默认、浅色和深色主题的变量 。

:root,

    :root.light {

    --bg-color: #fff;

    --text-color: #123;

    }

 

    :root.dark {

    --bg-color: #121212;

    --text-color: #45ADFE;

    }

现在我们将我们的自定义属性分配给其他元素——这就是允许颜色根据 :root类而改变的原因。我们可以body像这样分配颜色:

body {

    background-color: var(--bg-color);

    color: var(--text-color);

    }

body 标签根据分配给:root. 

JavaScript

在这一点上,我们可以使用 javaScript 来确定:root标签的类,并且正如所承诺的,我们只需要一行:


const setTheme = theme => document.documentElement.className = theme;

该setTheme函数将root元素的类设置为参数theme。

我们可以将此函数传递给我们的按钮,因此更新后的 HTML 如下所示:

<div class="toggle-container">

   <button class="theme-btn light" onclick="setTheme('light')" title="Light mode">

   <!--sun icon-->

   </button>

   <button class="theme-btn dark" onclick="setTheme('dark')" title="Dark mode">

   <!--moon icon-->

   </button>

   </div>

单击浅色按钮将 HTML 类设置为light,单击深色按钮将 HTML 类设置为dark。

根据单击的按钮,我们的 HTML 元素会发生以下情况:


使用 CSS 变量和 JavaScript 在配色方案之间切换  第2张


body 标签的样式如下所示:


使用 CSS 变量和 JavaScript 在配色方案之间切换  第3张


有了这个,我们已经实现了在明暗主题之间切换所需的一切!

See the Pen  Dark/Light Mode with CSS variables by Envato Tuts+ (@tutsplus)  on CodePen.

2.处理基于颜色主题的样式

由于这个实现,我们可以根据 HTML 元素的类名来选择不同的元素样式。在我们的演示中,我们一次只显示一个按钮,因此我们可以根据选择的类隐藏另一个按钮。这是 CSS 的样子:

.theme-btn.light {

    display: none;

    }

 

    .dark .theme-btn.light {

    display: block;

    background-color: #fff;

    }

 

    .dark .theme-btn.dark {

    display: none;

    }

这样,当父元素有 class 时,我们显示亮按钮并隐藏暗按钮dark。

3.更多自定义属性

CSS 自定义属性不仅限于颜色,我们可以更改从字体大小到背景图像的所有内容。这是一个演示,我们使用切换开关更改字体样式和背景图像。

See the Pen  Background Toggle by Envato Tuts+ (@tutsplus)  on CodePen.

使用的图片:卷发微笑的年轻女子和千禧一代的朋友在晚上点燃烟火。

我们只需要更新 CSS,使它看起来像:

:root,

    :root.light {

    --bg-color: #d6e8f5;

    --text-color: #0a1c29;

    --bg-url: url(//image-url);

    --font-family: 'Fredoka One', cursive;

    }

 

    :root.dark {

    --bg-color: #0a1c29;

    --text-color: #45ADFE;

    --bg-url: url(//image-url);

    --font-family: 'Alfa Slab One', cursive;

    }

 

    body {

    background-image: var(--bg-url);

    background-size: cover;

    color: var(--text-color);

    font-family: var(--font-family);

    }

4.多种配色方案

现在我们已经实现了亮/暗模式切换,我们可以继续扩展它以创建我们想要的尽可能多的配色方案。

对于这种方法,我们创建了一个下拉菜单,允许您为页面选择 6 个不同的主题。看一下演示:

See the Pen  Color theme dropdown by Envato Tuts+ (@tutsplus)  on CodePen.

HTML

在这个例子中,我们使用一个select元素来创建下拉菜单并将主题作为选项传递给选择。选项的值是我们将作为类传递给 HTML 元素的值。

<select name="theme-select" id="theme-select">

    <option value="light">Light</option>

    <option value="dark">Dark</option>

    <option value="blue">Blue</option>

    <option value="pink">Pink</option>

    <option value="space">Space</option>

    <option value="nyan">Nyan</option>

    </select>

CSS

我们将:root使用类名为不同的主题创建变量。

:root,

    :root.light {

    --bg-color: #fff;

    --text-color: #123;

    }

 

    :root.dark {

    --bg-color: #121212;

    --text-color: #696d7d;

    }

 

    :root.blue {

    --bg-color: #05396B;

    --text-color: #E7F1FE;

    }

 

    :root.pink {

    --bg-color: #ffcad4;

    --text-color: #e75480;

    }

 

    :root.space {

    --bg-color: #000;

    --text-color: #f2bd16;

    --bg-url: url(//space);

    --font-family: 'Press Start 2P', cursive;

    }

 

    :root.nyan {

    --bg-color: #013367;

    --text-color: #fff;

    --bg-url: url(//nyan);

    --font-family: 'Comic Neue', cursive;

    }

我们还可以设置 select 标签的样式以使用变量而不是默认样式:

select {

    padding: 0.25rem 0.75rem;

    font-size: 1.25rem;

    font-family: inherit;

    background-color: var(--bg-color);

    color: var(--text-color);

    border-radius: 0.25rem;

    }

那么我们的体型是这样的:

body {

    margin: 0;

    background-color: var(--bg-color);

    background-image: var(--bg-url);

    color: var(--text-color);

    font-family: var(--font-family, "Open Sans", sans-serif);

    }

注意:我们也可以将备用值传递给 CSS 变量,因此设置属性 font-family: var(--font-family, "Open Sans", sans-serif 允许浏览器设置 font-family 属性,就"Open Sans", sans-serif好像 CSS 变量--font-family未定义一样。

JavaScript

最后,我们更新我们的 JavaScript 以检测何时从 select 元素中选择了一个选项。

const setTheme = theme => document.documentElement.className = theme;

 

    document.getElementById('theme-select').addeventListener('change', function() {

    setTheme(this.value);

    });

我们以选择元素为目标并将所选值setTheme作为根类传递。

这就是我们需要的所有 JavaScript,我们可以通过在 CSS 中包含更多 HTML 选项和 :root 样式来继续拥有尽可能多的主题。

5.根据用户喜好设置主题

我们还可以根据用户系统的偏好来决定是设置亮模式还是暗模式。我们可以使用prefers-color-scheme媒体查询来检测用户喜欢的配色方案。

“ prefers-color-schemeCSS 媒体功能用于检测用户是否请求了浅色或深色主题。” -MDN _

@media (prefers-color-scheme: dark) {

    :root {

    --bg-color: #121212;

    --text-color: #45ADFE;

    }

    }

在媒体查询中,如果用户的系统设置为深色主题,我们将默认:root变量设置为深色模式的颜色。

6.将用户选择存储在本地存储中

另一个功能是将用户选择的主题存储在本地存储中,因此页面在每次访问时默认采用选择的主题。我们可以修改我们的setTheme函数以将选定的选项存储在本地存储中。

const setTheme = (theme) => {

    document.documentElement.className = theme;

    localstorage.setItem('theme', theme);

    }

要在页面加载时加载保存的主题,我们可以创建一个getTheme从 localStorage 获取主题项的函数,并在脚本加载时调用该函数:

const getTheme = () => {

    const theme = localStorage.getItem('theme');

    theme && setTheme(theme);

    }

 

    getTheme();

结论

总而言之,我们可以通过以下方式创建主题选择器:

  1. :root为使用 CSS 变量设置主题颜色

  2. 使用 JavaScript 更改根类。

  3. 在相应的 HTML 元素中调用函数。

有了这个,我们创建了一个功能齐全的主题选择器,它可以保存用户选项并考虑他们的偏好。


文章目录
  • 亮/暗模式拨动开关演示
  • 1.如何创建暗模式切换
    • html
    • CSS
    • JavaScript
  • 2.处理基于颜色主题的样式
  • 3.更多自定义属性
  • 4.多种配色方案
    • HTML
    • JavaScript
  • 5.根据用户喜好设置主题
  • 6.将用户选择存储在本地存储中
  • 结论