รวมคลาสอื่นใน SCSS


309

ฉันมีสิ่งนี้ในไฟล์ SCSS ของฉัน:

.class-a{
  display: inline-block;
  //some other properties
  &:hover{
   color: darken(#FFFFFF, 10%);
 }  
}

.class-b{

 //Inherite class-a here

 //some properties
}

ในชั้น B, ผมอยากจะ inherite class-aคุณสมบัติและการประกาศที่ซ้อนกันของ สิ่งนี้ทำได้อย่างไร ฉันพยายามใช้@include class-aแต่นั่นก็แค่เกิดข้อผิดพลาดเมื่อรวบรวม

คำตอบ:


624

ดูเหมือน@mixinและ@includeไม่จำเป็นสำหรับเคสธรรมดาอย่างนี้

หนึ่งสามารถทำได้:

.myclass {
  font-weight: bold;
  font-size: 90px;
}

.myotherclass {
  @extend .myclass;
  color: #000000;
}

40
@extend ทำงานได้ดี แต่จะใช้งานไม่ได้หากคลาสใดคลาสหนึ่งอยู่ในคำสั่ง (โดยทั่วไปจะเป็นคิวรี่สื่อ) นอกเสียจากว่าพวกเขาจะทั้งสองในทิศทางเดียวกัน
MartinAnsty

13
ดูที่นี่สำหรับข้อมูลสนุก ๆ เกี่ยวกับ@extend- มีผลข้างเคียงที่คุณควรระวัง: stackoverflow.com/questions/30744625/…
Toni Leigh

2
ขอบคุณ @ToniLeigh ตัวยึดของ Place มีความน่าสนใจเนื่องจากไม่สามารถสร้างตัวเลือก CSS เพิ่มเติมได้หากตัวเลือกหลักใช้เพื่อขยายเท่านั้น (ไม่ได้ใช้ที่ใดก็ได้) เช่นเดียวกับในตัวอย่างข้างต้น.myclassจะไม่ได้ใช้ทุกที่อื่น (ผมคิดว่า) นอกเหนือจาก.myotherclassนั้นมันจะดีกว่าที่จะมีการ.myclassกำหนดให้เป็น%myclassและขยายเป็น.myotherclass @extend %myclass;มันจะสร้างเป็น.myotherclass{ font-weight: bold; font-size: 90px; color: #000000; }
Abhijeet


@MartinAnsty ดีที่ดูด
Abram

51

ลองสิ่งนี้:

  1. สร้างคลาสพื้นฐานของตัวยึดตำแหน่ง (% base-class) ด้วยคุณสมบัติทั่วไป
  2. ขยายคลาสของคุณ (.my-base-class) ด้วยตัวยึดตำแหน่งนี้
  3. ตอนนี้คุณสามารถขยาย% base-class ในคลาสใดก็ได้ของคุณ (เช่น. my-class)

    %base-class {
       width: 80%;
       margin-left: 10%;
       margin-right: 10%;
    }
    
    .my-base-class {
        @extend %base-class;
    }
    
    .my-class {
        @extend %base-class;
        margin-bottom: 40px;
    }
    

ฉันคิดว่าคำตอบนี้เหมือนกับคำตอบที่ได้รับความนิยมมากที่สุด ฉันถูกไหม?
Yevgeniy Afanasyev

1
@Yevgeniy Afanasyev ไม่คุณไม่ขยายชั้นเรียนโดยตรง แต่คุณสามารถขยายตัวแทนได้โดยตรง
Ashwin

มันไม่เคยถาม :(
Yevgeniy Afanasyev

1
@Yevgeniy Afanasyev ขยายชั้นเรียนโดยตรง (คำตอบที่ได้รับความนิยมมากที่สุด) ไม่ได้ผลสำหรับฉัน แต่การขยายตัวยึดตำแหน่งก็ใช้งานได้ ดังนั้นฉันโพสต์คำตอบเพราะมันไม่ใช่คำตอบเดียวกัน
Ashwin

3
ขอบคุณสำหรับการโพสต์คำตอบอื่น แต่มันไม่ชัดเจนจากคำตอบของคุณว่าทำไมเราถึงต้องการมัน หากคุณโปรดเพิ่มเหตุผลเพิ่มเติมเพื่อชี้แจงกรณีการใช้งานหรือข้อดีของวิธีนี้มันจะได้รับการชื่นชม ขอบคุณ.
Yevgeniy Afanasyev

16

การใช้ @extend เป็นวิธีการแก้ปัญหาที่ดี แต่โปรดทราบว่า css ที่คอมไพล์แล้วจะแยกการกำหนดคลาส คลาสใดก็ตามที่ขยายตัวยึดตำแหน่งเดียวกันจะถูกจัดกลุ่มเข้าด้วยกันและกฎที่ไม่ได้ขยายในชั้นเรียนจะอยู่ในคำจำกัดความแยกต่างหาก หากมีหลายคลาสที่ขยายออกไปมันอาจกลายเป็นเรื่องไม่เชื่อฟังในการค้นหาตัวเลือกใน css ที่รวบรวมหรือเครื่องมือ dev ในขณะที่มิกซ์อินจะทำซ้ำโค้ดมิกซ์อินและเพิ่มสไตล์เพิ่มเติม

คุณสามารถเห็นความแตกต่างระหว่าง @extend และ @mixin ในsassmeisterนี้


ลิงก์ sassmeister เสีย
LexieHankins

11
@extend .myclass;
@extend #{'.my-class'};

22
ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
adiga

2
@extend #{'.my-class', '.my-other-class'};
iarroyo

2
ความหมายของ hashbang ที่นี่คืออะไร?
Konrad Viltersten

7

ตัวเลือกอื่นอาจใช้ตัวเลือกแอททริบิวต์:

[class^="your-class-name"]{
  //your style here
}

ในขณะที่ทุกคลาสที่ขึ้นต้นด้วย "your-class-name" ใช้สไตล์นี้

ดังนั้นในกรณีของคุณคุณสามารถทำได้เช่น:

[class^="class"]{
  display: inline-block;
  //some other properties
  &:hover{
   color: darken(#FFFFFF, 10%);
 }  
}

.class-b{
  //specifically for class b
  width: 100px;
  &:hover{
     color: darken(#FFFFFF, 20%);
  }
}

เพิ่มเติมเกี่ยวกับตัวเลือกคุณสมบัติในw3Schools

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