【问题标题】:LESS CSS - Change variable value for theme colors depending on body classLESS CSS - 根据主体类更改主题颜色的变量值
【发布时间】:2013-02-22 22:12:16
【问题描述】:

在这里掌握LESS,但有一点还不清楚。

假设我的网站有多个颜色主题,由 body 标签上的类控制。由此我可以为每个主题中的每个元素重新定义各种颜色。如果我有很多元素要改变……和很多主题,这很容易但相当耗时。每次添加新主题时,我都需要重新编写所有选择器,使用不同的颜色值。

到目前为止,我的工作基于我发现的另一篇文章: LESS.css variable depending on class

...但是,对于我想要做的事情来说,它似乎仍然过于复杂,因为我仍然必须写出所有选择器并包含 mixin,然后再放入具有颜色变量的相同 CSS。

我创建了一个CODEPEN HERE

如果有人有时间看一看并建议我如何以不同的方式处理此问题或如何简化此过程,我将不胜感激。

非常感谢任何提供帮助的人:)

【问题讨论】:

  • 您是否有理由希望您的“主题”都在同一个 CSS 文件中?使用每个文件一个主题的备用样式表似乎要简单得多。
  • 嗨西玛侬。如果我只是使用 CSS,我会走这条路。我只是认为可能有一种简单的方法可以在声明后更改实际变量值,这意味着我只需要几行代码就可以说明“.theme-2”中的新变量颜色是什么然后一切都会随着这些新的变量值而改变颜色。不过谢谢你的建议。
  • 我明白你想要什么,但你还没有回答我的问题。每个文件创建 1 个主题将是进行主题化的最简单方法,并且允许用户避免下载他们不需要的样式,因为他们永远不会使用除了他们选择的(或默认)主题之外的任何东西。如果每个页面都有自己的主题(即主题不可配置),那么使用单独的样式表就没有多大意义。
  • 啊,我现在明白你的意思了,我很抱歉。我与实际的 LESS 混淆了,我完全忘记考虑将下载的不必要的样式。在这种特殊情况下,我希望不同的页面能够具有不同的颜色主题,这将由创建者在CMS。我可能在这里举了一个不好的例子。我想在一天结束的时候,我想知道的是,变量的值是否可以在特定的父类中设置为不同的值。在我看来,这似乎是维护不同颜色主题的一种更简单的方法。

标签: css colors themes less mixins


【解决方案1】:

假设您仍然希望在一个样式表中对其进行主题化(而不是像 cmets 中提到的 cimmanon 那样的多个表),并且假设您使用的是 LESS 1.3.2+,那么以下代码可以减少重复的数量通过在需要更改主题的类中设置循环。

请注意,这在 Codepen 上不起作用(它会抛出错误 uncaught throw #,可能是因为它们运行的​​是早期版本的 LESS),但您可以通过将代码放入 LESS's compiler 来看到它正确编译。

LESS(基于您的 Codepen 代码并添加了演示主题)

//////////////////////////////////////////////////////
// CONSTANTS

@lightColour: #fff;
@darkColour: #000;
@lightBg: #fff;
@darkBg: #000;
@numberOfThemes: 3; //controls theme loop

//////////////////////////////////////////////////////
// MIXINS

//Theme Definitions by parametric mixin numbers (1), (2), etc.
.themeDefs(1) {
  @lightColour: #f00;
  @darkColour: #fff;
  @lightBg: #f00;
  @darkBg: #fff;
}

.themeDefs(2) {
  //inverse of 1
  @lightColour: #fff;
  @darkColour: #f00;
  @lightBg: #fff;
  @darkBg: #f00;
}

.themeDefs(3) {
  @lightColour: #cfc;
  @darkColour: #363;
  @lightBg: #cfc;
  @darkBg: #363;
}


.curvy {
  -moz-border-radius: 5px;
  -webkit-border-radius: 5px;
  border-radius: 5px;
}

//////////////////////////////////////////////////////
// GENERAL STYLING

* {padding: 0;margin: 0;}
html {text-align: center;}
h2 {padding: 20px 0;}

.box {
  .curvy;
  color: @lightColour;
  background: @darkBg;
  display:inline-block; width:10%; padding:20px 5%; margin:0 1% 20px 1%;
}

//////////////////////////////////////////////////////
// THEME BUILDING

.buildThemes(@index) when (@index < @numberOfThemes + 1) {

  .theme-@{index} {
      .themeDefs(@index); 
      color: @lightColour;
      background: @darkBg; 

      .box {
        color: @darkColour;
        background: @lightBg;
      }
    }
    .buildThemes(@index + 1);
}
//stop loop
.buildThemes(@index) {}
//start theme building loop
.buildThemes(1);

CSS 输出(为简洁起见仅显示循环主题 css)

.theme-1 {
  color: #ff0000;
  background: #ffffff;
}
.theme-1 .box {
  color: #ffffff;
  background: #ff0000;
}
.theme-2 {
  color: #ffffff;
  background: #ff0000;
}
.theme-2 .box {
  color: #ff0000;
  background: #ffffff;
}
.theme-3 {
  color: #ccffcc;
  background: #336633;
}
.theme-3 .box {
  color: #336633;
  background: #ccffcc;
}

【讨论】:

  • 非常感谢这个 ScottS。我会尝试使用正确版本的 LESS。这段代码 sn-p 将来对我来说非常方便,尤其是对于较小的 CSS 区域。我认为这将是一个让您和 cimmanon 的 cmets 都参与进来并决定给定任务的最佳解决方案的案例。感谢您的两个回答。
  • 我的 less 版本是 2.2.0 但它不起作用。我有一个错误: .buildThemes(@index) when (@index
  • 好的写作是:.buildThemes(@index) when (@index
  • @ScottS 你能告诉我如何结合主题 2 和 3,比如 .themeDefs(2) + .themeDefs(2) { // 什么... }
猜你喜欢
  • 2021-01-30
  • 2019-07-24
  • 1970-01-01
  • 1970-01-01
  • 2022-09-23
  • 1970-01-01
  • 2020-04-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多