通常のCSSファイルをSCSSファイルにインポートしますか?


509

とにかく通常のCSSファイルをSassの@importコマンドでインポートする方法はありますか?私はsassのすべてのSCSS構文を使用しているわけではありませんが、その機能の結合/圧縮を楽しんでいます。すべてのファイルの名前を* .scssに変更せずにそれを使用できるようにしたいと思います。


1
はい、方法があります。@ inputステートメントでcssファイルパスの「.css」拡張子を削除するだけです:)(sassバージョン> = 3.2で機能)
KamilKiełczewskiApr

2018年以降、通常のCSSファイルでSASS@importを使用すると、通常のCSS @importが生成さます。つまり、HTTP要求がもう1つあり、結合や圧縮は行われません。一部の実装の動作が異なる場合、言語仕様とは異なる非標準の機能だと思います。
アルバロ・ゴンサレス

回答:


215

これを書いている時点では、これは実装されていないようです:

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

libsass(C / C ++実装)の場合、インポート*.css*.scssファイルの場合と同じように機能します-拡張子を省略します。

@import "path/to/file";

これはインポートされpath/to/file.cssます。

詳細については、この回答を参照してください。

Rubyの実装(sass gem)については、この回答を参照してください


23
@kleinfreundはSass 3.3.1では正しくありません。@import文はすべて、そして得られたCSSファイルに表示される時に変更されていない、サスは@GStoのような参照CSSファイルを求めている含まれていません。Sass 3.4または4.0に実装されるようです
fregante

1
GulpまたはGruntを使用している場合は、CSSファイルをインポートするために別のツールを使用するだけで簡単になり、動作します。私はgulp-import-cssを使用していますが、Gruntで同等のものはわかりません。
fregante 2014年

3
libsass少なくとも動作します。回答stackoverflow.com/questions/7111610/…とPR github.com/sass/libsass/pull/754
ivn

「インポート*.css*.cssファイルの場合と同じように機能します」はトートロジーです。あなたはそれらのうちの1つがであることを意味しました*.scssよね?
underscore_d

1
v3.5.3以降、libsassはこれが非標準の動作であり、信頼すべきではないことを警告します。(代わりに、「カスタムインポーターを使用してこの動作を維持してください。」)github.com/sass/libsass/releases/tag/3.5.3
iX3

383

同じ問題が発生した後、私はここでのすべての回答とgithubのsassのリポジトリに関するコメントに混乱しました。

2014年12月にこの問題が解決されたことを指摘しておきます。csssassファイルにファイルを直接インポートできるようになりました。githubにある次のPRが問題を解決します。

構文は今と同じです- @import "your/path/to/the/file"ファイル名の後に拡張子がありません。これにより、ファイルが直接インポートされます。*.css最後に追加すると、cssルールに変換され@import url(...)ます。

ケースには次のような「空想」新しいモジュールbundlersの一部を使用しているのWebPACK、おそらく使用使用する必要があります~パスの先頭に。したがって、次のパスをインポートするnode_modules/bootstrap/src/core.scss場合は、のように記述します
@import "~bootstrap/src/core"

注:
これはすべての人に効果があるわけではないようです。インタープリターがそれに基づいてlibsassいる場合、それは正常に動作するはずです(これをチェックアウトしてください)。私は@importnode-sassで使用してテストしましたが、うまく機能しています。残念ながら、これは機能し、一部のRubyインスタンスでは機能しません。


1
これはに実装されlibsassているようですが、sassのRuby実装を使用している場合、この構文は機能するようですが、sass-css-importer必要な場合のみです。少なくともそれは私が見ているものです。他の誰かがこれを確認できますか?
bsara 2015

5
sassの最新バージョンを使用していますか?私はしばらくの間この構文を使用しており、それはインタープリターrubynodejsインタープリターの両方で正常に機能します。ファイル名の後に拡張子を付けていないか確認しましたか?正しい構文は@import "path/to/style/file.css拡張子なしで)
tftd

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を使用してnormalize.cssをインポートできました@import "node_modules/normalize.css/normalize";
Nick

260

インクルードするcssファイルにアンダースコアを付加し、その拡張子をscssに切り替える必要があります(例:)_yourfile.scss。次に、次のように呼び出す必要があります。

@import "yourfile";

また、CSS標準の@importディレクティブを使用する代わりに、ファイルの内容が含まれます。


1
それは多分慣習と標準についての何かです。
デビッドモラレス

70
下線は、別のファイルとしてコンパイルされないようにするためのものです。
ジョナ

4
SassのSCSS構文はCSS3のスーパーセットであるため、誰かが不思議に思うかもしれませんが、これは機能します。セミコロンが必要なのもそのためです。
Jacob Wan

46
たとえば、一部のベンダーCSSファイルの拡張子を変更することはできません。
Slava Fomin II 14

7
それがあなたのコンピュータ/サーバー上にある場合は、できます!また、必要に応じて、シンボリックリンクも用意されています。
2014

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年後に。この回答を書いている時点では、4.0には、おそらくの助けを借りてこれを実現する簡単な方法があることが約束されています@use。実装は間もなく行われるようです。問題「556」と新しい機能に、新しい「計画済み」「プロポーザル承認済み」タグが割り当てられました。@use

何かが変更されるとすぐに回答が更新される場合があります


3
明確にするために、sassとしてcssをインポートすると、次のように機能しました:@import url( "path / to / file-without-css-extension");
クレイグウェイン

1
これは、Rubyベースのバージョンのsassでは実際には機能しません。たとえば、コマンドsass myFile.scss:output.cssはcssインポートで失敗しますが、.cssファイルの拡張子を.scssに変更すると機能します。このコメントの執筆時点での最新バージョンで実行:3.4.22 /選択的スティーブ。これは、grunt-contrib-sassなど、rubyバージョンを使用するタスクランナーにも影響します。
ansorensen

@ansorensen、私はあなたの側から混乱があると思います。「.cssファイルの拡張子を.scssに変更すると機能するとはどういう意味ですか?全体のアイデアは、通常のCSSファイルと、それらを扱う2つの方法(SCSSのインポートと混同しないでください)に関するものでした。質問と回答をもう一度読んでください。
2016年

@Farside混乱なし。Rubyの最新バージョンのsass gemでは、 'path / to / file'構文は機能しません。インポートでsassを実行すると、インポートされたパスにあるファイルの拡張子が.scssの場合、インポートは正常に機能し、ファイルに.cssがある場合、インポートは失敗します。質問はcssのscssへのインポートを要求し、あなたはlib-sassとnode-sassに回答を提供します。この機能はRubyベースのバージョンのsassにはないことをコメントしています。
ansorensen

1
@ ansorensen、omg、あなたからのたくさんのテキスト...私は明白でした、そして誰も混乱させないでください。Node-sassNode.jsライブラリLibSassCバージョンのSass)です。ない単一の言及というlibsassか、node-sassのみ元の質問でRUBYバージョンに関するルビー基づいており、単一ではない言及。次回は3つのコメントを続けて書く前に、よく読んでください。私はすべての参照を持っています:問題#193のように、Rubyバージョンの5年間の議論の後、それはまだ実装されていません。4.0が利用可能になります。
Farside

37

皆さん、朗報です。ChrisEppsteinが、インラインCSSインポート機能を備えたコンパスプラグインを作成しました。

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

CSSファイルのインポートは次のように簡単です。

@import "CSS:library/some_css_file"

3
非推奨の開始点を使用するために失敗します。「何であるか、決してなり得ない...」最初に出たときは素晴らしかったと思いますが、もう一度機能させるにはアップデートが必要か、廃止されたプラグインをインストールする必要があります。おかげで、ć§
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

@LocalPCGuyは、.cssたとえば、共有リポジトリを介してすべてのユーザーが両方のファイル(および作成されたシンボリックリンク)を利用できる場合です。
Nik Sumeiko、2014

私はこれをやっただけで、このスレッドのシンボリックリンクについて答えようとしましたが、それがすでにここにあることを嬉しく思います!この必要性はまれであることは事実ですが、私の状況では、CSSファイルをまったく変更したくない(それがバウワーファイルだったため)ため、シンボリックリンクを作成してインポートすると、完全に機能しました。
アーロンクラウス2015

2
以下のためのWindowsユーザー、同じ機能が異なる構文を持つことになりmklink /H <link> <target>、それが呼ばれていますハードリンク @mrsafraz。
Farside 2016年

5

サードパーティ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 失敗する

一般に、カスタムインポーターはインポートのセマンティクスを変更する可能性があることに注意してください。使用を開始する前にドキュメントをお読みください。


4

私が正しい場合、cssはscssと互換性があるので、cssの拡張子をscssに変更しても機能します。拡張子を変更したらインポートでき、ファイルに含まれます。

そうしないと、sassは不要なcss @importを使用します。


16
残念ながら、一部の静的アセットをパッケージ化するライブラリのように、インポートされたcssファイルが制御不能になる場合があります。
Eric Drechsel、

2

エレガントなRailsのような方法を見つけました。まず、.scssファイルの名前をに変更し、次の.scss.erbような構文を使用します(highlight_js-rails4 gem CSSアセットの例):

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

SCSSを介してファイルを直接ホストできない理由

こう@importSCSSでは、長い間、あなたが明示的に完全なパス一つの方法または別のものを使用してのように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プリコンパイルされておらず、本番環境には存在しないstaticに解決されます。

このソリューションの仕組み:

まず、.scssファイルを.scss.erbに移動することにより、SCSSを効果的にRailsのテンプレートに変換しました。これで、<%= ... %>テンプレートタグを使用するたびに、Railsテンプレートプロセッサがこれらのスニペットをコードの出力に置き換えます(他のテンプレートと同様)。

明記asset_path("highlight_js/github")して.scss.erbファイルには、2つのことを行います。

  1. rake assets:precompile適切なCSSファイルをプリコンパイルするタスクをトリガーします。
  2. Rails環境に関係なく、アセットを適切に反映するURLを生成します。

これは、SCSSエンジンがCSSファイルを解析していないことも意味します。それへのリンクをホストしているだけです!したがって、Hokey Monkeyパッチや大まかな回避策はありません。意図したとおりにSCSS経由でCSSアセットを提供し、Railsが意図したとおりに、そのCSSアセットへのURLを使用しています。甘い!


私には、解決策は少し怪しく見え、ハックのように聞こえます。しかし、それは調査には良い仕事です!
2016

0

簡単な回避策:

すべてまたはほとんどすべてのcssファイルは、まるでscssであるかのように解釈することもできます。また、ブロック内にインポートすることもできます。cssの名前をscssに変更し、インポートします。

私の実際の構成では、次のことを行います。

まず、.cssファイルを一時ファイルにコピーします。今回は.scss拡張子を付けます。グラントの設定例:

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で解釈可能なアーティファクトが含まれていないことを確認します(それはありそうもないことですが、発生した場合、結果はデバッグが難しく危険です)。


-3

以下を使用して可能になりました。

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

3
gem sass-css-importerがインストールされている場合にのみ、sassはスイッチ-r sass-css-importerで呼び出さ.cssれ、ファイルパスから省略されます
BernhardDöblerSep

-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

Chriss Epstein氏の功績:https : //github.com/sass/sass/issues/193


1
これをscssファイルでどのように使用できますか?
エイドリアンBER

-10

シンプル。

@import "パス/to/file.css";


6
私はこれを試しましたが、圧縮時にファイルの内容をそのファイルに引き込まず、@ import行を保持します。
GSto 2011

1
最も低いスコアの回答ですが、皮肉なことに、これは今では正しい方法のようです。接尾辞を含めることは正しいことです。
Wyck、2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.