Bao gồm một lớp khác trong SCSS


309

Tôi có cái này trong tệp SCSS của mình:

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

.class-b{

 //Inherite class-a here

 //some properties
}

Trong lớp b, tôi muốn kế thừa tất cả các thuộc tính và khai báo lồng nhau của class-a. Làm thế nào được thực hiện? Tôi đã thử sử dụng @include class-a, nhưng điều đó chỉ gây ra lỗi khi biên dịch.

Câu trả lời:


624

Có vẻ như @mixin@includekhông cần thiết cho một trường hợp đơn giản như thế này.

Người ta chỉ có thể làm:

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

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

40
@extend hoạt động tốt, nhưng sẽ không hoạt động nếu một trong hai lớp nằm trong một lệnh (thường là truy vấn phương tiện); trừ khi cả hai đều trong cùng một chỉ thị.
MartinAnsty

13
xem ở đây để biết một số sự thật thú vị về @extend- có một số tác dụng phụ khó hiểu mà bạn nên biết: stackoverflow.com/questions/30744625/ chủ
Toni Leigh

2
Cảm ơn bạn @ToniLeigh, PlaceHolder rất thú vị khi họ tiết kiệm việc tạo ra một bộ chọn CSS bổ sung nếu bộ chọn cha mẹ chỉ được sử dụng để mở rộng (không được sử dụng ở bất cứ đâu). Giống như trong ví dụ trên .myclasskhông được sử dụng ở bất kỳ nơi nào khác (tôi cho là) ​​ngoài ra .myotherclass, tốt hơn là nên .myclassxác định %myclassvà mở rộng .myotherclassthành @extend %myclass;. Nó sẽ tạo như.myotherclass{ font-weight: bold; font-size: 90px; color: #000000; }
Abhijeet


@MartinAnsty Vâng, thật tệ.
Abram

51

Thử cái này:

  1. Tạo một lớp cơ sở giữ chỗ (% lớp cơ sở) với các thuộc tính chung
  2. Mở rộng lớp của bạn (.my-base-class) với trình giữ chỗ này.
  3. Bây giờ bạn có thể mở rộng% lớp cơ sở trong bất kỳ lớp nào của mình (ví dụ: lớp .my).

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

Tôi nghĩ rằng câu trả lời này giống như câu trả lời phổ biến nhất. Tôi có đúng không
Yevgeniy Afanasyev

1
@Yevgeniy Afanasyev Không, bạn không mở rộng lớp trực tiếp, nhưng bạn có thể trực tiếp mở rộng trình giữ chỗ.
Ashwin

Nó không bao giờ được hỏi :(
Yevgeniy Afanasyev

1
@Yevgeniy Afanasyev mở rộng lớp học trực tiếp (câu trả lời phổ biến nhất) không hiệu quả với tôi, nhưng việc mở rộng một trình giữ chỗ đã thực hiện công việc. Do đó tôi đã đăng câu trả lời vì nó không phải là cùng một câu trả lời.
Ashwin

3
Cảm ơn bạn đã đăng một câu trả lời thay thế, nhưng không rõ câu trả lời của bạn tại sao chúng ta cần nó. Nếu bạn vui lòng có thể thêm lý do để làm rõ trường hợp sử dụng hoặc lợi thế của phương pháp này, nó sẽ được đánh giá cao. Cảm ơn bạn.
Yevgeniy Afanasyev

16

Sử dụng @extend là một giải pháp tốt, nhưng lưu ý rằng css đã biên dịch sẽ phá vỡ định nghĩa lớp. Bất kỳ lớp nào mở rộng cùng một trình giữ chỗ sẽ được nhóm lại với nhau và các quy tắc không được mở rộng trong lớp sẽ có một định nghĩa riêng. Nếu một vài lớp trở nên mở rộng, nó có thể trở nên ngang ngược để tra cứu bộ chọn trong css đã biên dịch hoặc các công cụ dev. Trong khi đó một mixin sẽ nhân đôi mã mixin và thêm bất kỳ kiểu bổ sung nào.

Bạn có thể thấy sự khác biệt giữa @extend và @mixin trong sassmeister này


Liên kết sassmeister bị hỏng.
LexieHankins

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

22
Mặc dù mã này có thể trả lời câu hỏi, cung cấp ngữ cảnh bổ sung về lý do và / hoặc cách mã này trả lời câu hỏi cải thiện giá trị lâu dài của nó.
adiga

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

2
Ý nghĩa của hashbang ở đây là gì?
Konrad Viltersten

7

Một tùy chọn khác có thể là sử dụng Bộ chọn thuộc tính:

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

Trong khi mọi lớp học bắt đầu bằng "tên lớp của bạn" đều sử dụng kiểu này.

Vì vậy, trong trường hợp của bạn, bạn có thể làm như vậy:

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

Tìm hiểu thêm về Bộ chọn thuộc tính trên w3Schools

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.