ใช้ @include vs @extend ใน Sass?


94

ใน Sass ฉันไม่สามารถแยกแยะความแตกต่างระหว่างการใช้@includeกับ mixin และการใช้@extendกับคลาสตัวยึดตำแหน่งได้ พวกเขาไม่เท่ากันเหรอ?


2
รวมไม่ได้ให้คุณขยายคลาสพื้นฐานเพียงแค่เพิ่มตัวเลือก เพียงแนะนำให้คุณอ่าน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

คำตอบ:


89

ส่วนขยายไม่อนุญาตให้ปรับแต่งได้ แต่สร้าง 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;
}

ด้วย mixins คุณจะได้รับ 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;
}

โปรดปฏิบัติตามตัวอย่างโค้ดชุดต่อเนื่องนี้เพื่อดูว่าคุณสามารถทำให้โค้ดของคุณสะอาดและบำรุงรักษาได้มากขึ้นโดยใช้ส่วนขยายและมิกซ์อินอย่างมีประสิทธิภาพ: http://thecodingdesigner.com/posts/balancing

โปรดทราบว่า SASS ไม่อนุญาตให้ใช้การขยายภายในแบบสอบถามสื่อ (และตัวอย่างที่เกี่ยวข้องจากลิงค์ด้านบนไม่ถูกต้อง) ในสถานการณ์ที่คุณต้องการขยายตามแบบสอบถามสื่อให้ใช้ 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

ผลลัพธ์:

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

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

การทำสำเนาเป็นสิ่งที่หลีกเลี่ยงไม่ได้ในกรณีนี้ แต่คุณไม่ควรสนใจมากเกินไปเพราะการบีบอัด gzip ของเว็บเซิร์ฟเวอร์จะดูแลมัน

ป.ล. โปรดทราบว่าคุณสามารถประกาศคลาสตัวยึดตำแหน่งภายในแบบสอบถามสื่อ

อัปเดต 2014-12-28 : ขยายการสร้าง CSS ที่กะทัดรัดกว่าที่มิกซ์อินทำได้ แต่ประโยชน์นี้จะลดลงเมื่อ CSS ถูก gzipped หากเซิร์ฟเวอร์ของคุณให้บริการ CSS แบบ gzipped (มันควรจะเป็นจริง!) การขยายนั้นแทบจะไม่มีประโยชน์ คุณจึงสามารถใช้มิกซ์อินได้ตลอดเวลา! เพิ่มเติมเกี่ยวกับเรื่องนี้ที่นี่: http://www.sitepoint.com/sass-extend-nobody-told-you/


2
ฉันคิดว่าไม่ถูกต้องทั้งหมด ... คุณปรับแต่งได้@extendsโดยการลบล้างพาเรนต์ส่วนขยาย แน่นอนว่าคุณไม่สามารถผ่านข้อโต้แย้งได้ แต่นั่นคือความแตกต่างเพียงอย่างเดียวหรือไม่? ในกรณีนี้เป็น@extendเพียงการ@mixinไม่มีข้อโต้แย้ง? ยังไม่เห็นข้อดีหรือข้อแตกต่าง
Temporary_user_name

2
นี่คือนิสัยใจคออื่น ๆ ... stackoverflow.com/questions/30744625/…
Toni Leigh

ฉันจะระมัดระวังในการตีความ "ไม่ให้ประโยชน์อะไรเลย" ของย่อหน้าสุดท้ายที่นั่น การบีบอัด Gzip เป็นตัวเข้ารหัส Huffman ที่ใช้พจนานุกรมดังนั้นหากการทำซ้ำเกิดขึ้นห่างกันมากพอข้อความจะไม่อยู่ในพจนานุกรมและอัตราส่วนการบีบอัดจะได้รับผลกระทบ ฉันยังคงชอบเสมอ@extendเมื่อเป็นไปได้เนื่องจากจะทำให้ CSS ที่กะทัดรัดกว่าซึ่งจะยังบีบอัดได้ค่อนข้างดี (เป็นข้อความ ASCII)
amcgregor

@amcgregor ความแตกต่างมีเล็กน้อย
Andrey Mikhaylov - lolmaus

@ AndreyMikhaylov-lolmaus ฉันเห็นด้วย! ฉันคาดหวังที่แตกต่างกันเพื่อเป็นหลัก unmeasurable ผ่านสายโดยไม่คำนึงถึงทางเลือกสำหรับอะไรถึงเมกะไบต์หรือดังนั้นของ CSS สร้างอื่น ๆ @extendนอกเหนือจากความจริงที่ว่าผลสุดท้ายไม่มีการบีบอัดในหน่วยความจำจะมีขนาดกะทัดรัดมากขึ้นโดยใช้ นี่คือการเพิ่มประสิทธิภาพแบบไมโครซึ่งดูเหมือนจะขึ้นอยู่กับสัญชาตญาณและความรู้สึกในทางเดินอาหารแทนที่จะเข้าใจว่ารูปแบบการบีบอัดที่เกี่ยวข้องนั้นใช้งานได้จริงอย่างไร (นอกจากนี้: มันไม่สนใจค่าใช้จ่ายจำนวนมากของการเข้ารหัสการถ่ายโอน gzip ตามความต้องการการบีบอัดไม่ฟรี!;)
amcgregor

18

แนวทางที่ดีคือการใช้ทั้งสองอย่าง - สร้างมิกซ์อินที่จะช่วยให้คุณปรับแต่งได้มากมายจากนั้นขยายสำหรับการกำหนดค่าทั่วไปของมิกซ์อินนั้น ตัวอย่างเช่น (SCSS Syntax):

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

วิธีนี้ช่วยให้คุณไม่ต้องโทรหามิกซ์ปุ่มของฉันซ้ำแล้วซ้ำอีก นอกจากนี้ยังหมายความว่าคุณไม่จำเป็นต้องจำการตั้งค่าสำหรับปุ่มทั่วไป แต่คุณยังมีความสามารถในการสร้างปุ่มกดครั้งเดียวที่ไม่เหมือนใคร

ฉันใช้ตัวอย่างนี้จากบล็อกโพสต์ที่ฉันเขียนเมื่อไม่นานมานี้ หวังว่านี่จะช่วยได้


14

ในความคิดของฉันการขยายความเป็นสิ่งชั่วร้ายบริสุทธิ์และควรหลีกเลี่ยง นี่คือเหตุผล:

ให้ 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

4

ใช้มิกซ์อินหากยอมรับพารามิเตอร์โดยเอาต์พุตที่คอมไพล์จะเปลี่ยนไปตามสิ่งที่คุณส่งผ่านเข้าไป

@include opacity(0.1);

ใช้การขยาย (พร้อมตัวยึดตำแหน่ง) สำหรับบล็อกสไตล์ที่ทำซ้ำได้แบบคงที่

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

0

ฉันเห็นด้วยกับคำตอบก่อนหน้านี้โดย d4nyll มีข้อความเกี่ยวกับตัวเลือกการขยายและในขณะที่ฉันกำลังค้นคว้าธีมนี้ฉันพบข้อร้องเรียนมากมายเกี่ยวกับการขยายดังนั้นโปรดทราบว่าและหากมีความเป็นไปได้ที่จะใช้ mixin แทนการขยายให้ข้ามการขยาย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.