【问题标题】:Sass: Overriding default variables of imported stylesheetsSass:覆盖导入样式表的默认变量
【发布时间】:2018-02-24 12:38:29
【问题描述】:

问题

关于覆盖!default 变量——我有两个.sass 文件:

ma​​in.sass

$variable: black

@import "_another_import.sass"
@import "_import.sass"

_import.sass

$variable: blue !default

body
    background: $variable

$variable 在编译后的 CSS 中解析为 blue

body {
    background: blue;
}

但是,如果我在导入 _import.sass 样式表之前指定覆盖变量值,Sass 会将其编译为 black

ma​​in.sass

@import "_another_import.sass"

$variable: black

@import "_import.sass"

问题

这种行为是有意的吗?有没有办法在导入中声明 !default 值之前(甚至在单独的文件中)声明 !default 变量值的覆盖?


实际设置(供参考)

我的实际设置比这要复杂一些。我正在使用Myg(NPM 组件)和myg-rails(生成文件结构以自定义变量)和 Webpack。所以我有一个myg.sass 文件加载_variables.sass_myg.sass_variables.sass 加载了几个定义变量的其他文件。 _myg.sass 导入 Myg (NPM) 组件。我验证了当我在 _variables.sass 中定义一个变量并使用它 + 在 Myg 组件中设置一个默认值时,默认值将覆盖已经设置的值。

【问题讨论】:

  • 你想要背景蓝色还是黑色??
  • @Abhijeet black
  • 你使用的是什么 sass 编译器?
  • @miir 我正在使用 Sass 和 webpack 使用 sass-loader。
  • 你能分享你真实的main.sass你的webpack配置吗?

标签: variables import sass default


【解决方案1】:

,你正在做的应该工作。您遇到的由此产生的行为是不规则的,不是有意的。

来自sass-lang docs

如果变量尚未分配,您可以通过将 !default 标志添加到值的末尾来分配它们。这意味着如果变量已经被赋值,则不会重新赋值,但如果它还没有值,则会被赋值。

我怀疑我们可能需要调查其他事情。

我已经验证了这些文件的正确行为:

Sass 源代码:

_t1.sass

div
    margin: 0

_t2.sass

$c: blue !default

body
    background: $c

ma​​in.sass

$c: black

@import '_t1.sass'
@import '_t2.sass'

CSS 结果:

div {
  margin: 0;
}

body {
  background: black;
}

它是黑色的。

【讨论】:

    【解决方案2】:

    我的建议是:-
    1)如果您想要黑色背景,那么您只需这样做

    // main.sass
    
    @import "_another_import.sass";
    @import "_import.sass";
    
    // _import.sass
    $variable: black;
    body{
        background-color: $variable !important;
    }
    

    但我的建议是你的文件结构是这样的

        @import "_variable"; /*Define Variable in separate file & in that file declare $variable*/  
        @import "_another_import.sass";
        @import "_import.sass";
    
    body{
        background-color: $variable !important;
    }
    

    【讨论】:

    • 这个例子只是说明了我的问题。我无法重组文件。我的问题是我是否做错了什么,阻止它按我的预期工作。我不是在寻找完全不同的解决方案。
    • $variable: blue !default ,删除这个除了这个一切都很好,如果你在导入后声明一个变量是它的标准,所以你的代码就像我的第一个建议
    • 我知道,我只需要重写一个声明为!default 的变量。我的问题是,如果我在导入设置变量默认值的文件之前声明它,我的自定义设置变量仅优先于默认变量。
    • 你必须使用 ;每次导入之后,我认为那个问题不会出现..否则与我共享代码..以便我调试,因为它很奇怪我从未遇到过此类问题..
    • 我使用的是 Sass 而不是 Scss。您可以在问题中找到代码。
    【解决方案3】:

    我认为您误解了!default 的作用。就是说如果变量没有赋值,就使用这个值。

    如果变量尚未分配,您可以通过将 !default 标志添加到值的末尾来分配变量。这意味着如果变量已经被赋值,它不会被重新赋值,但如果它还没有值,它将被赋予一个。

    【讨论】:

    • 这正是我想要的。我想在导入之前覆盖默认变量值(由 NPM 包指定)。
    • 啊,好吧,我现在明白了,这个问题是围绕@import "_another_import.sass" 打破默认变量覆盖模式。我敢打赌,该导入中存在一些格式错误的 SASS,编译器不会阻塞。它发生在我身上好几次了。当您将导入减少到仅几个有效样式、相同行为时会发生什么?
    猜你喜欢
    • 2015-02-25
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2015-03-09
    • 1970-01-01
    相关资源
    最近更新 更多