如何从 Sass 中的 CSS 文件扩展类?

Posted

技术标签:

【中文标题】如何从 Sass 中的 CSS 文件扩展类?【英文标题】:How to extend a class from a CSS file in Sass? 【发布时间】:2018-07-15 09:57:19 【问题描述】:

我有一个样式库,其中包含我的项目的一般样式。这个库被打包到一个library.css 文件中。在这个库中,我有一个类a

在我的scss 样式表之一中,我想从library.css 扩展这个类a

@import 'library.css';

.b 
 @extend .a

当我这样做时,我被告知在 library.css 中找不到类 a

有没有办法从 CSS 样式表中扩展一个类?

【问题讨论】:

【参考方案1】:

当您在 Sass 代码中添加 @import 规则时,您需要小心您希望实现的目标。 @import 实际上是有效的 CSS,所以 Sass 需要在这里评估和弄清楚你的意图。 Sass 扩展了 CSS @import 规则并且不会重新创建它。根据the documentation:

@import 需要一个文件名来导入。默认情况下,它会查找要直接导入的 Sass 文件,但在某些情况下它会编译为 CSS @import 规则:

如果文件的扩展名是 .css。 如果文件名以 http:// 开头。 如果文件名是 url()。 如果@import 有任何媒体查询。

因此,如果您将 .css 扩展名放在 @import 规则中的文件名之后,Sass 将只输出这行有效的 CSS 代码。您可以通过删除 @extend 指令来测试这一点,这将使您的代码编译。你会看到整个输出文件是这样的:

@import 'library.css';

Sass 不会跟随那个 CSS 文件并使其内容可用于 @extend 指令。

您可以做的是从@import at-rule 中删除文件扩展名。

@import 'library';

.b 
 @extend .a

但是,这实际上会将文件 library.css 的全部内容输出到此 Sass 文件编译到的 CSS 文件中,我假设这不是您的目标。

要解决这个问题,您可以创建一个包含占位符选择器的部分 Sass 文件。

%a 
  color: red;

占位符选择器的好处是它们没有自己的输出。根据the documentation:

在不使用任何@extend 的情况下,使用占位符选择器的规则集将不会呈现给 CSS。

它们的重要性和用处详述on this page。

在您的 Sass 样式表中导入部分 Sass 文件并使用 @extend 指令,如下所示:

.b 
  @extend %a;

为了确保您的 library.css 文件是一致的,将其转换为 Sass,在其顶部导入相同的包含占位符选择器的部分文件,并在 .a 选择器中简单地使用 @extend 指令。

@import 'placeholders';

.a 
    @extend %a;

【讨论】:

以上是关于如何从 Sass 中的 CSS 文件扩展类?的主要内容,如果未能解决你的问题,请参考以下文章

在 SASS 中是不是可以从另一个文件中的类继承?

sass笔记

如何使用js更改sass文件中的变量

如何安装并编译sass为css文件

如何将scss转换成css文件

如何在css或sass中为类名起别名