【问题标题】:Switchable custom bootstrap themes with sass带有 sass 的可切换自定义引导主题
【发布时间】:2019-06-12 14:47:37
【问题描述】:

我能够找到许多关于如何在 SASS 中制作可切换主题的不同方法我无法弄清楚如何将这种方法应用于引导程序覆盖。假设我想要有浅色和深色主题,并且两个主题都会以不同的方式覆盖引导颜色。

// Light-theme
$theme-colors: (
    "primary": #8A2F4F
);

// Dark-theme
$theme-colors: (
    "primary": #fff
);

在上面的示例中,覆盖了primarytheme-colors。如何根据用户选择的主题有条件地设置它们?

【问题讨论】:

  • 方法有很多种,可以有不同的CSS文件,或者使用CSS变量切换,或者给html添加不同的类。
  • 那么给我看一些我可以用来有条件地覆盖引导变量的东西。 F.e.这个codeburst.io/a-successful-sass-theme-structure-ca9d1c477dc7 不适用,因为我需要有条件地覆盖引导程序的变量,而不是使用文章中描述的mixin。
  • 这个范围很广。您是在问如何在通过自定义 SASS 生成的不同自定义 CSS 主题之间切换,还是只是在问如何通过 SASS 生成不同的自定义 CSS 主题?

标签: css sass bootstrap-4 themes


【解决方案1】:

嗯,

有很多方法可以做到这一点。我建议您根据 _variables.scss 文件生成多个 CSS 文件。您所要做的就是使用不同的变量文件构建新主题。你可以在我的public repo查看这个方法。

其他方法是使用 CSS 自定义变量(称为自定义属性)。你可以做这样的事情。我刚刚复制粘贴并更改了 CSS。只是提供一个想法。

在 sass 文件中,

$theme-colors: (
    "primary": var(--primary-color);
);

在其他变量文件中,

element.dark {
  --primary-color: black;
} 
element.light {
  --primary-color: white;
} 

这是我建议的两种方法。

【讨论】:

  • 所以在第一个例子中你是用javascript切换整个css文件?我不确定如何在 React 应用程序中实现这一点,因为样式表是直接导入到代码中的。
  • 是的,我就是那个把 CSS 和 JS 分开的人。
  • 看起来引导覆盖无法设置为 CSS 变量,因为如果我这样做,我会在 SASS 编译时出错“darken($color, $amount) 的参数 $color 必须是一种颜色”
  • @Prajwal 我收到错误 ``` SassError: $color2: var(--primary-color) 不是颜色。 ╷ 103 │ @return mix($color-base, $color, $level * $theme-color-interval); │ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^ ╵ node_modules\bootstrap\scss_functions.scss 103:11 主题颜色级别() node_modules\bootstrap\scss_tables.scss 101:38 @import node_modules\bootstrap\scss\bootstrap.scss 17:9 @导入```
  • 您应该删除第二种方法,因为它不起作用。
【解决方案2】:

这是我使用 React、Bootstrap 和 SASS 的方法:

index.scss 文件中:

div#blue {
  @import './blue.scss';
}

div#red {
  @import './red.scss';
}

// The rest of bootstrap
// Seems to be necessary to import twice to get fonts to work
@import "node_modules/bootstrap/scss/bootstrap";

然后red.scss 我在需要的地方覆盖 Boostrap:

$theme-colors: (
        "primary": red,
);

// The rest of bootstrap
@import "node_modules/bootstrap/scss/bootstrap";

blue.scss 类似。

最后是我的顶级 React 组件:

import './index.css'
import * as React from 'react'
import Button from 'react-bootstrap/Button'

export const Container = () => {

const [color, setColor] = useState('red');

const buttonClick = () => {
    if (color === 'red') setColor('blue')
    if (color === 'blue') setColor('red')
}

return (
        <div id={theme} >
            Switch themes...
            <Button variant="primary" onClick={buttonClick}>Button</Button>
        </div>
    )
}

按下按钮,它会从红色变为蓝色。我猜想 className 而不是 div 选择器是更好的方法 - 但这种方法对我有用,所以我很高兴。尚不确定此解决方案在复杂应用中的稳健性。

【讨论】:

  • 这将导入 Bootstrap 三次。我根本不会建议这种方法。
  • 你有更好的建议@mackhax0r 吗?你确定你的主张吗?如果属实,则影响可能不会在每个使用环境中都很显着。
  • 绝对!我测试了你的方法,它确实有效。对于我的模板,我需要有多个主题,同时保持较小的大小。我创建了一个主题文件夹并在其中放置了_default.scss、_dark.scss 等,创建了另一个名为theme-dark.scss、theme-default.scss 的文件。 _dark.scss 包含着色的覆盖,theme-dark.scss 导入主题和引导程序。这会生成多个文件,但通过使用 js 更改 css 文件是轻量级和可交换的。您的方法适用于 1 或 2 个主题,但如果是重量级网站,我不会推荐它。
猜你喜欢
  • 2014-11-25
  • 1970-01-01
  • 2023-04-05
  • 2017-10-08
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多