2012-03-05 28 views
161

Tôi có điều này trong tập tin SCSS tôi:Bao gồm một lớp trong SCSS

.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 hưởng công tất cả các tài sản 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.

Trả lời

364

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

Một chỉ có thể làm:

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

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

@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 chỉ thị (thường là truy vấn phương tiện); trừ khi cả hai đều trong cùng một chỉ thị. – MartinAnsty

+3

xem ở đây để biết một số thông tin thú vị về '@ extend' - có một số tác dụng phụ phức tạp mà bạn nên biết: http://stackoverflow.com/questions/30744625/sass-and-bootstrap-mixins-vs-extends/30744854# 30744854 –

+1

Cảm ơn bạn @ToniLeigh, PlaceHolder là thú vị khi họ tiết kiệm ra thế hệ ** một bộ chọn CSS bổ sung ** nếu bộ chọn cha chỉ được sử dụng để mở rộng (không được sử dụng ở bất kỳ đâu). Giống như trong ví dụ trên '.myclass' không được sử dụng ở bất kỳ nơi nào khác (tôi giả sử) ngoài' .otherotherclass', thì tốt hơn nên có '.myclass' được định nghĩa là'% myclass' và được mở rộng trong '.myotherclass' như' @extend% myclass; '. Nó sẽ tạo thành '.myotherclass {font-weight: bold; kích thước phông chữ: 90px; màu: # 000000; } ' – Abhijeet

6

Sử dụng @extend là một giải pháp tốt, nhưng lưu ý rằng các css biên soạn sẽ phá vỡ các đị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ó định nghĩa riêng. Nếu một số lớp được mở rộng, nó có thể trở nên bất hợp lý để tìm kiếm một bộ chọn trong css đã biên dịch hoặc các công cụ dev. Trong khi mixin sẽ lặp lạ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 này sassmeister

2

Một lựa chọn khác có thể được sử dụng một thuộc tính Selector:

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

Trong khi tất cả các lớp bắt đầu bằng "bạn-class-name" 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 điều đó 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%); 
    } 
} 

Thông tin thêm về Selectors Thuộc tính trên w3Schools

1
@extend .myclass; 
@extend #{'.my-class'}; 
+3

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

+0

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

4

Hãy thử điều này, tạo ra một lớp cơ sở giữ chỗ (% cơ sở-class) , mở rộng lớp cơ sở của bạn (% my-base-class) với trình giữ chỗ này. Bây giờ bạn có thể mở rộng% base-class trong bất kỳ lớp nào của bạn (ví dụ:% lớp học của tôi).

%base-class { 
    width: 80%; 
    margin-left: 10%; 
    margin-right: 10%; 
} 

.my-base-class { 
    @extend %base-class; 
} 

.my-class { 
    @extend $base-class; 
    margin-bottom: 40px; 
} 
Các vấn đề liên quan