只需几行代码就可以在网站上添加暗模式

黑暗模式在去年变得非常流行,现在所有流行的应用都提供了一个开关来打开它。

在这个简短的教程中,我们将学习如何以不同的方式在您的网站中添加对黑暗模式的支持:首先是使用CSS,最后是使用 JavaScript构建的切换。

1.使用CSS添加暗模式支持

如果你不想对黑暗模式过于着迷,只想让你的网站改变调色板,如果用户使用的浏览器启用了黑暗模式,CSS 就足够了。

在 CSS 文件中,编写以下媒体查询:

@media (prefers-color-scheme: dark) {
    /* all your styles for dark mode here */
}

使用此媒体查询,我们可以定义一组自定义样式,以便在用户启用暗模式浏览时应用。
根据 CanIUse.com 的数据,支持率在78%左右,不包括 Internet Explorer 和 Edge(而不是 Edge Chromium )。
如果您不在企业软件上工作,而您真的需要担心用户仍在使用 InternetExplorer ,我认为这个媒体查询可以很好地工作。
这种方法的缺点是你的用户无法控制他们想如何查看你的网站,所以我只在你没有时间或不想实现切换的情况下才会考虑。


2.用JavaScript切换黑暗模式

现在让我们更进一步,使用JavaScript实现黑暗模式的切换。
要做到这一点,您需要创建两个不同的样式表,每个主题一个(浅色和深色)。如果需要,可以创建第三个样式表,其中包含与主题无关的样式。
第一步是在 html 的头部定义一个默认的主题样式表,如下所示:

<link id="theme" rel="stylesheet" type="text/css" href="light-theme.css" />

我们现在要做的是创建一个按钮,用另一个按钮交换样式表。
继续创建一个按钮,如下所示,并把它放在任何你喜欢的地方,最好是在页面的顶部,以便用户更快地访问。

<button id="theme-toggle">Switch to dark mode</button>

现在我们有了一个简单的按钮,让我们添加一些 JavaScript 到其中。
打开 JavaScript 文件并编写以下代码行:

// this one is jut to wait for the page to load
document.addEventListener('DOMContentLoaded', () => {

    const themeStylesheet = document.getElementById('theme');
    const themeToggle = document.getElementById('theme-toggle');
    themeToggle.addEventListener('click', () => {
        // if it's light -> go dark
        if(themeStylesheet.href.includes('light')){
            themeStylesheet.href = 'dark-theme.css';
            themeToggle.innerText = 'Switch to light mode';
        } else {
            // if it's dark -> go light
            themeStylesheet.href = 'light-theme.css';
            themeToggle.innerText = 'Switch to dark mode';

        }
    })
})

这段代码只是在我们的按钮中添加了一个事件监听器,这样每当我们单击它时,它就会查看样式表的 href 并在黑暗和光明之间切换。我们还改变了按钮本身的文本,以反映主题的变化。
您可以随意使用按钮本身并定义一些整洁的图标,以便更好地区分暗主题和光主题。
如果您尝试上面的代码,您将看到,当您单击按钮时,样式表会更改,但有一个问题。
你能猜出是什么问题吗?
如果你认为下一次用户返回网站时,他们将不得不再次单击按钮来再次切换主题,那么你猜对了。
目前用户的选择没有保存在任何地方,所以一旦他们离开网站,回来,他们将不得不再次切换主题。
幸运的是,有一个快速的方法可以让我们克服这个问题,那就是本地存储。

在本地存储中保存用户的首选项

顾名思义,设置为首选项的主题颜色将存储在浏览器的本地,因此,如果用户更改浏览器或设备,他们将失去对主题的选择,但大多数情况下,他们可能会使用相同的设备返回到您的站点,因此这是存储他们首选项的快速有效方法。
LocalStorage 可以存储键值对,我们可以这样使用它:

localStorage.setItem('theme', 'dark-theme.css');

让我们继续并将其添加到以前的代码中:

// this one is jut to wait for the page to load
document.addEventListener('DOMContentLoaded', () => {

    const themeStylesheet = document.getElementById('theme');
    const storedTheme = localStorage.getItem('theme');
    if(storedTheme){
        themeStylesheet.href = storedTheme;
    }
    const themeToggle = document.getElementById('theme-toggle');
    themeToggle.addEventListener('click', () => {
        // if it's light -> go dark
        if(themeStylesheet.href.includes('light')){
            themeStylesheet.href = 'dark-theme.css';
            themeToggle.innerText = 'Switch to light mode';
        } else {
            // if it's dark -> go light
            themeStylesheet.href = 'light-theme.css';
            themeToggle.innerText = 'Switch to dark mode';
        }
        // save the preference to localStorage
        localStorage.setItem('theme',themeStylesheet.href)  
    })
})

正如您在上面的代码中看到的,在页面加载时,我们通过使用 localStorage.getItem('theme' ) 检查 localStorage 中是否存储了主题首选项。
如果我们找到了什么,我们就马上应用它,恢复用户的偏好。
我还更新了单击按钮时运行的代码,包括此行 localStorage.setItem('theme',themeStylesheet.ref) 来存储用户选择。
现在我们有了一个功能齐全的明暗主题切换,可以记住用户的选择,大大改善用户体验。
最棒的是这只花了10分钟!
记住,你不局限于一个暗光主题,你可以有你想要的,你甚至可以得到他们的幻想。
关于 localStorage 的最后几句话:它现在的支持率已经超过93%,因此您可以放心地使用它,而不必太担心传统浏览器,因为即使在IE8-9-10上也支持它!。
另一种快速存储用户首选项( localStorage 除外)的方法是 sessionStorage ,顾名思义,它只在当前会话中持续存在,直到浏览器会话处于活动状态,这不适合我们的情况。
关于 localStorage 和 sessionStorage ,需要知道的一点是,它们都遵循相同的源策略,这意味着如果您通过 Http 和 Https 访问您的网站,则通过 Https 选择的主题不会反映在 Http 上。
如果你开始想知道为什么你的偏好没有被保存下来,知道这个小小的警告可以帮助你避免花半个小时去猜测是什么问题。


Update:实现相同结果的另一种方法,但是只使用一个样式表,就是在主体上切换一个全局类。
将此添加到JavaScript

button.addEventListener('click', () => {
    document.body.classList.toggle('dark');
    localStorage.setItem('theme', document.body.classList.contains('dark') ? 'dark' : 'light');
});

if (localStorage.getItem('theme') === 'dark') {
    document.body.classList.add('dark');
}

您的css将如下所示:

/* Light mode */
body {
  background: #fff;
  color: #000;
}

/* Dark mode */
body.dark {
  background: #000;
  color: #fff;
}

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值