为了账号安全,请及时绑定邮箱和手机立即绑定

我可以使用 JavaScript 切换暗模式吗?

我可以使用 JavaScript 切换暗模式吗?

萧十郎 2021-12-02 16:09:04
我正在使用prefers-color-scheme: darkCSS 创建一个深色主题(它适用于macOS v10.14 (Mojave) 中的Safari )。有没有办法强制页面在其他不支持它的浏览器上使用我的暗模式代码,如下所示?document.querySelector('#toggleDarkMode').addEventListener('click', function () {    -- Force page to use dark mode defined in CSS})
查看完整描述

3 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

不。


解决方法是将更改为自定义属性的每个属性移动。


然后你可以做这样的事情:


p {

    color: var(--body-colour);

}

并将其与:


/* default, light scheme */

body {

    --body-colour: black;

}


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

    body {

        --body-colour: white;

    }

}


body.light-mode {

    --body-colour: black;

}


body.dark-mode {

    --body-colour: white;

}

然后你的 JavaScript 只需要向body 元素添加一个light-mode或dark-mode类来强制使用该模式(覆盖默认值(如果浏览器不支持该功能,或者它被设置为亮模式)或暗模式媒体版本)。


查看完整回答
反对 回复 2021-12-02
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

我猜您正在使用媒体查询来了解浏览器/操作系统是否设置为暗模式。如果较旧的浏览器不理解媒体查询,他们将一起跳过它。这通常用于制作特定于浏览器的“黑客”。

使其工作的一种方法是在可以添加到<body>标签的通用类中的查询之外设置 sass 代码。您可以将此预设存储在 localStorage 或 cookie 中,这样它就不会在页面重置时重置。

关于 localStorage:https : //developer.mozilla.org/en-US/docs/Web/API/Window/localStorage

我会让当前的 sass 代码成为一个 mixin,这样你就不需要第二次声明它并使你的代码更容易维护。有关它的更多信息:https : //sass-lang.com/documentation/at-rules/mixin


查看完整回答
反对 回复 2021-12-02
?
墨色风雨

TA贡献1853条经验 获得超6个赞

您可以使用此代码


<!doctype html>

<html>

<head>

    <meta charset="utf-8">

    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">

    <title>Dark & Light Mode</title>

    <link rel="stylesheet" href="style.css">

    <style type="text/css">

        @import url("https://fonts.googleapis.com/css?family=Fredoka+One&display=swap");

        html {

            background: var(--backg);

            --btn: #2ab1ce;

            --backg: #fff;

            --colorx: #232323;

            width: 100%;

            height: 100vh;

            display: flex;

            flex-direction: column;

            justify-content: center;

            align-items: center;

        }


        html[data-theme='dartheme'] {

            background: var(--backg);

            --btn: #ea4b3c;

            --backg: #232323;

            --colorx: #fff;

        }


        h1 {

            font-family: 'Fredoka One', cursive;

            font-weight: 300;

            color: var(--colorx);

        }


        h2 {

            font-family: 'Fredoka One', cursive;

            font-weight: 100;

            color: var(--colorx);

        }


        input[type=checkbox] {

            visibility: hidden;

            height: 0;

            width: 0;

        }


        label {

            margin: 0 auto;

            display: flex;

            justify-content: center;

            align-items: center;

            border-radius: 100px;

            position: relative;

            cursor: pointer;

            text-indent: -9999px;

            width: 55px;

            height: 30px;

            background: var(--btn);

        }


        label:after {

            border-radius: 50%;

            position: absolute;

            content: '';

            background: #fff;

            width: 20px;

            height: 20px;

            top: 5px;

            left: 4px;

            transition: ease-in-out 200ms;

        }


        input:checked + label {

            background: #ea4b3c;

        }


        input:checked + label:after {

            left: calc(100% - 5px);

            transform: translateX(-100%);

        }


        html.transition,

        html.transition *,

        html.transition *:before,

        html.transition *:after {

            transition: ease-in-out 200ms !important;

            transition-delay: 0 !important;

        }

    </style>

</head>

<body>

    <div class="container">

        <h1>Light & Dark Mode</h1>

        <h2>Demo</h2>


        <input class="container_toggle" type="checkbox" id="switch" name="mode">

        <label for="switch">Toggle</label>

    </div>


    <script src="function.js"></script>

    <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script>

    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>

    <script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>

    <script type="text/javascript">

     var checkbox = document.querySelector('input[name=mode]');


            checkbox.addEventListener('change', function() {

                if(this.checked) {

                    trans()

                    document.documentElement.setAttribute('data-theme', 'dartheme')

                } else {

                    trans()

                    document.documentElement.setAttribute('data-theme', 'lighttheme')

                }

            })


            let trans = () => {

                document.documentElement.classList.add('transition');

                window.setTimeout(() => {

                    document.documentElement.classList.remove('transition');

                }, 1000)

            }

    </script>

</body>

</html>


查看完整回答
反对 回复 2021-12-02
  • 3 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信