Is there anyway to import a regular CSS file with Sass's @import
command? While I'm not using all of the SCSS syntax from sass, I do still enjoy it's combining/compressing features, and would like to be able to use it without renaming all of my files to *.scss
Looks like this is unimplemented, as of the time of this writing:
https://github.com/sass/sass/issues/193
For libsass (C/C++ implementation), import works for *.css
the same way as for *.scss
files - just omit the extension:
@import "path/to/file";
This will import path/to/file.css
.
See this answer for further details.
See this answer for Ruby implementation (sass gem)
@import
statement is not changed at all and appears in the resulting CSS file, Sass doesn't include the referenced CSS file like @Subtonic is asking. It looks like it will be implemented in Sass 3.4 or 4.0 –
Acroter libsass
at least. See the answer #7112110 and PR github.com/sass/libsass/pull/754 –
Cerate *.css
the same way as for *.css
files" is a tautology. You meant for one of those to be *.scss
, right? –
Cockadoodledoo Sass
master file after all @use
, in the resulting css @import
appears at the start of the file. –
Kailyard After having the same issue, I got confused with all the answers here and the comments over the repository of sass in github.
I just want to point out that as December 2014, this issue has been resolved. It is now possible to import css
files directly into your sass file. The following PR in github solves the issue.
The syntax is the same as now - @import "your/path/to/the/file"
, without an extension after the file name. This will import your file directly. If you append *.css
at the end, it will translate into the css
rule @import url(...)
.
In case you are using some of the "fancy" new module bundlers such as webpack, you will probably need to use use ~
in the beginning of the path. So, if you want to import the following path node_modules/bootstrap/src/core.scss
you would write something like @import "~bootstrap/src/core"
.
NOTE:
It appears this isn't working for everybody. If your interpreter is based on libsass
it should be working fine (checkout this). I've tested using @import
on node-sass and it's working fine. Unfortunately this works and doesn't work on some ruby instances.
libsass
but when using the ruby implementation of sass, it seems that this syntax works, but only if you have sass-css-importer
required. At least that's what I'm seeing. Can anyone else confirm this? –
Bourn ruby
and nodejs
interpreters. Have you checked if you're not placing an extension after the file name? The correct syntax is @import "path/to/style/file
(without the .css
extension) –
Facial Error: File to import not found or unreadable: cssdep/cssfile
. If I create a cssdep/cssfile.scss
it suddenly works. So not a path issue, for some reason I still can't include '.css' files from SASS :( –
Sheehy ruby -v
: ruby 2.2.2p95 (2015-04-13 revision 50295) [x64-mingw32]
sass -v
: Sass 3.4.17 (Selective Steve)
not working here –
Apophysis @import "node_modules/normalize.css/normalize";
–
Cerise File to import not found or unreadable
if you're trying to import a css file from a directory where there are files with the same name, but different extensions. –
Athwart @import "path/to/the/style"
. This, however, works differently on different implementations. Check @Farside's answer. –
Facial normalize.css
and I kept using normalize/normalize
. +1 to @Nick! Though you only need node_modules/normalize.css
since the package's main
is normalize.css
. You can also leave off the node_modules
if you configure your includePaths
with node-sass
. –
Theresiatheresina @import url(~normalize.css/normalize.css);
–
Raffo This was implemented and merged starting from version 3.2
(pull #754 merged on 2 Jan 2015 for libsass
, issues originaly were defined here: sass
#193 #556, libsass
#318).
To cut the long story short, the syntax in next:
to import (include) the raw CSS-file
the syntax is **without `.css`** extension at the end (results in actual read of partial `s[ac]ss|css` and include of it inline to SCSS/SASS):@import "path/to/file";
to import the CSS-file in a traditional way
syntax goes in traditional way, **with `.css` extension** at the end (results to `@import url("path/to/file.css");` in your compiled CSS):@import "path/to/file.css";
And it is damn good: this syntax is elegant and laconic, plus backward compatible! It works excellently with libsass
and node-sass
.
__
To avoid further speculations in comments, writing this explicitly: Ruby based Sass still has this feature unimplemented after 7 years of discussions. By the time of writing this answer, it's promised that in 4.0 there will be a simple way to accomplish this, probably with the help of @use
. It seems there will be an implementation very soon, the new "planned" "Proposal Accepted" tag was assigned for the issue #556 and the new @use
feature.
UPD: on 26 October 2020 lib-sass was deprecated, therefore issue #556 was immediately closed.
__
answer might be updated, as soon as something changes.
Node-sass
is a Node.js library LibSass (the C version of Sass). Not a single mention that libsass
or node-sass
is Ruby based, not a single mention about RUBY version only in the original question. Please, read carefully, before writing 3 comments in a row next time. I have all the references: as per issue#193 it's still not implemented after 5 years of discussion for Ruby version, they promise this functionality only when ver. 4.0 will be available. –
Mongoose file.min.css
, leaving off the .css
extension didn't work for me. –
Witty
Looks like this is unimplemented, as of the time of this writing:
https://github.com/sass/sass/issues/193
For libsass (C/C++ implementation), import works for *.css
the same way as for *.scss
files - just omit the extension:
@import "path/to/file";
This will import path/to/file.css
.
See this answer for further details.
See this answer for Ruby implementation (sass gem)
@import
statement is not changed at all and appears in the resulting CSS file, Sass doesn't include the referenced CSS file like @Subtonic is asking. It looks like it will be implemented in Sass 3.4 or 4.0 –
Acroter libsass
at least. See the answer #7112110 and PR github.com/sass/libsass/pull/754 –
Cerate *.css
the same way as for *.css
files" is a tautology. You meant for one of those to be *.scss
, right? –
Cockadoodledoo Sass
master file after all @use
, in the resulting css @import
appears at the start of the file. –
Kailyard You must prepend an underscore to the css file to be included, and switch its extension to scss (ex: _yourfile.scss
). Then you just have to call it this way:
@import "yourfile";
And it will include the contents of the file, instead of using the CSS standard @import directive.
Good news everyone, Chris Eppstein created a compass plugin with inline css import functionality:
https://github.com/chriseppstein/sass-css-importer
Now, importing a CSS file is as easy as:
@import "CSS:library/some_css_file"
@import '/fonts/Lato.css'
. Tested in Windows dart 1.63.4 –
Kailyard If you have a .css
file which you don't wish to modify, neither change its extension to .scss
(e.g. this file is from a forked project you don't maintain), you can always create a symlink and then import it into your .scss
.
Creates a symlink:
ln -s path/to/css/file.css path/to/sass/files/_file.scss
Imports symlink file into a target .scss
:
@import "path/to/sass/files/file";
Your target output .css
file is going to hold contents from imported symlink .scss
file, not a CSS import rule (mentioned by @yaz with highest comment votes). And you don't have duplicated files with different extensions, what means any update made inside initial .css
file immediately gets imported into your target output.
Symbolic link (also symlink or soft link) is a special type of file that contains a reference to another file in the form of an absolute or relative path and that affects pathname resolution.
– http://en.wikipedia.org/wiki/Symbolic_link
.css
and created symlink) are available to everyone via a shared repository, for example. –
Ethel mklink /H <link> <target>
, and it's called hard link @mrsafraz. –
Mongoose You can use a third-party importer
to customise @import
semantics.
node-sass-import-once, which works with node-sass (for Node.js) can inline import CSS files.
Example of direct usage:
var sass = require('node-sass');,
importOnce = require('node-sass-import-once');
sass.render({
file: "input.scss",
importer: importOnce,
importOnce: {
css: true,
}
});
Example grunt-sass config:
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"
}
}
});
Note that node-sass-import-once cannot currently import Sass partials without an explicit leading underscore. For example with the file partials/_partial.scss
:
@import partials/_partial.scss
succeeds@import * partials/partial.scss
fails
In general, be aware that a custom importer could change any import semantics. Read the docs before you start using it.
If I am correct css is compatible with scss so you can change the extension of a css to scss and it should continue to work. Once you change the extension you can import it and it will be included in the file.
If you don't do that sass will use the css @import which is something you don't want.
to Import css file in to scss simply use the this: @import "src/your_file_path"; without using extension .css at the end
I figured out an elegant, Rails-like way to do it. First, rename your .scss
file to .scss.erb
, then use syntax like this (example for highlight_js-rails4 gem CSS asset):
@import "<%= asset_path("highlight_js/github") %>";
Why you can't host the file directly via SCSS:
Doing an @import
in SCSS works fine for CSS files as long as you explicitly use the full path one way or another. In development mode, rails s
serves assets without compiling them, so a path like this works...
@import "highlight_js/github.css";
...because the hosted path is literally /assets/highlight_js/github.css
. If you right-click on the page and "view source", then click on the link for the stylesheet with the above @import
, you'll see a line in there that looks like:
@import url(highlight_js/github.css);
The SCSS engine translates "highlight_js/github.css"
to url(highlight_js/github.css)
. This will work swimmingly until you decide to try running it in production where assets are precompiled have a hash injected into the file name. The SCSS file will still resolve to a static /assets/highlight_js/github.css
that was not precompiled and doesn't exist in production.
How this solution works:
Firstly, by moving the .scss
file to .scss.erb
, we have effectively turned the SCSS into a template for Rails. Now, whenever we use <%= ... %>
template tags, the Rails template processor will replace these snippets with the output of the code (just like any other template).
Stating asset_path("highlight_js/github")
in the .scss.erb
file does two things:
- Triggers the
rake assets:precompile
task to precompile the appropriate CSS file. - Generates a URL that appropriately reflects the asset regardless of the Rails environment.
This also means that the SCSS engine isn't even parsing the CSS file; it's just hosting a link to it! So there's no hokey monkey patches or gross workarounds. We're serving a CSS asset via SCSS as intended, and using a URL to said CSS asset as Rails intended. Sweet!
Simple workaround:
All, or nearly all css file can be also interpreted as if it would be scss. It also enables to import them inside a block. Rename the css to scss, and import it so.
In my actual configuration I do the following:
First I copy the .css file into a temporary one, this time with .scss extension. Grunt example config:
copy: {
dev: {
files: [
{
src: "node_modules/some_module/some_precompiled.css",
dest: "target/resources/some_module_styles.scss"
}
]
}
}
Then you can import the .scss file from your parent scss (in my example, it is even imported into a block):
my-selector {
@import "target/resources/some_module_styles.scss";
...other rules...
}
Note: this could be dangerous, because it will effectively result that the css will be parsed multiple times. Check your original css for that it contains any scss-interpretable artifact (it is improbable, but if it happen, the result will be hard to debug and dangerous).
It is now possible using:
@import 'CSS:directory/filename.css';
sass-css-importer
is installed, sass is called with switch -r sass-css-importer
and .css
is omitted from the file path –
Sarong I can confirm this works:
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
Credit to Chriss Epstein: https://github.com/sass/sass/issues/193
Simple.
@import "path/to/file.css";
© 2022 - 2024 — McMap. All rights reserved.
@import
in a regular CSS file should just generate a regular CSS @import. That means one more HTTP request and no combining or compressing. If some implementations behave differently then I'd say it's a non-standard feature that diverges from the language spec. – Pamphlet