2014-10-21 24 views
5

Tôi muốn thực hiện một cái gì đó giống như mô hình BEM trong thư viện Sass của tôi. Nhưng tôi đang đấu tranh để tìm một cách sạch sẽ để làm điều này.Có thể bao gồm các thuộc tính cha mẹ trong một lớp Sass mở rộng không?

Ví dụ, tôi muốn khai báo một kiểu 'cơ sở' cho một yếu tố chung, và sau đó mở rộng nó với các biến thể hữu ích:

.container { 
    margin: 10%; 
    background: #eee; 

    &-featured { 
    border: 2px solid #999; 
    } 

} 

Vấn đề ở đây là rằng tạo .container-featured lớp chỉ chứa các thuộc tính border — Sass không bao gồm lề và background từ lớp 'parent' của nó.

Vì vậy, bạn sẽ chỉ phải tăng gấp đôi lên trên lớp học trong đánh dấu của bạn để có được những kết quả mong muốn:

<div class="container container-featured"> 
    ... 
</div> 

Có một số cách để kéo các thuộc tính từ một lớp cha mẹ xuống mà lớp sửa đổi, vì vậy bạn có thể nhận được cùng một kết quả trực quan chỉ cần tham khảo lớp sửa đổi trong đánh dấu của bạn?

<div class="container-featured"> 
    <!-- has margin, background, and border styles via just modifier class --> 
</div> 

Tôi đã cố gắng sử dụng mixins để làm điều này, nhưng mọi thứ trở nên dài dòng và lặp đi lặp lại rất nhanh:

@mixins container { 
    margin: 10%; 
    background: #eee; 
} 

.container { 
    @include container; 

    &-featured { 
    @include container; 
    border: 2px solid #999; 
    } 

} 

Có một cách sạch sẽ đơn giản để đạt được điều này với Sass?

Trả lời

5

gì bạn đang tìm kiếm là các chỉ thị @extend. @extend cho phép bạn chia sẻ một tập hợp các thuộc tính CSS từ bộ chọn này sang bộ chọn khác. Điều này có nghĩa là bạn chỉ cần sử dụng lớp container-featured.

Ví dụ

.container { 
    margin: 10%; 
    background: #eee; 

    &-featured { 
    @extend .container; 
    border: 2px solid #999; 
    } 
} 

biên dịch để:

.container, 
.container-featured { 
    margin: 10%; 
    background: #eee; 
} 

.container-featured { 
    border: 2px solid #999; 
} 
+0

Đó là sự thật và mã CSS sẽ không lớn. Tôi chỉnh sửa câu trả lời của mình. – Paleo

+0

CSS kết quả không phải là những gì tôi mong đợi, nhưng giải pháp vẫn giữ nguyên. Cảm ơn rất nhiều, điều này là đơn giản, đủ để làm việc cho tôi! – markedup

+1

Vậy làm thế nào một người có thể tham khảo một bộ chọn lồng nhau? tức là 'container__item - mod' khi ít được viết như' .container {& __ item {& - mod {}}} 'Hay có cách nào tốt hơn để lồng ghép? – Plummer

0

Giải pháp Colin Bacon là câu trả lời đúng cho câu hỏi. Nhưng liên quan đến phương pháp luận BEM, điều này không thanh lịch. Tôi đề nghị bạn sử dụng một cú pháp BEM khác.

HTML:

<div class="Container featured"> 
    ... 
</div> 

SCSS:

.Container { 
    margin: 10%; 
    background: #eee; 

    &.featured { 
    border: 2px solid #999; 
    } 
} 

Cú pháp:

  • ComponentName
  • ComponentName.modifierName
  • ComponentName-descendantNam e
  • ComponentName-descendantName.modifierName
  • ComponentName.isStateOfComponent
+0

Tôi thích cách tiếp cận này là tốt, nhưng chuỗi lớp theo cách này có nghĩa là một số trình duyệt cũ hơn mà tôi vẫn cần hỗ trợ sẽ không nhận các kiểu này. – markedup

+1

Tương thích với IE7. Chúng tôi có thể sử dụng bộ chọn này vì Windows XP (IE6) không còn được hỗ trợ nữa. – Paleo

0

Bạn nên sử dụng mixin trong BEM không Sass!

Kết hợp chỉ là việc sử dụng một số khối và/hoặc phần tử trên cùng một nút DOM.

Một nút DOM duy nhất có thể đại diện:

  • vài khối b-menu b-head-menu
  • một khối và một yếu tố của cùng một khối b-menu b-menu__layout
  • một khối và một phần tử của một khối b-link b-menu__link
  • các phần tử của các khối khác nhau b-menu__item b-head-menu__item
  • một khối có công cụ sửa đổi và anothe r chặn b-menu b-menu_layout_horiz b-head-menu
  • khối khác nhau với các hiệu ứng b-menu b-menu_layout_horiz b-head-toolbar b-head-toolbar_theme_black

Đọc thêm tại địa chỉ: http://bem.github.io/bem-method/html/all.en.html, phần Mixin.

Ngoài ra, bạn có thể sử dụng khối i (khối trừu tượng), vì vậy .container của bạn sẽ là .i-container, đọc thêm: http://bem.github.io/bem-method/html/all.en.html, phần Đặt tên quy ước.

Và với Sass bạn có thể thực hiện i-block như

<div class="container-featured"> 
    ... 
</div> 

%i-container { 
    // abstract block styles 
    margin: 10%; 
    background: #eee; 
} 

.container-featured { 
    @extend %i-container; 
    border: 2px solid #999; 
} 

Without Sass, mixin trong BEM được thực hiện như sau:

<div class="i-container container-featured"> 
    ... 
</div> 

.i-container { 
    // abstract block styles 
    margin: 10%; 
    background: #eee; 
} 

.container-featured { 
    border: 2px solid #999; 
} 
+0

Khác với việc khai báo cơ sở của thùng chứa chung một trình giữ chỗ chứ không phải là lớp tổ tiên (thực sự có vẻ như mất chức năng về tiện lợi và tái sử dụng), tôi không hiểu lợi ích của phương pháp này trong đề xuất của Colin là gì? – markedup

+0

@markedup Sự khác biệt là đề xuất của Colin chỉ là một kế thừa phong cách. Nhưng ví dụ của tôi là làm thế nào để làm điều đó một cách chính xác từ quan điểm của phương pháp BEM - bởi mixin. Để làm cho nó rõ ràng, đây là một ví dụ mà không Sass:

.i-container {// phong cách khối trừu tượng margin: 10%; nền: #eee; } .container-featured { border: 2px solid # 999; } –

Các vấn đề liên quan