【问题标题】:SASS: overwrite var when beneath a special body classSASS:在特殊的身体类下覆盖 var
【发布时间】:2018-10-26 08:18:47
【问题描述】:

也许我的设计失败了,但我的 SASS 是这样定义的:

$Akzent: #6d998e; // green

// ........
a {
 color: $Akzent;
}

.section .foo {
  background-color: $Akzent;
}
// ... many more definitions that go back on $Akzent

现在我有一个网页需要 $Akzent 有另一种颜色。在另一个 body 类之下时,我无法覆盖 $Akzent 的颜色值。

我尝试过这样的事情:

$Akzent: #6d998e; // default akzent (green)

body.page-aktzent-2 {
  $Akzent: #ff9900; // override akzent with orange
}

a {
 color: $Akzent:
}
// ........ more sass code

但这行不通。

我不想将以前使用 $Akzent 的所有定义重新定义为现在使用另一个 var。

如何在不重写所有内容的情况下解决我的问题?

混合似乎也没有给我带来任何解决方案。

试过这个:Set a variable in Sass depending on the selector 但这不适合我当前的 sass 代码。

【问题讨论】:

  • 请记住,您的 SASS 代码不知道当前页面,因此它必须编译为定义 a 和其他定义的颜色的 CSS 文件,由所有可能的身体类别。用于创建此类 CSS 代码的 SASS 机制是混合、循环以及链接问题的答案中描述的其他内容。您尝试的操作不会导致所有其他定义的额外包装,而是覆盖给定范围内的变量。
  • 如果您不想修改现有代码,您可以尝试使用 body.page-akzent-2 包装器创建一个新的 SCSS 文件,像您在尝试中所做的那样设置颜色,然后导入文件在这个包装器中使用a 等的定义(希望这在 SASS 中能以某种方式工作,至少在 LESS 中是这样)。
  • 您将无法按照您尝试的方式实现它。由于变量作用域,您不能在其作用域之外更改变量值,因此,无论如何,$Akzent 将始终具有a 中的默认颜色。请记住,scss 是一个 css 处理器,因此值不会改变运行时:您需要在 css 中定义您的规则。要完成您的示例,您需要定义一个基本的a,加上一个body.page-akzent-2 a

标签: variables sass


【解决方案1】:

我相信我可以理解您要采用的方法。我做了类似的事情来为页面设置另一个主题选项,并且只需将一个类添加到正文中。

在您的情况下,您的第二个“主题”会将page-akzent-2 类添加到body

我发现最好的方法是为您添加另一个新颜色的变量,并在任何需要嵌套的地方覆盖您的原始颜色:

$akzent:   #6d998e; // default akzent (green)
$akzent-2: #ff9900; // second akzent (orange)

a {
    color: $akzent:

    body.page-akzent-2 & {
        color: $akzent-2; // override akzent with orange
    }
}
// ........ more sass code

【讨论】:

  • 希望对您有所帮助!
  • 去看看这能带给我多远,谢谢!我想我的问题是我忘记了 sass 不是在页面运行时编译的,而是在之前编译过一次 - 所以当然不可能编写脚本和检查当前类集......我显然只是破坏了 sass 的设计:/
  • 好吧,如果它对您有用,请不要忘记将其标记为已批准的答案 :) 我曾经认为您尝试这样做的方式会很简洁,但事实并非如此工作。
【解决方案2】:

你可以试试这个

<div class="block orange"></div>
<div class="block red"></div>

$Akzent: #6d998e !default;

.block {
  min-height: 10px;
  width: 100%;
  margin-bottom: 10px;
}

.orange {
  $Akzent: orange;
  background-color: $Akzent;
}

.red {
  $Akzent: red;
  background-color: $Akzent;
}

工作代码笔链接here

【讨论】:

  • 这对我没有任何帮助 - 我需要一个完全不同的颜色,而不仅仅是我给定默认口音的较浅版本 - 默认颜色是绿色,子页面需要橙色 (#ff9900) $Akzent
  • 也许我不明白 - 但我认为这不会有帮助 - 这将迫使我在 SASS 中拥有所有内容(页面上元素的每个类定义)两次,每个子页面可能具有的颜色强调。
猜你喜欢
  • 2017-02-16
  • 2013-11-04
  • 1970-01-01
  • 2012-05-09
  • 2012-07-01
  • 1970-01-01
相关资源
最近更新 更多