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

评论

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

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

#1 楼


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

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


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

@import "path/to/file";


这将导入path/to/file.css

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

针对Ruby实现(sass gem)请参见此答案。

评论


@kleinfreund在Sass 3.3.1中不正确。 @import语句完全没有更改,并出现在生成的CSS文件中,Sass不像@GSto要求的那样包含引用的CSS文件。看起来它将在Sass 3.4或4.0中实现

–fregante
2014年5月17日下午16:58

如果您使用的是Gulp或Grunt,只需使用其他工具来导入CSS文件,它会更容易并且可以立即使用。我使用gulp-import-css,不知道什么是Grunt等效项。

–fregante
2014年5月18日在2:32

它至少与libsass一起使用。参见答案stackoverflow.com/questions/7111610/…和PR github.com/sass/libsass/pull/754

–ivn
16-10-5在9:05



重言式是“对于* .css导入与* .css文件相同的工作方式”。您是要让其中一个是* .scss,对不对?

– underscore_d
18年3月4日在15:16

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

–雅各布
18年5月18日在21:56

#2 楼

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

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

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

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

注意:
看来这并不适合所有人。如果您的口译员是基于libsass的,那么它应该可以正常工作(签出)。我已经在node-sass上使用@import进行了测试,并且工作正常。不幸的是,这可以正常工作,在某些红宝石实例上无效。

评论


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

–bsara
15年7月28日在1:37

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

–tftd
15年7月29日在12:54



根据我的Gemfile.lock,我正在使用ruby sass v3.4.18(与Jekyll一起使用)。仍然看到错误:找不到或不可读的导入文件:cssdep / cssfile。如果我创建一个cssdep / cssfile.scss,它会突然工作。所以不是路径问题,由于某种原因,我仍然无法包含来自SASS的'.css'文件:(

–thom_nic
15年8月31日在15:06

ruby -v:ruby 2.2.2p95(2015-04-13修订版50295)[x64-mingw32] sass -v:Sass 3.4.17(Selective Steve)在这里不起作用

–西里尔·夏彭(Cyril CHAPON)
2015年9月1日7:58



这次真是万分感谢!我能够使用带有@import“ node_modules / normalize.css / normalize”的node-sass来导入normalize.css;

–尼克
16年1月7日在18:38

#3 楼

此问题已从版本3.2开始实施并合并(2015年1月2日合并为#4312079q的#754号合并,此处定义了原始问题:libsass#193#556,sass#318)。

简短地说,接下来的语法是:




导入(包括)原始CSS文件,语法最后没有libsass扩展名(结果为实际阅读部分.css并将其内联到SCSS / SASS中):

s[ac]ss|css



以传统方式导入CSS文件语法以传统方式进行,结尾处带有@import "path/to/file";扩展名(在编译后的CSS中产生.css):

@import url("path/to/file.css");


而且很好:此语法优雅而简洁,并且向后兼容!它非常适合与@import "path/to/file.css";libsass配合使用。

__

为了避免在评论中进行进一步猜测,请明确编写:基于Ruby的Sass在经过7年的讨论后仍未实现此功能。在编写此答案时,已承诺在4.0中将有一种简单的方法来完成此任务,可能需要node-sass的帮助。似乎很快就会实现,为问题#556分配了新的“计划中的”“建议接受”标签,并提供了新的@use功能。

答案可能会在有新内容时尽快进行更新。变化。

评论


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

–克雷格·韦恩(Craig Wayne)
16-4-28在6:15



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

–ansorensen
16年6月21日在23:14

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

–侧面
16 Jun 21'23:44



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

–ansorensen
16 Jun 22'23:44



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

–侧面
16-6-28在14:47



#4 楼

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

@import "yourfile";


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

评论


可能是关于约定和标准的问题。

–大卫·莫拉莱斯(David Morales)
2012年11月6日上午10:13

下划线是为了防止将其编译为单独的文件。

–乔纳
13年2月25日在22:23

万一有人纳闷,这是可行的,因为Sass的SCSS语法是CSS3的超集。这就是为什么需要分号的原因。

–雅各布·万(Jacob Wan)
2013年9月15日19:18在

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

– Slava Fomin II
2014年4月9日在18:58

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

–ste
2014年9月15日22:04

#5 楼

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

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

现在,导入一个CSS文件就像:

@import "CSS:library/some_css_file"


评论


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

– CSS
15年8月20日在21:10

#6 楼

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

创建符号链接:

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


将符号链接文件导入到目标.scss中:

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


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


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


评论


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

– LocalPCGuy
2014年12月4日19:06

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

– Nik Sumeiko
2014年12月5日在7:20

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

–亚伦·克劳斯(Aaron Krauss)
15年7月17日在15:41

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

–侧面
16-3-22在22:49



#7 楼

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

node-sass-import-once(与node-sass一起使用(对于Node.js))可以内联导入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失败

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

#8 楼

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

如果不这样做,sass将使用css @import,这是您不需要的。 br />

评论


不幸的是,有时导入的CSS文件无法控制,例如在打包一些静态资产的库中。

–埃里克·德雷切尔(Eric Drechsel)
2011年11月26日,0:09

#9 楼

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

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

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

只要您以一种方式明确使用完整路径,在CSS中执行@import就能很好地处理CSS文件或其他。在开发模式下,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进行统计可做两件事:


触发rake assets:precompile任务以预编译适当的CSS文件。
生成一个可以正确反映资产的URL,而不管Rails环境如何。

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

评论


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

–侧面
16年7月28日在12:11

#10 楼

简单的解决方法:

所有或几乎所有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是否包含任何可解释的CSS工件(虽然不太可能,但是如果发生,则结果将很难调试且很危险)。

#11 楼

现在可以使用:

@import 'CSS:directory/filename.css';


评论


仅当安装了gem sass-css-importer时,才通过switch -r sass-css-importer调用sass,并且从文件路径中省略.css。

– BernhardDöbler
2014年9月13日在17:58

#12 楼

我可以确认这项工作:

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

评论


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

– Adrian Ber
16年4月7日在19:37

#13 楼

很简单。

@import“ path / to / file.css”;

评论


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

–GSto
2011年8月19日在15:01

得分最低的答案,但具有讽刺意味的是,现在看来这是正确的方法。包括后缀是正确的做法。

–维克
18年11月23日在3:25