Sass 变量默认范围

Posted

技术标签:

【中文标题】Sass 变量默认范围【英文标题】:Sass variable default scope 【发布时间】:2011-07-25 02:30:56 【问题描述】:

我在跨范围使用 Sass 中的变量默认值时遇到问题。我的测试示例是:

@mixin foo  
        $val: 'red' !default; 
        .bar  
                color: $val; 
         

 

@include foo; 
.class1  
        $val: 'green'; 
        @include foo; 
        .class11  
                @include foo; 
         
 

$val: 'black'; 
.class2  
        @include foo; 
 

.class3  
        $val: 'blue'; 
        @include foo; 
 

.class4  
        @include foo; 


编译为:

.bar  
  color: "red"; 

 

.class1 .bar  
  color: "red"; 
 

.class1 .class11 .bar  
  color: "red"; 
 

.class2 .bar  
  color: "black"; 
 

.class3 .bar  
  color: "blue"; 
 

.class4 .bar  
  color: "blue"; 


如您所见,变量 $val 在 mixin foo 中被定义为 'red' !default。我希望导入 mixin 会将 $val 设置为“红色”,除非它已经定义。但是,在 class1 中,$val 在本地定义为“green”,导入 mixin foo 会用“red”覆盖它。在其他类中,在将 $val 全局定义为 'black' 之后,导入 mixin 会按预期工作,并且 $val 会保留其已定义的值。

我做错了什么?

【问题讨论】:

【参考方案1】:

在 class1 中本地定义 $val: 'green' 不会改变 mixin 中的 $val: 'red' !default,因为它会查找全局 $val。此时,还没有定义全局 $val。

然后全局 $val 被定义为“黑色”。在 mixin 中的 $val 之后,查找全局 $val。此时,全局 $val 已被定义为“黑色”。

在本地再次定义 $val 将改变已定义的全局 $val。

@mixin foo 
  $val: 'red' !default // defined locally
  .bar
    color: $val

@include foo // $val in mixin foo look for global $val. no global $val found, then 'red'

.class1
  $val: 'green'
  @include foo // $val in mixin foo look for global $val. no global $val found, then 'red'
  color: $val // local $val 'green'
  .class11 
    @include foo // $val in mixin foo look for global $val. no global $val found, then 'red'

$val: 'black' // defined globally at the first time

.class2 
  @include foo // $val in mixin foo look for global $val. $val found, 'black'

.class3
  $val: 'blue' // change the gobal $val
  @include foo // $val in mixin foo look for global $val. $val found, 'blue'

.class4
  @include foo // $val in mixin foo look for global $val. $val found, 'blue'

【讨论】:

非常烦人的行为和 SASS 团队从 JS 借用这个范围的奇怪决定,恕我直言。

以上是关于Sass 变量默认范围的主要内容,如果未能解决你的问题,请参考以下文章

[Sass]局部变量和全局变量

SASS 中变量的默认值

Sass:覆盖导入样式表的默认变量

sass的基本特性-基础

sass

是否可以在 nuxt.config.js 或通过定义 sass 变量来更改主题默认文本颜色?