首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在Twitter-bootstrap 4$主题颜色数组中使用CSS变量吗?

可以在Twitter-bootstrap 4$主题颜色数组中使用CSS变量吗?
EN

Stack Overflow用户
提问于 2019-02-11 22:36:59
回答 3查看 7.8K关注 0票数 21

在bootstrap 4中,您可以使用以下数组定义和/或覆盖默认颜色:(as documented here)

代码语言:javascript
复制
$theme-colors: (
    "primary": #001122, /*override*/
    "color-1": red, /*new color*/
    "color-2": black, /*new color*/
    "color-3": white /*new color*/
);

我想为不同的用户定制主题颜色。用户可以根据body的类选择不同的调色板。

我创建了一个新文件来创建我自己的样式,在body标记的CSS变量中定义我的主题颜色:

代码语言:javascript
复制
body {
  &.color-pallette-red {
    --theme-color-1: red;
    --theme-color-2: black;
    --theme-color-3: white;

    color: var(--theme-color-1); /*red*/
  }

  &.color-pallette-yellow {
    --theme-color-1: yellow;
    --theme-color-2: black;
    --theme-color-3: white;

    color: var(--theme-color-1); /*yellow*/
  }
}

但是通过这种方式,引导程序的颜色当然不会被覆盖...

我尝试将CSS变量粘贴到前面提到的bootstrap数组中,以确保bootstrap使用我的颜色:

代码语言:javascript
复制
$theme-colors: (
    "color-1": var(--theme-color-1),
    "color-2": var(--theme-color-2),
    "color-3": var(--theme-color-3)
);

但是在运行编译脚本之后,这将返回Error: $color2: var(--theme-color-1) is not a color. @return mix($color-base, $color, $level * $theme-color-interval);。所以bootstrap/编译器不会将我的CSS变量识别为颜色...

总而言之,我想要的是:根据body类更改引导程序的颜色。有谁知道实现这一点的方法吗?

EN

回答 3

Stack Overflow用户

发布于 2019-02-19 11:07:50

您不能直接在映射中设置CSS变量,因为SASS是一个预处理器,所以该变量在当时不会被编译,此外,bootstrap还会将这些主题KVP转换为:root变量,因此您实际上是在两次执行相同的操作。解决这个问题的一种方法是,您可以通过通用的SASS方法直接访问地图本身:

代码语言:javascript
复制
  ...
  property: map-get(map-merge($theme-colors,($key : $color)),$key)
  ...

一旦您设置了特定的KVP,它将在全局范围内可用于其他地方。

在这一点上,使用CSS var()是任意的,但为了涵盖我的所有基础,您可以设置主题,然后更改变量,而不是重新设置和调用theme-color("color-2")

下面是一个完整的例子:

代码语言:javascript
复制
@import "bootstrap";

$theme-colors: (
    "primary": #001122,
    "color-1": black, 
    "color-2": black, 
    "color-3": black 
);

@function set-theme-color($key, $color) {
  @return map-get(map-merge($theme-colors,($key : $color)),$key);
}

@mixin theme($color1, $color2, $color3) {
  background-color: set-theme-color("color-1", $color1);

  h1 {
    color: set-theme-color("color-2", $color2);
  }
  h2 {
    color: set-theme-color("color-3", $color3);
  }
}

main {
  &.theme-purple {
    @include theme(purple,cornflowerblue,white);
    /* example demonstrating color3 can change */
    --color-3: orange;
  }

  &.theme-red {
    @include theme(red,black,white);
  }
}

h2 { 
  color: theme-color("color-2"); 
}
h3 {
/* example demonstrating color3 changed */
  color: var(--color-3);
}

代码语言:javascript
复制
<script src="http://codeply.com/js/embed.js"></script><div data-codeply="o9n2ST6HW5" ></div>

注意,这个例子还演示了如果一个主题设置了变量,而其他主题没有设置。你选择的主题颜色是无效的,属性会恢复为继承。

codeply demo

票数 8
EN

Stack Overflow用户

发布于 2019-02-22 09:38:48

在SASS中为什么不能对颜色使用CSS变量?

不能使用CSS变量表示颜色的原因是像SASS中的darken()lighten()这样的函数。您可以想象,当计算机收到以下指令时,它将不知道该做什么:darken( var(--color), 20%);您不能修改您不知道的值。

如果我们只是不使用改变颜色的函数呢?

事实上,这实际上应该是可行的。bootstrap库包含使用这些函数的scss文件。您可以遍历所有的引导程序代码,并删除修改颜色的函数。当然,这将是一项艰巨的工作。将来更新bootstrap会导致你网站的样式莫名其妙地崩溃,有人会对你非常生气。所以这个选项不是一个好主意。

But...But...如果CSS可以做到这一点,你可以使用SASS?。

是!这就是答案。这将是相当多的工作。如果使用其他变量设置颜色,则可以对这些颜色使用SASS变量,如--color。例如:

代码语言:javascript
复制
  $color1: var(--color-1);

  /* It may seem completely redundant to  
     to define CSS variable here. But 
     it isn't. You can change the variables in 
     your browser now with JavaScript, which 
     may affect multiple elements.
  */
  :root{
    --color-1: purple;
  }
  /* An example on how to change the page
     styling with an id.        
  */
  :root#dark-mode{
    --color-1: black;
  }

  .alert-success{
    background-color: $color1;
  }
  .alert-danger{
    background-color: $color1;
  }

幸运的是,bootstrap 4开发人员在保持选择器简单方面做得很好,所以改写它不会太难。记住在bootstrap css之后加载CSS。您可能希望在bootstrap scss文件中搜索要覆盖的SASS变量,以确保覆盖所有情况。

祝你好运!

票数 5
EN

Stack Overflow用户

发布于 2019-02-21 00:52:25

我喜欢我的另一个答案,但我也想提供另一个解决方案,如果一个不适合项目范围的需要。另一种选择,我认为更直接地满足您的需求,是您可以只级联您的样式表。假设项目树类似于以下内容:

代码语言:javascript
复制
`css\
  `--main.css
  `--themes.css <- compiled themes.sass
  `--themes.sass
`index.html

Where index.html

代码语言:javascript
复制
  ...
  <head>
    <link rel="stylesheet" type="text/css" media="screen" href="css/main.css">
    <link rel="stylesheet" type="text/css" media="screen" href="css/themes.css">
  </head>

  <body>
    <main class="theme-purple">
      <h1>Hello World</h1>
      <h2>SASS is fun!</h2>
    </main>

    <main class="theme-red">
      <h1>Hello World</h1>
      <h2>SASS is fun!</h2>
    </main>
  </body>
  ...

Where main.css

代码语言:javascript
复制
.theme-red {
  --theme-color-1: red;
  --theme-color-2: black;
  --theme-color-3: white;
}
.theme-purple {
  --theme-color-1: purple;
  --theme-color-2: cornflowerblue;
  --theme-color-3: white;
}

Where themes.sass

代码语言:javascript
复制
@import "node_modules/bootstrap/scss/bootstrap";

$theme-colors: (
  "primary": #001122, 
  "color-1": var(--theme-color-1), 
  "color-2": var(--theme-color-2), 
  "color-3": var(--theme-color-3)
);

main { 
  background-color: theme-color("color-1");
}
h1 { 
  color: theme-color("color-2");
}
h2 { 
  color: theme-color("color-3")
}

这样您的CSS变量就有机会被编译。我在node.js服务器上进行了测试,因此您应该根据需要更改import语句

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54632923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档