Menggunakan @include vs @extend di Sass?

94

Di Sass, saya tidak bisa membedakan antara menggunakan @includedengan mixin dan menggunakan @extenddengan kelas placeholder. Bukankah mereka sama saja?

temporary_user_name
sumber
2
termasuk tidak memberi Anda memperluas kelas dasar, itu hanya menambahkan opsi. Hanya menyarankan Anda untuk membaca sass-lang.com/docs/yardoc/… dan sass-lang.com/docs/yardoc/file.SASS_REFERENCE.html#extend
CodeGroover
1
Selain itu, @CodeGroover, sama sekali bukan komentar yang berguna, mungkin Anda salah paham dengan pertanyaannya. Membaca ini memberikan informasi yang lebih berguna: gist.github.com/antsa/970172
temporary_user_name
4
Setiap kali Anda menggunakan mixin tanpa parameter, perluasan akan lebih efisien. Atas kebaikan Chris
Abhijeet

Jawaban:

89

Perluasan tidak mengizinkan penyesuaian, tetapi ekstensi menghasilkan CSS yang sangat efisien.

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

a
  @extend %button

button
  @extend %button

Hasil:

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

Dengan mixin, Anda mendapatkan CSS duplikat, tetapi Anda dapat menggunakan argumen untuk mengubah hasil untuk setiap penggunaan.

=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)

Hasil dalam:

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;
}

Silakan ikuti rangkaian contoh kode ini untuk melihat bagaimana Anda dapat membuat kode Anda lebih bersih dan lebih mudah dipelihara dengan menggunakan extends dan mixin secara efektif: http://thecodingdesigner.com/posts/balancing

Perhatikan bahwa SASS sayangnya tidak mengizinkan penggunaan meluas di dalam kueri media (dan contoh terkait dari tautan di atas salah). Dalam situasi di mana Anda perlu memperluas berdasarkan kueri media, gunakan mixin:

=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

Hasil:

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

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

Duplikasi tidak bisa dihindari dalam kasus ini, tetapi Anda tidak boleh terlalu peduli tentang itu karena kompresi gzip server web akan menanganinya.

PS Perhatikan bahwa Anda dapat mendeklarasikan kelas placeholder dalam kueri media.

Pembaruan 2014-12-28 : Memperluas menghasilkan CSS yang lebih ringkas daripada mixin , tetapi manfaat ini berkurang ketika CSS di-gzip. Jika server Anda menyajikan CSS yang di-gzip (memang seharusnya!), Maka ekstensi hampir tidak memberi Anda manfaat. Jadi, Anda selalu bisa menggunakan mixin ! Lebih lanjut tentang ini di sini: http://www.sitepoint.com/sass-extend-nobody-told-you/

Andrey Mikhaylov - lolmaus
sumber
2
Menurut saya itu tidak sepenuhnya akurat ... Anda dapat menyesuaikan @extendsdengan mengganti induk ekstensi. Tentu saja Anda tidak bisa menyampaikan argumen, tetapi apakah itu satu-satunya perbedaan? Dalam hal ini, apakah @extendhanya @mixintanpa argumen? Saya masih belum melihat keuntungan atau perbedaannya.
temporary_user_name
2
Berikut adalah beberapa kebiasaan lainnya ... stackoverflow.com/questions/30744625/…
Toni Leigh
Saya akan berhati-hati menafsirkan aspek "memberi Anda hampir tidak ada manfaat" dari paragraf terakhir, di sana. Kompresi Gzip adalah pembuat kode Huffman berbasis kamus, jadi jika pengulangan terjadi cukup jauh, teks tidak akan ada dalam kamus dan rasio kompresi akan terganggu. Saya masih selalu lebih suka @extendjika memungkinkan, karena ini akan menghasilkan CSS yang lebih ringkas, yang masih akan terkompresi dengan cukup baik (bagaimanapun juga ini adalah teks ASCII).
amcgregor
@amcgregor, perbedaannya dapat diabaikan.
Andrey Mikhaylov - lolmaus
@ AndreyMikhaylov-lolmaus Saya setuju! Saya berharap perbedaannya pada dasarnya tidak dapat diukur melalui kabel, terlepas dari pilihan apa pun hingga satu megabyte atau lebih dari CSS yang dihasilkan, selain fakta bahwa hasil akhir yang tidak terkompresi dalam memori akan lebih kompak digunakan @extend. Ini adalah pengoptimalan mikro yang tampaknya didasarkan pada intuisi dan firasat, bukan pemahaman tentang cara kerja skema kompresi yang terlibat. (Juga: ini mengabaikan overhead yang cukup besar dari pengkodean transfer gzip sesuai permintaan; kompresi tidak gratis
!;
18

Pendekatan yang baik adalah menggunakan keduanya - buat mixin yang akan memungkinkan Anda banyak penyesuaian dan kemudian memperluas konfigurasi umum dari mixin tersebut. Misalnya (Sintaks 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);
}

Ini menyelamatkan Anda dari memanggil mixin tombol-saya berulang kali. Ini juga berarti Anda tidak perlu mengingat pengaturan untuk tombol umum tetapi Anda masih memiliki kemampuan untuk membuat tombol sekali pakai yang sangat unik jika Anda pilih.

Contoh ini saya ambil dari postingan blog yang saya tulis belum lama ini. Semoga ini membantu.

FreddyBushBoy
sumber
14

Menurut pendapat saya meluas adalah kejahatan murni dan harus dihindari. Inilah alasannya:

diberi 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 berikut akan dibuat:

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

Jika browser tidak memahami pemilih, itu membuat seluruh baris pemilih tidak valid. Ini berarti kelas mystyle Anda yang berharga tidak lagi berwarna biru (untuk banyak browser). Apa sebenarnya artinya ini? Jika suatu saat Anda menggunakan perluasan di mana browser mungkin tidak memahami pemilih, setiap penggunaan perpanjangan lainnya akan dibatalkan. Perilaku ini juga memungkinkan terjadinya kejahatan bersarang:

%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;}

Hasil:

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

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

Tl; dr: @extend tidak apa-apa selama Anda tidak pernah menggunakannya dengan pemilih khusus browser. Jika Anda melakukannya, itu akan tiba-tiba merusak gaya di mana pun Anda menggunakannya. Coba andalkan mixin saja!

clearfix
sumber
4
Catatan menarik
simhumileco
4

Gunakan mixins jika menerima parameter, di mana output yang dikompilasi akan berubah tergantung pada apa yang Anda berikan ke dalamnya.

@include opacity(0.1);

Gunakan perpanjang (dengan placeholder) untuk blok gaya statis yang dapat diulang.

color: blue;
font-weight: bold;
font-size: 2em;
d4nyll
sumber
0

Saya setuju dengan jawaban sebelumnya oleh d4nyll. Ada teks tentang opsi perpanjang dan ketika saya sedang meneliti tema ini saya menemukan banyak keluhan tentang memperpanjang, jadi ingatlah itu dan jika ada kemungkinan untuk menggunakan mixin daripada memperpanjang, lewati saja.

Nesha Zoric
sumber