”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 只需几行 JavaScript 即可更改浅色和深色主题

只需几行 JavaScript 即可更改浅色和深色主题

发布于2024-08-26
浏览:237

好吧..涉及到一点CSS?但它比我在互联网上找到的答案要容易得多。

我想要实现什么?
我试图用这种方法实现两件事。

  1. 我需要允许网站以用户喜欢的方式加载(他们已经在操作系统中选择主题的部分)
  2. 但我也想允许它们在加载后在深色和浅色模式之间切换。

因此,我们将拥有一个网站,该网站将加载用户期望的主题,然后允许他们在需要时进行更改。

第 1 步:创建用于切换的按钮

只需几行 JavaScript 即可更改浅色和深色主题

我使用一个图像作为我的按钮,其中有一个月亮的 svg 图像。您可以添加您感觉可以在两个选项之间切换的按钮或复选框。

第 2 步:将颜色详细信息作为自定义属性放入 CSS 中

:root{
    color-scheme: light dark;

    --light-bg: ghostwhite;
    --light-color: darkslategray;
    --light-code: tomato;

    --dark-bg: darkslategray;
    --dark-color: ghostwhite;
    --dark-code: gold;
}

.light{
    color-scheme: light;
}

.dark{
    color-scheme: dark;
}

好吧..所以在根中你会看到名为 color-scheme 的属性,这将成为我们的游戏规则改变者。
正如您所看到的,它需要浅色或深色的值。我还创建了两个类 .light 和 .dark,将颜色方案的值设置为深色或浅色。

第 3 步:为代码的各个部分添加颜色

body{
    background-color: light-dark(var(--light-bg), var(--dark-bg));
}

现在每当属性要求颜色(如背景、颜色属性)时,您可以使用名为 light-dark() 的函数。
该函数有两个值,第一个值在颜色方案设置为浅色时使用,第二个值在颜色方案设置为深色时使用。

是的...这是2024年5月发布的功能。它相当新,但很快就会适应。截至撰写本文时,它处于基线支持中。这是它的文档

Change Light and Dark theme in just lines of JavaScript

light-dark() - CSS:级联样式表 | light-dark() MDN

light-dark() CSS 函数可以为属性设置两种颜色 - 通过检测开发人员是否设置了浅色或深色配色方案或用户是否请求了浅色或深色主题来返回两种颜色选项之一 -无需将主题颜色包含在首选颜色方案媒体功能查询中。 用户可以通过操作系统设置(例如浅色或深色模式)或用户代理设置来表明他们的颜色方案偏好。 light-dark() 函数可以提供两个颜色值,其中任何 值都可以接受。如果用户的首选项设置为浅色或未设置首选项,则 light-dark() CSS 颜色函数返回第一个值;如果用户的首选项设置为深色,则返回第二个值。

Change Light and Dark theme in just lines of JavaScript 开发者.mozilla.org

如果您使用此功能,CSS 将自动从操作系统检测用户首选项并将其设置为他们想要的颜色。
我们实现了第一个目标,网站将加载用户操作系统中已经想要的颜色模式。

第 4 步:使用 Javascript 在深色模式和浅色模式之间切换

// mode is the toggle button 
mode.addEventListener("click", ()=>{
    // we are getting the color scheme here
    let theme = document.documentElement.style.colorScheme;
    /*  when a website is first loaded
    it will have null as its color-scheme value*/
    if(theme == null){
        // this window.matchMedia() checks if the user prefers the dark theme
        if(window.matchMedia("(prefers-color-scheme:dark)").matches){
            /* if they prefer dark, clicking on our button should turn everything to light, 
            the color-scheme will be given a value as light  */
            document.documentElement.style.colorScheme = "light"; 
        }
        // Or else the color-scheme will be set to dark
        document.documentElement.style.colorScheme = "dark";
    }

    /* Now since our toggle button set the color scheme,
        we can simply change light to dark and dark to light using below code 
    */

    else{
        document.documentElement.style.colorScheme = (theme == "light")? "dark": "light";
    }
});

这里,document.documentElement.style.colorScheme实际上引用了CSS中的:root元素。
由于我们在上一步中已经实现了以用户首选模式打开网站,因此当单击切换按钮时,它会执行以下操作。

  1. 它检查 color-scheme 是否有任何值,如果没有,则网站处于用户首选模式,我们需要确定是深色还是浅色来更改模式。
  2. 它使用 window.matchMedia("(prefers-color-scheme:dark)").matches 来查找是否处于深色模式,如果处于深色模式,我们将 color-scheme 更改为浅色,如果不是,我们将其更改为深色。
  3. 下次他们单击按钮时,我们已经为颜色方案设置了值,因此我们只需在深色或浅色之间切换。

*PS:*这是我的第一篇文章,我仍然是网络开发的初学者。但当我搜索这个方法时,并没有看到任何相关的帖子。如果您已经知道这一点,我很抱歉点击诱饵您?我认为这篇文章将帮助我在每次开发新项目时记住这个过程。
如果您正在努力让您的网站在旧浏览器上运行,那么此方法绝对不适合您。在关于这篇文章的评论中告诉我。感谢您的阅读。

版本声明 本文转载于:https://dev.to/stewardrighteous/change-light-and-dark-theme-in-just-10-lines-of-javascript-25pp?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在细胞编辑后,如何维护自定义的JTable细胞渲染?
    在JTable中维护jtable单元格渲染后,在JTable中,在JTable中实现自定义单元格渲染和编辑功能可以增强用户体验。但是,至关重要的是要确保即使在编辑操作后也保留所需的格式。在设置用于格式化“价格”列的“价格”列,用户遇到的数字格式丢失的“价格”列的“价格”之后,问题在设置自定义单元格...
    编程 发布于2025-06-25
  • MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    MySQL中如何高效地根据两个条件INSERT或UPDATE行?
    在两个条件下插入或更新或更新 solution:的答案在于mysql的插入中...在重复键更新语法上。如果不存在匹配行或更新现有行,则此功能强大的功能可以通过插入新行来进行有效的数据操作。如果违反了唯一的密钥约束。实现所需的行为,该表必须具有唯一的键定义(在这种情况下为'名称'...
    编程 发布于2025-06-25
  • CSS可以根据任何属性值来定位HTML元素吗?
    CSS可以根据任何属性值来定位HTML元素吗?
    靶向html元素,在CSS 中使用任何属性值,在CSS中,可以基于特定属性(如下所示)基于特定属性的基于特定属性的emants目标元素: 字体家庭:康斯拉斯(Consolas); } 但是,出现一个常见的问题:元素可以根据任何属性值而定位吗?本文探讨了此主题。的目标元素有任何任何属性值,属...
    编程 发布于2025-06-25
  • 为什么HTML无法打印页码及解决方案
    为什么HTML无法打印页码及解决方案
    无法在html页面上打印页码? @page规则在@Media内部和外部都无济于事。 HTML:Customization:@page { margin: 10%; @top-center { font-family: sans-serif; font-weight: bo...
    编程 发布于2025-06-25
  • Python读取CSV文件UnicodeDecodeError终极解决方法
    Python读取CSV文件UnicodeDecodeError终极解决方法
    在试图使用已内置的CSV模块读取Python中时,CSV文件中的Unicode Decode Decode Decode Decode decode Error读取,您可能会遇到错误的错误:无法解码字节 在位置2-3中:截断\ uxxxxxxxx逃脱当CSV文件包含特殊字符或Unicode的路径逃...
    编程 发布于2025-06-25
  • 如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    如何为PostgreSQL中的每个唯一标识符有效地检索最后一行?
    postgresql:为每个唯一标识符提取最后一行,在Postgresql中,您可能需要遇到与在数据库中的每个不同标识相关的信息中提取信息的情况。考虑以下数据:[ 1 2014-02-01 kjkj 在数据集中的每个唯一ID中检索最后一行的信息,您可以在操作员上使用Postgres的有效效率: ...
    编程 发布于2025-06-25
  • JavaScript计算两个日期之间天数的方法
    JavaScript计算两个日期之间天数的方法
    How to Calculate the Difference Between Dates in JavascriptAs you attempt to determine the difference between two dates in Javascript, consider this s...
    编程 发布于2025-06-25
  • 表单刷新后如何防止重复提交?
    表单刷新后如何防止重复提交?
    在Web开发中预防重复提交 在表格提交后刷新页面时,遇到重复提交的问题是常见的。要解决这个问题,请考虑以下方法: 想象一下具有这样的代码段,看起来像这样的代码段:)){ //数据库操作... 回声“操作完成”; 死(); } ?> ...
    编程 发布于2025-06-25
  • 解决Spring Security 4.1及以上版本CORS问题指南
    解决Spring Security 4.1及以上版本CORS问题指南
    弹簧安全性cors filter:故障排除常见问题 在将Spring Security集成到现有项目中时,您可能会遇到与CORS相关的错误,如果像“访问Control-allo-allow-Origin”之类的标头,则无法设置在响应中。为了解决此问题,您可以实现自定义过滤器,例如代码段中的MyFi...
    编程 发布于2025-06-25
  • 将图片浮动到底部右侧并环绕文字的技巧
    将图片浮动到底部右侧并环绕文字的技巧
    在Web设计中围绕在Web设计中,有时可以将图像浮动到页面右下角,从而使文本围绕它缠绕。这可以在有效地展示图像的同时创建一个吸引人的视觉效果。 css位置在右下角,使用css float and clear properties: img { 浮点:对; ...
    编程 发布于2025-06-25
  • 如何限制动态大小的父元素中元素的滚动范围?
    如何限制动态大小的父元素中元素的滚动范围?
    在交互式接口中实现垂直滚动元素的CSS高度限制问题:考虑一个布局,其中我们具有与用户垂直滚动一起移动的可滚动地图div,同时与固定的固定sidebar保持一致。但是,地图的滚动无限期扩展,超过了视口的高度,阻止用户访问页面页脚。$("#map").css({ marginT...
    编程 发布于2025-06-25
  • 在C#中如何高效重复字符串字符用于缩进?
    在C#中如何高效重复字符串字符用于缩进?
    在基于项目的深度下固定字符串时,重复一个字符串以进行凹痕,很方便有效地有一种有效的方法来返回字符串重复指定的次数的字符串。使用指定的次数。 constructor 这将返回字符串“ -----”。 字符串凹痕= new String(' - ',depth); console.Wr...
    编程 发布于2025-06-25
  • 如何干净地删除匿名JavaScript事件处理程序?
    如何干净地删除匿名JavaScript事件处理程序?
    删除匿名事件侦听器将匿名事件侦听器添加到元素中会提供灵活性和简单性,但是当要删除它们时,可以构成挑战,而无需替换元素本身就可以替换一个问题。 element? element.addeventlistener(event,function(){/在这里工作/},false); 要解决此问题,请考虑...
    编程 发布于2025-06-25
  • 如何有效地选择熊猫数据框中的列?
    如何有效地选择熊猫数据框中的列?
    在处理数据操作任务时,在Pandas DataFrames 中选择列时,选择特定列的必要条件是必要的。在Pandas中,选择列的各种选项。选项1:使用列名 如果已知列索引,请使用ILOC函数选择它们。请注意,python索引基于零。 df1 = df.iloc [:,0:2]#使用索引0和1 的 ...
    编程 发布于2025-06-25
  • Spark DataFrame添加常量列的妙招
    Spark DataFrame添加常量列的妙招
    在Spark Dataframe ,将常数列添加到Spark DataFrame,该列具有适用于所有行的任意值的Spark DataFrame,可以通过多种方式实现。使用文字值(SPARK 1.3)在尝试提供直接值时,用于此问题时,旨在为此目的的column方法可能会导致错误。 df.withCo...
    编程 发布于2025-06-25

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3