【问题标题】:SCSS: Inverting/Negating Variable Based on calc()SCSS:基于 calc() 取反/取反变量
【发布时间】:2018-10-30 07:54:55
【问题描述】:

我正在使用 SCSS,并希望在顶部指定一个基于 px 和 rem 值之和的变量。

我了解无法在 SCSS 变量中组合单位类型,因此我改用 calc():

$navbar-top: calc(40px + 1 rem);

在样式表的更下方,我想包含$navbar-top 的否定版本。

这两个我都试过了,都没有成功:

(-$navbar-top)
-#{$navbar-top}

知道如何否定 SCSS 变量,而无需声明新变量,或在整个 CSS 中再次编写 calc。

谢谢。


编辑

  • 如下面的 cmets 所述,这不是 Sass negative variable value? 的副本
  • 这个问题是关于用 calc() 否定一个变量集,这与上面的 SO 帖子无关。我已经注意到上面那个问题中提出的两种解决方案。在这种特殊情况下,它们都不起作用。

编辑 2:基于以下 TEMANI 答案的 SCSS 解决方案

在顶部声明必要的变量,包括“否定符”(-1):

$navbar-top: calc(40px + 1rem);
$neg: -1;

然后,变量可以在整个过程中使用(是否否定),如下所示:

/* Non-negated */
margin: $navbar-top 0 0;

/* Negated */
margin: calc(#{$neg} * #{$navbar-top}) 0 0;

上面的否定版本将编译为以下 CSS:

margin: calc(-1 * calc(40px + 1rem)) 0 0;

【问题讨论】:

  • @csilk 我已经尝试了所有这些解决方案,如 OP 中所述。这里的问题是计算和否定的组合。它不是重复的。
  • 所以它唯一的办法就是使用另一个calc,正如你所说的。
  • @csilk 或添加重复注释的人,请将其删除。这两个问题是不相关的,重复的建议会误导未来的访问者。我用额外的说明编辑了 OP。

标签: css sass


【解决方案1】:

由于calc 不是通常的值,您不能简单地在其上附加- 符号以获得负值。

一个想法是考虑另一个参数来控制标志。这是一个使用纯 CSS 和 CSS 变量的想法,不需要另一个 calc()

.box {
  margin-top: calc( var(--s,1)*(40px + 1rem));
  height:100px;
  background:rgba(255,0,0,0.5);
}
<div class="box"></div>
<div class="box" style="--s:-1"></div>

您可以使用类定义负值

.box {
  margin-top: calc( var(--s,1)*(40px + 1rem));
  height:100px;
  background:rgba(255,0,0,0.5);
}
.neg {
  --s:-1;
}
<div class="box"></div>
<div class="box neg"></div>

更新

您也可以考虑使用变量的表达式:

:root {
  --exp:(40px + 1rem);
}

.box {
  margin-top: calc( var(--s,1)*var(--exp));
  height:100px;
  background:rgba(255,0,0,0.5);
}
<div class="box"></div>
<div class="box" style="--s:-1"></div>

【讨论】:

  • 我不确定使用--s:-1 而不是否定的calc 会使事情更容易维护。在这里我要提倡 KISS 原则。
  • @MrLister 但我不认为使用另一个 calc 会使其灵活,因为你的代码中会有一些静态的东西,这与 CSS 变量不同,我们有一个默认值,只有在需要时才会更改
  • 感谢 Temani / @MrLister。如果可以的话,有几个后续问题:1) var() 不是实验性的,即不是所有浏览器都完全支持? 2) 是否有必要在我想要引用该结果的 CSS 中的所有位置包含 40px + 1rem?希望我可以在顶部定义一次,然后在整个过程中使用它。
  • 仅供未来访问者使用:基于@TemaniAfif 的上述解决方案,这就是我使用 SCSS 的方式:margin: calc(#{$neg} * #{$navbar-top}) 0 0;。然后在顶部我定义了:$navbar-top: calc(40px + 1rem);$neg: -1;。此解决方案编译为以下 CSS:margin: calc(-1 * calc(40px + 1rem)) 0 0;
  • @Magnus 和我一起你不会有机会在 IE 上工作:p .. 我来自未来的现代浏览器解决方案,在未来 IE 已经死了 :p跨度>
【解决方案2】:

您可以使用@function 代替变量

DEMO

// The argument is defaulted to true,
// so you only need to pass an argument if you want a negative number
@function navbar-top($isPositive: true) {
    @if $isPositive { @return calc(40px + 1rem); }
    @else {@return calc((40px + 1rem) * -1); }
}

// Calling the function with the default value
.normal { margin-top: navbar-top(); }

// Calling the function with negative value
.negative { margin-top: navbar-top(false); }

【讨论】:

  • 感谢 Ari,这几乎把我们带到了 JS 领域:) 很好的解决方案。
  • 乐于助人。您不必使用布尔参数,字符串也可以。解决方案绝对可以更聪明,您可以像三元一样使用if() 而不是@if/@else,只是想指出@function 是一种可能的解决方案。
猜你喜欢
  • 1970-01-01
  • 2019-03-31
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2020-08-11
  • 1970-01-01
  • 2022-09-22
相关资源
最近更新 更多