Sassで@includeと@extendを使用していますか?


93

Sassでは@include、ミックスインでの使用@extendとプレースホルダークラスでの使用の違いをはっきりと理解できません。彼らは同じことになりますか?


2
includeは基本クラスを拡張するのではなく、オプションを追加するだけです。ただ、読むためにあなたに助言sass-lang.com/docs/yardoc/...sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#extendを
CodeGroover

1
また、@ CodeGrooverは有用なコメントではなく、質問を誤解している可能性があります。これを読むと、より有用な情報が得られます:gist.github.com/antsa/970172
temporary_user_name

4
パラメータなしでミックスインを使用する場合は常に、拡張がより効率的になります。 礼儀クリス
Abhijeet

回答:


87

拡張はカスタマイズを許可しませんが、非常に効率的なCSSを生成します。

%button
  background-color: lightgrey
  &:hover, &:active
    background-color: white

a
  @extend %button

button
  @extend %button

結果:

a, button {
  background-color: lightgrey;
}
a:hover, button:hover, a:active, button:active {
  background-color: white;
}

ミックスインを使用すると、CSSが重複しますが、引数を使用して使用ごとに結果を変更できます。

=button($main-color: lightgrey, $active-color: white)
  background-color: $main-color
  border: 1px solid black
  border-radius: 0.2em

  &:hover, &:active
    background-color: $active-color

a
  +button

button
  +button(pink, red)

結果:

a {
  background-color: lightgrey;
  border: 1px solid black;
  border-radius: 0.2em;
}
a:hover, a:active {
  background-color: white;
}

button {
  background-color: pink;
  border: 1px solid black;
  border-radius: 0.2em;
}
button:hover, button:active {
  background-color: red;
}

この一連のコード例に従って、extendsとmixinを効果的に使用することで、コードをよりクリーンで保守しやすくする方法を確認してください。http//thecodingdesigner.com/posts/balancing

SASSでは、残念ながらメディアクエリ内で拡張を使用することはできません(上記のリンクからの対応する例は間違っています)。メディアクエリに基づいて拡張する必要がある状況では、ミックスインを使用します。

=active
  display: block
  background-color: pink

%active
  +active

#main-menu
  @extend %active // Active by default

#secondary-menu
  @media (min-width: 20em)
    +active // Active only on wide screens

結果:

#main-menu {
  display: block;
  background-color: pink;
}

@media (min-width: 20em) {
  #secondary-menu {
    display: block;
    background-color: pink;
  }
}

この場合、複製は避けられませんが、Webサーバーのgzip圧縮で処理されるため、あまり気にする必要はありません。

PSメディアクエリ内でプレースホルダークラスを宣言できることに注意してください。

更新2014-12-28エクステンドは、ミックスインよりもコンパクトなCSS 生成しますが、CSSがgzip圧縮されると、この利点は減少します。サーバーがgzip圧縮されたCSSを提供している場合(実際にそうすべきです!)、拡張機能はほとんどメリットがありません。したがって、常にミックスインを使用できます。詳細はこちら:http : //www.sitepoint.com/sass-extend-nobody-told-you/


2
完全に正確ではないと思います... @extends拡張機能の親をオーバーライドすることでカスタマイズできます。もちろん、引数を渡すことはできませんが、それだけが違いますか?その場合には、ある@extendだけの@mixin引数なし?まだ利点や違いはわかりません。
temporary_user_name

2
ここではいくつかの他の癖がある... stackoverflow.com/questions/30744625/...
トニリー

そこで、最後の段落の「ほとんどメリットがない」という側面を注意深く解釈したいと思います。Gzip圧縮は辞書ベースのハフマンコーダーであるため、繰り返しが十分に離れている場合、テキストは辞書に存在せず、圧縮率が低下します。私はまだ@extend可能な限り常に好みます。これにより、よりコンパクトなCSS 生成され、かなり適切に圧縮されます(結局、ASCIIテキストです)。
amcgregor 19/07/19

@amcgregor、違いはごくわずかです。
Andrey Mikhaylov-lolmaus

@ AndreyMikhaylov-lolmaus同意します!メモリ内の非圧縮の最終結果がを使用してよりコンパクトになるという事実を除いて、生成されたCSSのメガバイト程度までの選択に関係なく、違いは基本的にネットワーク上で測定不可能であると思い@extendます。これは、関与する圧縮スキームが実際にどのように機能するかを理解するのではなく、一見直感と直感に基づいたマイクロ最適化です。(また、オンデマンドのgzip transfer-encodingのかなりのオーバーヘッドを無視します。圧縮は無料ではありません!)
amcgregor

18

両方を使用することをお勧めします。多くのカスタマイズが可能なミックスインを作成し、そのミックスインの一般的な構成を拡張します。例(SCSS構文):

@mixin my-button($size: 15, $color: red) {
  @include inline-block;
  @include border-radius(5px);
  font-size: $size + px;
  background-color: $color;
}
%button {
  @include my-button;
}
%alt-button {
  @include my-button(15, green);
}
%big-button {
  @include my-button(25);
}

これにより、my-buttonミックスインを何度も呼び出す必要がなくなります。また、一般的なボタンの設定を覚えておく必要はありませんが、必要に応じて非常にユニークな1回限りのボタンを作成することができます。

私はこの例を少し前に書いたブログ投稿から取り上げます。お役に立てれば。


12

私の意見では、拡張は純粋な悪であり、避けるべきです。理由は次のとおりです。

与えられたscss:

%mystyle {color: blue;}
.mystyle-class {@extend %mystyle}
//basically anything not understood by target browser (such as :last-child in IE8):
::-webkit-input-placeholder {@extend %mystyle}

次のCSSが生成されます。

.mystyle-class, ::-webkit-input-placeholder { //invalid in non-webkit browsers
  color: blue;
}

ブラウザーがセレクターを理解しないと、セレクターの行全体が無効になります。これは、あなたの貴重なmystyle-classが(多くのブラウザにとって)もはや青くないことを意味します。これはどういう意味ですか?ブラウザーがセレクターを理解できない拡張機能をいつでも使用すると、拡張機能の他のすべての使用は無効になります。この振る舞いは、悪の入れ子を可能にします:

%mystyle {color: blue;}
@mixin mystyle-mixin {@extend %mystyle; height: 0;}
::-webkit-input-placeholder {@include mystyle-mixin} 
//you thought nesting in a mixin would make it safe?
.mystyle-class {@extend %mystyle;}

結果:

::-webkit-input-placeholder, .mystyle-class { //invalid in non-webkit browsers
  color: blue;
}

::-webkit-input-placeholder {
  height: 0;
}

Tl; dr:@extendは、ブラウザー固有のセレクターで決して使用しない限り、完全に問題ありません。使用すると、使用した場所のスタイルが突然破棄されます。代わりにミックスインに依存してみてください!


4
興味深いメモ
simhumileco 2017

4

パラメータを受け入れる場合はミックスインを使用します。コンパイルした出力は、渡す内容に応じて変化します。

@include opacity(0.1);

スタイルの静的で反復可能なブロックには、拡張(プレースホルダー付き)を使用します。

color: blue;
font-weight: bold;
font-size: 2em;

0

d4nyllによる以前の回答に完全に同意します。拡張オプションに関するテキストがありこのテーマを調査していたときに、拡張について多くの不満を見つけたので、拡張の代わりにミックスインを使用する可能性がある場合は、拡張をスキップしてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.