2014-10-21 4 views
5

Ich möchte etwas wie das BEM-Modell in meiner Sass-Bibliothek implementieren. Aber ich bemühe mich, einen sauberen Weg zu finden.Ist es möglich, die übergeordneten Eigenschaften in eine erweiterte Sass-Klasse einzuschließen?

Zum Beispiel würde Ich mag einen ‚Basis‘ Stil für ein gemeinsames Element zu erklären, und es dann mit nützlichen Variationen erweitern:

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

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

} 

Das Problem hierbei ist, dass die erzeugte .container-featured Klasse enthält nur die border property - Sass enthält den Rand und den Hintergrund nicht von seiner übergeordneten Klasse.

So Sie am Ende mit auf Klassen in Ihrem Markup zu verdoppeln um die gewünschten Ergebnisse zu erhalten:

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

Gibt es eine Möglichkeit, die Eigenschaften von einer übergeordneten Klasse nach unten in diese Modifikator Klasse zu ziehen, so dass Sie kann dasselbe visuelle Ergebnis erhalten, wenn Sie nur auf die Modifikatorklasse in Ihrem Markup verweisen?

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

Ich habe versucht mit Mixins, dies zu tun, aber die Dinge ausführlich und repetitiven sehr schnell:

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

.container { 
    @include container; 

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

} 

Gibt es eine einfache, saubere Möglichkeit, dies mit Sass zu erreichen?

Antwort

5

Was Sie suchen ist die @extend Richtlinie. @extend können Sie eine Reihe von CSS-Eigenschaften von einem Selektor zum anderen teilen. Dies bedeutet, dass Sie nur die Klasse container-featured verwenden müssen.

Beispiel

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

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

kompiliert:

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

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

Es stimmt, und der CSS-Code wird nicht riesig sein. Ich bearbeite meine Antwort. – Paleo

+0

Das resultierende CSS ist nicht das, was ich erwartet habe, aber die Lösung bleibt gleich. Vielen Dank, das ist einfach genug, um für mich zu arbeiten! – markedup

+1

Also, wie könnte man einen geschachtelten Selektor referenzieren? zB 'container__item - mod', wenn das weniger als' .container {& __ item {& - mod {}}} geschrieben wird. Oder gibt es eine bessere Möglichkeit zu verschachteln? – Plummer

0

Colin Bacon Lösung ist die richtige Antwort auf die Frage. In Bezug auf die BEM-Methode ist dies jedoch nicht elegant. Ich schlage vor, dass Sie eine andere BEM-Syntax verwenden.

HTML:

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

SCSS:

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

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

Die Syntax:

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

ich diesen Ansatz auch gerne, Aber die Klassenverkettung bedeutet, dass einige ältere Browser, die ich noch unterstützen muss, diese Stile nicht übernehmen. – markedup

+1

Kompatibel mit IE7. Wir können diesen Selektor verwenden, da Windows XP (IE6) nicht mehr unterstützt wird. – Paleo

0

Sie sollten mixin in BEM nicht in Sass verwenden!

Mixins sind nur das - Verwendung mehrerer Blöcke und/oder Elemente auf dem gleichen DOM-Knoten.

Ein einzelner DOM Knotens darstellen kann:

  • mehrere Blöcke b-menu b-head-menu
  • ein Block und ein Element des gleichen Blocks b-menu b-menu__layout
  • ein Block und ein Element von einem anderen Block b-link b-menu__link
  • Elemente verschiedener Blöcke b-menu__item b-head-menu__item
  • ein Block mit einem Modifikator und einer anderen R Block b-menu b-menu_layout_horiz b-head-menu
  • mehrere verschiedene Blöcke mit Modifikatoren b-menu b-menu_layout_horiz b-head-toolbar b-head-toolbar_theme_black

Weiteres entnehmen: http://bem.github.io/bem-method/html/all.en.html, Abschnitt Mixin.

Auch Sie können i-Blöcke (abstrakte Blöcke), so dass Ihre. Container wird .i-Container, lesen Sie mehr: http://bem.github.io/bem-method/html/all.en.html, Abschnitt Namenskonventionen.

Und mit Sass können Sie i-Block als

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

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

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

Ohne Sass implementieren, in der BEM mixin werden wie folgt hergestellt:

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

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

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

Abgesehen davon, dass die Basisdeklaration des generischen Containers eher ein Platzhalter als eine Vorfahrklasse ist (was eigentlich ein Verlust an Funktionalität in Bezug auf Bequemlichkeit und Wiederverwendung zu sein scheint), verstehe ich nicht, welchen Vorteil dieser Ansatz gegenüber Colins Vorschlag hat. – markedup

+0

@markedup Der Unterschied ist, dass der Vorschlag des Colins nur eine Stilvererbung ist. Aber mein Beispiel ist, wie man es aus Sicht der BEM-Methodik richtig macht - durch das Mixen. Um deutlich zu machen, hier ist ein Beispiel ohne Sass:

.i-Container { // abstrakt Block Stile Marge: 10%; Hintergrund: #eee; } .container-featured { Grenze: 2px fest # 999; } –

Verwandte Themen