Sass .scss: การทำรังและหลายคลาส?


332

ฉันใช้ Sass (.scss) สำหรับโครงการปัจจุบันของฉัน

ตัวอย่างต่อไปนี้:

HTML

<div class="container desc">
    <div class="hello">
        Hello World
    </div>
</div>

SCSS

.container {
    background:red;
    color:white;

    .hello {
        padding-left:50px;
    }
}

มันใช้งานได้ดี

ฉันสามารถจัดการหลายคลาสในขณะที่ใช้สไตล์ที่ซ้อนกันได้หรือไม่

ในตัวอย่างข้างต้นฉันพูดถึงเรื่องนี้:

CSS

.container.desc {
    background:blue;
}

ในกรณีนี้div.containerปกติจะเป็นredแต่div.container.descจะเป็นสีน้ำเงิน

ฉันจะวางสิ่งนี้ไว้ข้างในcontainerด้วย Sass ได้อย่างไร


1
คุณควรใช้ตัวเลือกสองชั้น ปัญหานี้เป็นตัวอย่างที่สมบูรณ์แบบของตัวเลือกการซ้อนใน Sass คุณสามารถอ่านทั้งหมดได้ที่นี่kolosek.com/nesting-in-less-and-sass
Nesha Zoric

คำตอบ:


570

คุณสามารถใช้การอ้างอิงตัวเลือกหลัก &มันจะถูกแทนที่ด้วยตัวเลือกหลักหลังจากการรวบรวม:

สำหรับตัวอย่างของคุณ:

.container {
    background:red;
    &.desc{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
.container.desc {
    background: blue;
}

สมบูรณ์จะแก้ไขดังนั้นหากเลือกผู้ปกครองของคุณซ้อนตัวเองทำรังจะได้รับการแก้ไขก่อนที่จะเปลี่ยน &&

สัญกรณ์นี้มักใช้ในการเขียนองค์ประกอบเทียมและ -classes :

.element{
    &:hover{ ... }
    &:nth-child(1){ ... }
}

อย่างไรก็ตามคุณสามารถวาง&ตำแหน่งใดก็ได้ที่คุณชอบ*ดังนั้นจึงเป็นไปได้เช่นกัน:

.container {
    background:red;
    #id &{
       background:blue;
    }
}

/* compiles to: */
.container {
    background: red;
}
#id .container {
    background: blue;
}

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

*: ไม่มีตัวละครอื่น ๆ &กว่าช่องว่างจะได้รับอนุญาตในด้านหน้าของ ดังนั้นคุณไม่สามารถเชื่อมต่อโดยตรงกับselector+ &- #id&จะทำให้เกิดข้อผิดพลาด


12
เพียงบันทึกด้านข้างการใช้งานทั่วไป&คือเมื่อใช้องค์ประกอบแบบหลอกและคลาสแบบหลอก ตัวอย่างเช่น&:hover.
สนใจ

1
@crush เพื่อความสมบูรณ์ฉันได้เพิ่มสิ่งนี้ในคำตอบของฉัน ขอบคุณสำหรับความคิดเห็น
Christoph

1
ขอบคุณ ฉันคิดว่าฉันโง่เพราะมันไม่ได้กล่าวถึงในคู่มือเบื้องต้น! BTW เอกสารได้ย้าย URL ไปที่: sass-lang.com/documentation/…
scipilot

1
ถ้า&ใช้ที่ท้ายบรรทัดมันจะวางบรรทัดนั้นไว้ที่จุดเริ่มต้นของคลาสที่เหลือในทุกระดับอื่น ๆ คุณสามารถรวมองค์ประกอบต่างๆเข้าด้วยกันโดยทำ&.descภายใต้.containerซึ่งจะผนวก. desc เข้ากับมันทำให้เกิด.container.desc
Kate Miller

scss-lint แนะนำให้ใช้ "& :: hover" (colones คู่)
Marcel Lange

18

หากเป็นกรณีนี้ฉันคิดว่าคุณต้องใช้วิธีที่ดีกว่าในการสร้างชื่อคลาสหรือแบบแผนชื่อคลาส ตัวอย่างเช่นคุณบอกว่าคุณต้องการให้.containerชั้นเรียนมีสีแตกต่างกันตามลักษณะการใช้งานหรือลักษณะเฉพาะ คุณสามารถทำได้:

SCSS

.container {
  background: red;

  &--desc {
    background: blue;
  }

  // or you can do a more specific name
  &--blue {
    background: blue;
  }

  &--red {
    background: red;
  }
}

CSS

.container {
  background: red;
}

.container--desc {
  background: blue;
}

.container--blue {
  background: blue;
}

.container--red {
  background: red;
}

รหัสข้างต้นจะขึ้นอยู่กับวิธีการ BEM ในแบบแผนการตั้งชื่อชั้นเรียน คุณสามารถตรวจสอบลิงค์นี้: BEM - วิธีการแก้ไของค์ประกอบของบล็อก


สังเกตว่าเสียงนี้ดี แต่ควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมด คุณจะขอบคุณฉันในอนาคตเมื่อคุณพยายามค้นหาโครงการของคุณ.container--descและจบลงด้วยการไม่มีผลลัพธ์
Stavm

2

คำตอบของ Christoph นั้นสมบูรณ์แบบ บางครั้งคุณอาจต้องการไปเรียนมากกว่าหนึ่งครั้ง ในกรณีนี้คุณสามารถลอง@at-rootและ#{}คุณสมบัติ CSS ซึ่งจะช่วยให้สองชั้นรากที่จะนั่งถัดจากแต่ละอื่น ๆ &ที่ใช้

สิ่งนี้จะไม่ทำงาน (เนื่องจากnothing before &กฎ):

container {
    background:red;
    color:white;
    
    .desc& {
      background: blue;
    }

    .hello {
        padding-left:50px;
    }
}

แต่นี่จะ (ใช้@at-root plus #{&}):

container {
    background:red;
    color:white;
    
    @at-root .desc#{&} {
      background: blue;
    }

    .hello {
        padding-left:50px;
    }
}

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