【问题标题】:Add prefix for each rule in SASS为 SASS 中的每个规则添加前缀
【发布时间】:2020-05-06 10:46:59
【问题描述】:

我的项目使用 vuetify 和很多我自己的样式。 我的样式经常在样式声明中多次使用&,如下所示:

.sis-sidebar {
  &__link {
    &.-active &-placeholder {
      color: #fff;
    }
  }
}

// Compiles to:

.sis-sidebar__link.-active .sis-sidebar__link-placeholder {
  color: #fff;
}

它适用于这样的 html:

<div class="sis-sidebar__link -active">
  <div class="sis-sidebar__link-placeholder">
    This one is white
  </div>
</div>

我希望我的所有样式都比框架中的样式具有更高的优先级。但我不想改变里面的任何东西。这就是我要修改的入口 scss 文件:

@import 'framework';
@import 'my-styles';

我希望我的所有样式都带有一些 #sis 前缀,但只有一次。如果我这样做了

@import 'framework';
#sis {
  @import 'my-styles';
}

// It compiles to:

#sis .is-sidebar__link.-active #sis .is-sidebar__link-placeholder {
  color: #fff;
}

// And I want it to be: 

#sis .is-sidebar__link.-active .is-sidebar__link-placeholder {
  color: #fff;
}

有可能做到吗?

【问题讨论】:

  • 但确实如此。 github.com/Kasheftin/sass-prefix-test。字符串#sis .is-sidebar__link.-active #sis .is-sidebar__link-placeholder的中间有#sis。
  • 我认为关键是#sis 应该只在开头出现一次,而不是多次。原因是 & 符号总是被直到根的完整结构替换。这是您在使用不带#sis 的代码版本时受益的地方。但是,您不能两全其美,因此我建议您简化选择器。无论如何,这是一个好主意,因为这样的代码对于大多数人来说很难阅读。

标签: css vue.js sass


【解决方案1】:

你可以这样做:

.sis-sidebar {
  &__link {
    #sis &.-active &-placeholder {
      color: #fff;
    }
  }
}

您也可以通过使用变量来完全避免这个问题,如下所示:

$sidebar-block: '.sis-sidebar';
$sidebar-element: '__link';

#sis {
  #{$sidebar-block + $sidebar-element}.-active #{$sidebar-block + $sidebar-element}-placeholder {
    color: #fff;
  }
}

【讨论】:

  • 我知道我可以修改所有样式表来完成任务。我还可以在任何地方用普通的 css 替换 scss,并在每个规则前面加上#sis。问题不在于修改所有样式(其中大约有 500kb) - 而是关于保留所有旧代码并以某种方式更新入口文件,以使每个带有#sis 的规则仅自动一次。
  • 使用导入方法可能起作用的唯一方法是将scss转换为css,然后再转换回scss。然后将代码中的所有 & 号选择器剥离,您可以在其前面加上 id 选择器。我没有这种方法的经验,所以你必须尝试一下。
猜你喜欢
  • 2016-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-07
相关资源
最近更新 更多