Est-il possible d'importer un fichier CSS normal avec la commande @import
de Sass? Bien que je n’utilise pas toute la syntaxe SCSS de sass, j’apprécie tout de même sa combinaison/compression de fonctionnalités et je voudrais pouvoir l’utiliser sans renommer tous mes fichiers en * .scss.
On dirait que ceci n'est pas implémenté, au moment d'écrire ces lignes:
https://github.com/sass/sass/issues/19
Pour libsass (implémentation C/C++), l’importation fonctionne pour *.css
de la même manière que pour les fichiers *.scss
- omettez simplement l’extension:
@import "path/to/file";
Cela importera path/to/file.css
.
Voir cette réponse pour plus de détails.
Voir cette réponse pour Ruby implementation (sass gem)
Après avoir eu le même problème, j'ai été confondu avec toutes les réponses ici et les commentaires sur le référentiel de sass dans github.
Je tiens simplement à souligner qu'en décembre 2014, ce problème avait été résolu. Il est maintenant possible d'importer des fichiers css
directement dans votre fichier sass. Ce qui suit PR dans github résout le problème.
La syntaxe est la même que maintenant - @import "your/path/to/the/file"
, sans extension après le nom du fichier. Cela importera votre fichier directement. Si vous ajoutez *.css
à la fin, cela se traduira par la règle css
. @import url(...)
.
Si vous utilisez certains "nouveaux" groupeurs de modules "sophistiqués" tels que webpack , vous devrez probablement utiliser ~
au début du chemin. Donc, si vous voulez importer le chemin suivant node_modules/bootstrap/src/core.scss
vous écrirez quelque chose comme@import "~bootstrap/src/core"
.
REMARQUE:
Il semble que cela ne fonctionne pas pour tout le monde. Si votre interprète est basé sur libsass
il devrait fonctionner correctement (checkout this ). J'ai testé avec @import
sur node-sass et tout fonctionne bien. Malheureusement, cela fonctionne et ne fonctionne pas sur certaines instances Ruby.
Vous devez ajouter un trait de soulignement au fichier css à inclure et basculer son extension en scss (ex: _yourfile.scss
). Ensuite, il vous suffit de l'appeler de cette façon:
@import "yourfile";
Et il inclura le contenu du fichier au lieu d'utiliser la directive standard @import de CSS.
Cela a été implémenté et fusionné à partir de la version 3.2
( pull # 754 fusionné le 2 janv. 2015 pour libsass
, les problèmes à l'origine étaient définis ici: sass
# 19# 556 , libsass
# 318 ).
Pour abréger l'histoire longue, la syntaxe est la suivante:
.css
extension à la fin (il en résulte une lecture réelle de s[ac]ss|css
partiel et son inclusion en ligne dans SCSS/SASS): @import "path/to/file";
.css
extension à la fin (résultats de @import url("path/to/file.css");
dans votre CSS compilé): @import "path/to/file.css";
Et c'est sacrément bon: cette syntaxe est élégante et laconique, avec une compatibilité ascendante! Cela fonctionne très bien avec libsass
et node-sass
.
__
Pour éviter d'autres spéculations dans les commentaires, écrivez ceci explicitement: Ruby basé Sass a toujours cette fonctionnalité unimplemented après 7 ans de discussions. Au moment de la rédaction de cette réponse, il est promis qu’en 4.0, il existera un moyen simple d’y parvenir, probablement à l’aide de @use
. Il semble qu'il y aura une mise en œuvre très bientôt, le nouveau "prévu" La balise "Proposition acceptée" a été attribuée à numéro 556 et à la nouvelle fonctionnalité @use
.
La réponse peut être mise à jour dès que quelque chose change .
Bonne nouvelle à tous, Chris Eppstein a créé un plugin Compass avec une fonctionnalité d'importation en ligne css:
https://github.com/chriseppstein/sass-css-importer
Maintenant, importer un fichier CSS est aussi simple que:
@import "CSS:library/some_css_file"
Si vous avez un fichier .css
que vous ne souhaitez pas modifier, ne modifiez pas non plus son extension en .scss
(, par exemple, ce fichier provient d'un projet forké que vous ne gérez pas. ), vous pouvez toujours créer un lien symbolique puis l'importer dans votre .scss
.
Crée un lien symbolique:
ln -s path/to/css/file.css path/to/sass/files/_file.scss
Importe un fichier lien symbolique dans une cible .scss
:
@import "path/to/sass/files/file";
Votre fichier de sortie cible .css
contiendra le contenu du fichier symlink .scss
importé, et non une règle d'importation CSS ( mentionnée par @yaz avec le plus grand nombre de votes de commentaire. ). Et vous n'avez pas de fichiers dupliqués avec des extensions différentes, ce qui signifie que toute mise à jour effectuée dans le fichier initial .css
est immédiatement importée dans votre sortie cible.
Le lien symbolique (également un lien symbolique ou un lien symbolique) est un type spécial de fichier qui contient une référence à un autre fichier sous la forme d'un chemin absolu ou relatif et qui affecte la résolution du chemin d'accès.
- http://en.wikipedia.org/wiki/Symbolic_link
Vous pouvez utiliser un tiers importer
pour personnaliser la sémantique @import
.
node-sass-import-once , qui fonctionne avec node-sass (pour Node.js) peut importer en ligne des fichiers CSS.
Exemple d'utilisation directe:
var sass = require('node-sass');,
importOnce = require('node-sass-import-once');
sass.render({
file: "input.scss",
importer: importOnce,
importOnce: {
css: true,
}
});
Exemple 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"
}
}
});
Notez que node-sass-import-once ne peut pas actuellement importer les partiels Sass sans un soulignement principal explicite. Par exemple avec le fichier partials/_partial.scss
:
@import partials/_partial.scss
réussit@import * partials/partial.scss
échoueEn général, sachez qu'un importateur personnalisé peut changer toute sémantique d'importation . Lisez la documentation avant de commencer à l'utiliser.
Si je suis correct, css est compatible avec scss, vous pouvez donc modifier l'extension d'un css en scss et il devrait continuer à fonctionner. Une fois l'extension modifiée, vous pouvez l'importer et elle sera incluse dans le fichier.
Si vous ne le faites pas, Sass utilisera le css @import, ce que vous ne voulez pas.
J'ai imaginé une façon élégante de faire les Rails. Commencez par renommer votre fichier .scss
en .scss.erb
, puis utilisez la syntaxe suivante (exemple pour élément CSS CSS de highlight_js-Rails4 ):
@import "<%= asset_path("highlight_js/github") %>";
Pourquoi vous ne pouvez pas héberger le fichier directement via SCSS :
Faire un @import
dans SCSS fonctionne très bien pour les fichiers CSS tant que vous utilisez explicitement le chemin complet d'une manière ou d'une autre. En mode de développement, Rails s
sert des éléments sans les compiler, donc un chemin comme celui-ci fonctionne ...
@import "highlight_js/github.css";
... parce que le chemin hébergé est littéralement /assets/highlight_js/github.css
. Si vous cliquez avec le bouton droit de la souris sur la page et sur "Voir la source", puis cliquez sur le lien de la feuille de style avec le @import
ci-dessus, vous verrez une ligne qui ressemble à ceci:
@import url(highlight_js/github.css);
Le moteur SCSS convertit "highlight_js/github.css"
en url(highlight_js/github.css)
. Cela fonctionnera à merveille jusqu'à ce que vous décidiez de l'exécuter en production, où les actifs sont précompilés et dont le nom contient un hachage. Le fichier SCSS sera toujours résolu en un /assets/highlight_js/github.css
statique qui n’a pas été précompilé et n’existe pas en production.
Comment cette solution fonctionne:
Premièrement, en déplaçant le fichier .scss
vers .scss.erb
, nous avons transformé le SCSS en un modèle pour Rails. Maintenant, chaque fois que nous utilisons les balises de modèle <%= ... %>
, le processeur de modèle Rails remplacera ces extraits de code par la sortie du code (comme tout autre modèle).
La mention asset_path("highlight_js/github")
dans le fichier .scss.erb
fait deux choses:
rake assets:precompile
pour précompiler le fichier CSS approprié.Cela signifie également que le moteur SCSS n’analyse même pas le fichier CSS; c'est juste héberger un lien vers ça! Donc, il n'y a pas de correctifs Hokey Monkey ou de solutions de contournement grossières. Nous servons un actif CSS via SCSS comme prévu et utilisons l'URL de cet actif CSS comme Rails. Sucré!
Contournement simple:
Tous, ou presque tous les fichiers css peuvent également être interprétés comme s'il s'agissait de scss. Cela permet également de les importer dans un bloc. Renommez le fichier css en scss et importez-le.
Dans ma configuration actuelle, je fais ce qui suit:
Premièrement, je copie le fichier .css dans un fichier temporaire, cette fois avec l’extension .scss. Exemple de configuration:
copy: {
dev: {
files: [
{
src: "node_modules/some_module/some_precompiled.css",
dest: "target/resources/some_module_styles.scss"
}
]
}
}
Ensuite, vous pouvez importer le fichier .scss à partir de votre scss parent (dans mon exemple, il est même importé dans un bloc):
my-selector {
@import "target/resources/some_module_styles.scss";
...other rules...
}
Remarque: cela pourrait être dangereux, car le css sera analysé plusieurs fois. Vérifiez votre css original pour voir s'il contient un artefact interprétable par scss (c'est improbable, mais si cela se produit, le résultat sera difficile à déboguer et dangereux).