在SCSS文件中导入常规CSS文件?


508

无论如何,是否可以使用Sass的@import命令导入常规CSS文件?尽管我没有使用sass的所有SCSS语法,但我仍然喜欢它的合并/压缩功能,并且希望能够在不将我的所有文件重命名为* .scss的情况下使用它


1
是的,有一种方法:只需删除@input语句中css文件路径中的'.css'扩展名即可:)(适用于sass版本> = 3.2)
KamilKiełczewski17年

从2018年开始,在常规CSS文件中使用SASS@import应该只生成常规CSS @import。这意味着又有一个HTTP请求,并且没有合并或压缩。如果某些实现的行为有所不同,那么我会说这是一种非标准功能,与语言规范有所不同。
阿尔瓦罗·冈萨雷斯

Answers:


215

在撰写本文时,这似乎尚未实现:

https://github.com/sass/sass/issues/193

对于libsass(C / C ++实现),导入的工作*.css方式与*.scss文件相同-只是省略扩展名:

@import "path/to/file";

这将导入path/to/file.css

有关更多详细信息,请参见此答案

查看此答案以了解Ruby实现(无礼的宝石)


23
@kleinfreund在Sass 3.3.1中不正确。该@import语句完全未更改,并出现在生成的CSS文件中,Sass不包含@GSto要求的引用CSS文件。看起来它将在Sass 3.4或4.0中实现
fregante 2014年

1
如果您使用的是Gulp或Grunt,只需使用其他工具来导入CSS文件,它会更简单并且现在就可以使用。我使用gulp-import-css,我不确定什么是Grunt等效项。
弗雷坎特


*.css*.css重用语“导入文件使用相同的方式。您是想让其中之一成为*.scss对吧?
underscore_d

1
从v3.5.3开始,libsass警告说这是非标准行为,因此不应依赖。(而不是“使用自定义导入程序来维护此行为。”)github.com/sass/libsass/releases/tag/3.5.3
iX3

383

在遇到相同的问题之后,我对这里的所有答案以及对github中sass存储库的评论感到困惑。

我只想指出,截至2014年12月,此问题已解决。现在可以将css文件直接导入到您的sass文件中。github中的以下PR解决了该问题。

语法与now-相同@import "your/path/to/the/file",文件名后没有扩展名。这将直接导入您的文件。如果在末尾追加*.css,它将转化为cssrule @import url(...)

如果您正在使用某些“新奇的”新模块捆绑包,例如webpack,则可能需要~在路径的开头使用use 。因此,如果要导入以下路径node_modules/bootstrap/src/core.scss,则应编写类似的内容
@import "~bootstrap/src/core"

注意:
看来这不适用于所有人。如果您的解释器基于libsass它,那么它应该可以正常工作(请检查)。我已经测试过@import在node-sass上使用它,并且工作正常。不幸的是,这可行,在某些红宝石实例上不起作用。


1
这似乎已实现,libsass但在使用sass的ruby实现时,似乎此语法有效,但前提是您sass-css-importer需要。至少那是我所看到的。有人可以确认吗?
bsara

5
您确定拥有最新版本的sass吗?我使用这种语法已有一段时间了,它rubynodejs解释器都可以正常工作。您是否检查过是否在文件名后没有放置扩展名?正确的语法是@import "path/to/style/file(不带.css扩展名)
tftd 2015年

4
根据我的Gemfile.lock,我正在使用ruby sass v3.4.18(与Jekyll一起使用)。还在看Error: File to import not found or unreadable: cssdep/cssfile。如果我创建一个,cssdep/cssfile.scss它将突然起作用。所以不是路径问题,由于某种原因,我仍然无法包含来自SASS的'.css'文件:(
thom_nic

1
ruby -vruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32] sass -vSass 3.4.17 (Selective Steve)不能在这里工作
西里尔CHAPON

5
这次真是万分感谢!我能够使用node-sass与@import "node_modules/normalize.css/normalize";
Nick

260

您必须在要包含的css文件前加一个下划线,并将其扩展名切换为scss(例如:)_yourfile.scss。然后,您只需要这样调用它:

@import "yourfile";

并且它将包含文件的内容,而不是使用CSS标准@import指令。


1
可能是关于约定和标准的问题。
大卫·莫拉莱斯

70
下划线是为了防止将其编译为单独的文件。
约拿(Jonah)2013年

4
万一有人怀疑,这是可行的,因为Sass的SCSS语法是CSS3的超集。这就是为什么需要分号的原因。
雅各布·万

46
例如,您不能更改某些供应商CSS文件的扩展名。
Slava Fomin II

7
如果在您的计算机/服务器上,则可以!如果您不希望的话,还有符号链接。
STE

260

这是实现和版本合并开始3.2拉#754合并于2015年1月2日进行libsass,问题的渊源进行了定义如下:sass#193 #556libsass#318)。

长话短说,接下来的语法:

  1. 导入(包括)原始CSS文件

    语法在末尾没有.css扩展名(导致部分的实际读取,s[ac]ss|css并将其内联到SCSS / SASS中):

    @import "path/to/file";

  2. 以传统方式导入CSS文件

    语法以传统方式进行,最后.css扩展名(导致@import url("path/to/file.css");编译后的CSS):

    @import "path/to/file.css";

真是太好了:这种语法简洁明了,而且向后兼容!与libsass和一起使用效果很好node-sass

__

为了避免在评论中进一步猜测,请明确地编写此代码:经过7年的讨论,基于RubySass仍未实现此功能。在编写此答案时,已承诺在4.0中将有一种简单的方法来完成此操作,可能需要借助@use。似乎很快就会实现,为问题#556和新功能分配了新的“计划中” “建议接受”标签。@use

发生变化时,答案可能会更新


3
只是为了澄清,将ss导入为sass对我来说是这样的:@import url(“ path / to / file-without-css-extension”);
Craig Wayne

1
这在基于红宝石的sass版本中实际上不起作用。例如,命令:sass myFile.scss:output.css失败,并带有css导入,但在将.css文件的扩展名更改为.scss时有效。撰写本文时,以最新版本运行:3.4.22 /选择性史蒂夫。这也会影响使用ruby版本的所有任务运行程序,例如grunt-contrib-sass。
ansorensen

@ansorensen,我认为您的身边有些困惑。你是什么意思“的作品,当您更改.css文件的扩展名.scss”?整个想法完全是关于常规CSS文件的,以及使用它们的两种方法(不要与导入SCSS混淆)。请再读一次问题和答案。
2013年

@Farside不要混淆。导入“ path / to / file”语法在Ruby中最新版本的sass gem中不起作用。当我使用导入运行sass时,如果导入路径中的文件具有.scss扩展名,则导入成功完成,而具有.css的文件则导入失败。该问题要求将css导入到scss中,并且您为lib-sass和node-sass提供了答案。我评论说此功能不在基于红宝石的sass版本中。
ansorensen

1
@ansorensen,天哪,有那么多短信给您...我很明确,不要让任何人感到困惑。Node-sass是Node.js库LibSass(Sass 的C版本)。没有提及libsassnode-sass基于Ruby,仅在原始问题中没有提及RUBY版本。请仔细阅读,然后下次再写3条评论。我有所有参考资料:根据问题#193,对于Ruby版本经过5年的讨论后仍未实现,他们仅在ver版本时才承诺此功能4.0将可用。
远端

37

大家好消息,克里斯·埃普斯坦(Chris Eppstein)创建了具有嵌入式CSS导入功能的指南针插件:

https://github.com/chriseppstein/sass-css-importer

现在,导入CSS文件非常简单:

@import "CSS:library/some_css_file"

3
由于使用了过时的起点而失败。“什么是,但是永远不可能...”我敢肯定它第一次发布时很棒,但是它需要更新才能再次运行,否则您必须安装不推荐使用的插件。谢谢,C§–
CSS

18

如果您有一个.css不想修改的文件,也不想将其扩展名更改为.scss例如,该文件来自您不维护的分支项目),则始终可以创建符号链接,然后将其导入.scss

创建一个符号链接:

ln -s path/to/css/file.css path/to/sass/files/_file.scss


将symlink文件导入目标.scss

@import "path/to/sass/files/file";


您的目标输出 .css文件将保存导入的符号链接.scss文件中的内容,而不是CSS导入规则(@yaz以最高的评论票数提及)。而且您没有具有不同扩展名的重复文件,这意味着在初始.css文件中进行的任何更新都会立即导入到目标输出中。

符号链接(也称为符号链接或软链接)是文件的一种特殊类型,它以绝对或相对路径的形式包含对另一个文件的引用,并且会影响路径名的解析。
http://en.wikipedia.org/wiki/Symbolic_link


9
添加符号链接不是一个非常可移植的解决方案(即多个开发人员或构建系统)
LocalPCGuy 2014年

@LocalPCGuy,例如,当两个文件(.css和创建的符号链接)都可以通过共享存储库供所有人使用时。
Nik Sumeiko 2014年

我只是这样做了,并且打算回答关于该线程的符号链接,但很高兴它已经在这里!的确,这种需求很少,但是我的情况涉及根本不希望修改CSS文件(因为它是一个Bower文件),因此构建一个符号链接并完美地导入了它。
亚伦·克劳斯

2
对于Windows用户,相同的功能将具有不同的语法mklink /H <link> <target>,这称为硬链接 @mrsafraz。
远端

5

您可以使用第三方importer来自定义@import语义。

node-sass(适用于Node.js)一起使用的node-sass-import-once可以内联导入CSS文件。

直接使用示例:

var sass = require('node-sass');,
    importOnce = require('node-sass-import-once');

sass.render({
  file: "input.scss",
  importer: importOnce,
  importOnce: {
    css: true,
  }
});

示例grunt-sass配置:

var importOnce = require("node-sass-import-once");
grunt.loadNpmTasks("grunt-sass");

grunt.initConfig({
  sass: {
    options: {
      sourceMap: true,
      importer: importOnce
    },
    dev: {
      files: {
        "dist/style.css": "scss/**/*.scss"
      }
    }
  });

请注意,如果没有显式的前划线,node-sass-import-once当前无法导入Sass部分。例如文件partials/_partial.scss

  • @import partials/_partial.scss 成功
  • @import * partials/partial.scss 失败了

通常,请注意,自定义导入器可以更改任何导入语义。在开始使用它之前,请先阅读文档。


4

如果我没错,css与scss兼容,那么您可以将css的扩展名更改为scss,它应该可以继续工作。更改扩展名后,您可以导入该扩展名,该扩展名将包含在文件中。

如果您不这样做,sass将使用css @import,这是您不想要的。


16
不幸的是,有时导入的css文件无法控制,例如在打包一些静态资产的库中。
埃里克·德雷切尔

2

我想出了一种类似Rails的优雅方式。首先,将.scss文件重命名为.scss.erb,然后使用如下语法(Highlight_js-rails4 gem CSS asset的示例):

@import "<%= asset_path("highlight_js/github") %>";

为什么您不能直接通过SCSS托管文件

@import只要您以一种或另一种方式明确使用完整路径,在CSS文件中执行SCSS即可正常工作。在开发模式下,rails s无需编译即可提供资产服务,因此这样的路径行之有效...

@import "highlight_js/github.css";

...因为托管路径实际上是/assets/highlight_js/github.css。如果右键单击页面并“查看源代码”,然后单击具有上述样式表的链接,则将在其中@import看到一行如下所示:

@import url(highlight_js/github.css);

SCSS引擎转换"highlight_js/github.css"url(highlight_js/github.css)。这将一直有效,直到您决定尝试在已预编译资产并将哈希值注入文件名的生产环境中运行它时为止。SCSS文件仍将解析为/assets/highlight_js/github.css未预编译且在生产环境中不存在的静态文件。

该解决方案的工作原理:

首先,通过将.scss文件移动到.scss.erb,我们有效地将SCSS变成了Rails的模板。现在,无论何时我们使用<%= ... %>模板标签,Rails模板处理器都会将这些代码片段替换为代码输出(就像其他模板一样)。

asset_path("highlight_js/github").scss.erb文件中声明有两件事:

  1. 触发rake assets:precompile任务以预编译适当的CSS文件。
  2. 无论Rails环境如何,都会生成一个可以正确反映资产的URL。

这也意味着SCSS引擎甚至没有解析CSS文件。它只是托管指向它的链接!因此,没有胡闹的猴子补丁或全面的解决方法。我们正按预期通过SCSS提供CSS资产,并按Rails的意图使用指向该CSS资产的URL。甜!


在我看来,该解决方案似乎有点阴暗,听起来更像是骇客。但这是一项很好的调查工作!
远端

0

简单的解决方法:

所有或几乎所有css文件都可以解释为好像是scss。它还可以将它们导入块中。将css重命名为scss,然后将其导入。

在我的实际配置中,我执行以下操作:

首先,我将.css文件复制到一个临时文件中,这次扩展名为.scss。Grunt示例配置:

copy: {
    dev: {
        files: [
            {
                src: "node_modules/some_module/some_precompiled.css",
                dest: "target/resources/some_module_styles.scss"
            }
        ]
    }
}

然后,您可以从父级scss导入.scss文件(在我的示例中,它甚至被导入到块中):

my-selector {
  @import "target/resources/some_module_styles.scss";
  ...other rules...
}

注意:这可能很危险,因为它将有效地导致css将被多次分析。检查您的原始css中是否包含任何scss可解释的工件(这不太可能,但是如果发生,则结果将很难调试且很危险)。



-4

我可以确认这项工作:

class CSSImporter < Sass::Importers::Filesystem
  def extensions
    super.merge('css' => :scss)
  end
end

view_context = ActionView::Base.new
css = Sass::Engine.new(
  template,
  syntax:     :scss,
  cache:      false,
  load_paths: Rails.application.assets.paths,
  read_cache: false,
  filesystem_importer: CSSImporter # Relevant option,

  sprockets:  {
    context:     view_context,
    environment: Rails.application.assets
  }
).render

归功于克里斯·爱泼斯坦:https : //github.com/sass/sass/issues/193


1
如何在您的scss文件中使用它?
Adrian Ber

-10

简单。

@import“路径/到/file.css”;


6
我已经尝试过了,但是压缩时它不会将文件的内容拉入那个文件中,它只会保留@import行。
GSto 2011年

1
得分最低的答案,但具有讽刺意味的是,现在看来这是正确的方法。包括后缀是正确的做法。
Wyck '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.