【问题标题】:Bootstrap 4 Sass - changing theme dynamicallyBootstrap 4 Sass - 动态改变主题
【发布时间】:2018-01-11 04:45:25
【问题描述】:

sass 新手我遇到了一个问题,即如何通过用户交互启用网站主题的动态变化 - 比如说深色和浅色主题。我用作基础的模板(coreui)有一个 _custom.scss 文件,其中定义了各种变量

...
$navbar-bg: #fff;
...

这些变量的值需要根据用户选择的主题动态设置,我不知道如何完成。任何如何实现这一点的指针都将受到高度赞赏。

【问题讨论】:

    标签: css sass bootstrap-4


    【解决方案1】:

    SASS 是一个预处理器,这意味着它本质上会被编译成常规 CSS,然后交付给客户端。如果要更改主题,则必须使用 javascript 动态加载不同的样式表。

    案例一

    如果您希望用户在多个预先打包的主题之间进行选择。这可以通过导入样式的各个部分的多个“主题”样式表轻松完成。首先导入不同的颜色,然后导入 sass 的主体。例如:

    主题1.sass:

    @import 'theme1';
    @import 'base';
    @import 'other';
    

    theme2.sass:

    @import 'theme2';
    @import 'base';
    @import 'other';
    

    然后在 javascript 中,您可以删除旧样式表并在用户执行更改主题所需的任何操作时添加新样式表。例如,您可以在按钮的 onclick 中放置:

    document.getElementById('cssTheme').setAttribute("href", "/path/to/theme");
    

    最好小心一点,将元素放在文档的head 中,但这是一个很好的起点。使用 Jquery 可以使它看起来更好,但我不想假设你会拥有它。

    案例 2

    如果您希望用户动态更改单个元素颜色的颜色,则可能值得研究CSS Variables。当前对 IE/Edge 的支持很简陋,但它非常有趣。然后,当用户更改字段时,您可能只是更改页面某处 <style> 标记中的 css 变量,它应该通过文档传播。

    如果您想要更多浏览器支持,那么我认为最好的方法是使用 OK Sure 的答案。这给您带来的好处是只需更改一个变量,而不必重置使用该变量的每个元素样式。

    【讨论】:

    • 如果我搞砸了你如何链接到 sass 文件,请告诉我,我更习惯 less 而不是 sass
    • 嗨,唐感谢您的回答,我会调查的。我正在做一个有角度的项目,但具体的角度细节如何实现我自己会发现的解决方案。
    • 啊,是的,从来没有处理过角度问题。实际上,我只是认为您可以只编辑链接元素上的 href 并且看起来可行,因此我将更新我的答案>.>
    【解决方案2】:

    我认为你有两个选择。

    选项 1) 通过在服务器端运行命令为用户生成一个新的 CSS 文件,每当进行更改时重新编译样式。这可能会占用大量资源,因此可能不推荐。

    选项 2) 获取您想要访问的变量,找到它们在引导源中提到的位置,然后生成一个文件,或者在样式表包含在模板中后直接内联这些样式。

    因此,对于您在此处的示例,根据您使用的编码语言或模板(这是一个树枝示例),您可以在模板的头部内联以下内容:

    <style>
    .navbar {
        background-color: {{ user_theme.navbar-bg | default('#eeeeee') }}
    }
    </style>
    

    如果不知道您使用的是什么框架/语言/基础设施,很难准确地告诉您如何做到这一点。

    例如,如果您使用 Twig 和 PHP,您可以向模板发送一个 user_theme 对象,并拥有一个包含所有需要修改的样式的包含文件,如上所示。

    【讨论】:

    • 感谢您的建议,好的。正如你所说,选项 1 似乎没有那么吸引人,但我会研究选项 2。
    • 我在选项 2 中看到的唯一问题是您在 sass 之外维护主题。在 html 或其他地方做这通常是不好的做法。
    • 如果您不想编辑单个颜色,@Don 的答案会很好,只需生成预配置的主题 css 文件并让用户选择一个主题并加载该特定文件。如果您想为用户提供更精细的控制,我的回答可能更合适。
    • 啊,真的。我正在考虑切换预先打包的主题,而不是完全可定制的主题。嗯……
    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2021-05-25
    • 2021-12-06
    • 2020-06-14
    • 2012-07-27
    • 1970-01-01
    • 2018-09-26
    相关资源
    最近更新 更多