是否可以使用@import导入sass中的整个目录?

cor*_*ded 197 import sass partials

我正在使用SASS部分模块化我的样式表,如下所示:

@import partials/header
@import partials/viewport
@import partials/footer
@import partials/forms
@import partials/list_container
@import partials/info_container
@import partials/notifications
@import partials/queues
Run Code Online (Sandbox Code Playgroud)

有没有办法包括整个partials目录(这是一个充满SASS-partials的目录),如@import罗盘或什么?

Den*_*est 193

如果您在Rails项目中使用Sass,则sass-rails gem(https://github.com/rails/sass-rails)具有glob导入功能.

@import "foo/*"     // import all the files in the foo folder
@import "bar/**/*"  // import all the files in the bar tree
Run Code Online (Sandbox Code Playgroud)

在另一个答案中回答问题"如果你导入一个目录,你如何确定导入顺序?没有办法不会引入一些新的复杂程度."

有人会争辩说将文件组织到目录中会降低复杂性.

我的组织的项目是一个相当复杂的应用程序.17个目录中有119个Sass文件.这些大致对应于我们的视图,主要用于调整,繁重的工作由我们的自定义框架处理.对我来说,几行导入的目录比119行导入的文件名复杂得多.

为了解决加载顺序,我们将需要首先加载的文件 - mixins,变量等 - 放在早期加载目录中.否则,加载顺序是并且应该是无关紧要的...如果我们正在做正确的事情.

  • 如果您的控制器css/scss文件与application.css.scss一起位于"app/assets/stylesheets"文件夹中,则添加"@import"*"`(在application.css.scss中). (7认同)
  • 对我来说很有用,谢谢你的提示.我很高兴在application.scss中说"@import"*"`包含同一目录中存在的所有*其他*文件,但是没有重新包含application.scss ...我希望得到一个无限循环的bug . (5认同)

Bra*_*his 93

此功能永远不会成为Sass的一部分.一个主要原因是进口订单.在CSS中,最后导入的文件可以覆盖之前描述的样式.如果导入目录,如何确定导入顺序?没有办法不会引入一些新的复杂程度.通过保留导入列表(就像您在示例中所做的那样),您明确了导入顺序.如果您希望能够自信地覆盖在另一个文件中定义的样式或在一个文件中编写mixins并在另一个文件中使用它们,则这是必不可少的.

有关更全面的讨论,在此处查看此已关闭的功能请求:

  • 对于结构良好的css文件,包含顺序无关紧要 (252认同)
  • @MilovanZogovic严重依赖覆盖有代码味道,但使用级联没有任何不当之处.这就是语言的设计方式. (54认同)
  • @BrandonMathis我理解这里的理论纯度,但是在一个实现中(我和我认为腐蚀了)你可以选择以不同文件互不影响的方式编写CSS.我有一个名为"modules"的目录,其中包含各自包含不同css类规则的文件.我希望包含该目录中的所有文件,并且它们的顺序不是,并且设计永远不会是重要的.每次添加新列表时都必须更新列表. (32认同)
  • 如果我有一个目录,其中填充了不适用的css,%规则,函数等,则不存在风险,相反(不允许)只会导致文件中无用的单调乏味和长"导入标题",而不是仅仅是单行`@import'/ functions"`或`@import'partials /"`. (5认同)
  • 一个用例是导入模块,其中顺序不重要,样式可能是命名空间...我希望看到这个功能 - 虽然同意它必须明智地使用... (3认同)
  • 这些评论很有趣.顺序(级联)是CSS的完整基础.如果它**看起来是无关紧要的,那意味着你现在*不是*使用级联方面.但是,不应忽略级联或假设它不会在您的项目中发挥作用.你的下一个`_middle-of-the-folder.scss`总是可能会抛弃级联,特别是如果你使用 - 或者开始使用 - 像[占位符]这样有用的Sass功能(http://thesassway.com/intermediate)/understanding-placeholder-selectors)如果你在没有级联的情况下编写CSS,我绝不想和你合作. (3认同)
  • - 1 为假。首先,推理是错误的,因为在*许多*情况下(例如,导入 mixin 或函数库;导入特定于页面的范围样式表),顺序确实无关紧要。*有时*这很重要,但这并不意味着你不能给用户他们想要的权力并警告他们如果滥用它是危险的。[其次,该功能现已存在](https://github.com/chriseppstein/sass-globbing)。 (2认同)

fen*_*fen 34

我创建了一个名为__partials__.scss同一目录的文件partials

|- __partials__.scss
|- /partials
   |- __header__.scss
   |- __viewport__.scss
   |- ....
Run Code Online (Sandbox Code Playgroud)

__partials__.scss,我写了这些:

@import "partials/header";
@import "partials/viewport";
@import "partials/footer";
@import "partials/forms";
....
Run Code Online (Sandbox Code Playgroud)

所以,当我想要导入整个时partials,只需写@import "partials".如果我想要导入其中任何一个,我也可以写@import "partials/header".

  • 这与OP设置基本相同.他想在每次创建新部分时手动添加`@import'parts/xyz'`语句来导入文件. (6认同)
  • 这没有解决任何问题. (3认同)
  • 这是一个非常好的解决方案.罗盘就是为了简化它们的包含+1 (2认同)
  • @gyo如果他们只有一个局部目录,这对OP没有帮助,但确实对具有多个局部目录的人们有所帮助。如果我有`forms'和`widgets`目录,我可以`@import“ forms”; 页面的主CSS文件中的@import“ widgets”`,只担心forms.scss和widgets中的所有单个部分(@import Forms / text; @import Forms / button ...) .scss`。 (2认同)

Thi*_*ker 5

这可能是一个老问题,但在 2020 年仍然相关,所以我可能会发布一些更新。自 19 年 10 月更新以来,我们通常应该使用@use而不是@import,但这只是一个备注。这个问题的解决方案是使用索引文件来简化包括整个文件夹。下面举例。

// foundation/_code.scss
code {
  padding: .25em;
  line-height: 0;
}

// foundation/_lists.scss
ul, ol {
  text-align: left;

  & & {
    padding: {
      bottom: 0;
      left: 0;
    }
  }
}

// foundation/_index.scss
@use 'code';
@use 'lists';

// style.scss
@use 'foundation';
Run Code Online (Sandbox Code Playgroud)

https://sass-lang.com/documentation/at-rules/use#index-files

  • 但这仍然需要您每次创建文件时都向“_index.scss”添加一个新文件。难道真的没有办法用“@use”或“@forward”来执行“@import foobar/**/*”吗? (5认同)
  • 我认为你想在 _index.scss 中使用 ```@forward``` 而不是 ```@use``` (4认同)