Something I don’t like is a pre-concept about some technology before I try it. I’ve been trying Stylus for a couple of months, and I have to say I liked it a lot. One type of CSS architecture I really like is BEM, and these days, I faced a simple problem that probably most of you were able to solve, but as it was new for me, I decided to post here.
The scenario with BEM
Imagine there is a superclass .fabeni
. It has a child element and a modificator class (if you want to know more about BEM, I wrote some stuff some time ago ). Something like that:
.fabeni { | |
background-color: blue; | |
} | |
.fabeni__child-element { | |
border: solid 1px blue; | |
} | |
.fabeni--inverse { | |
background-color: green; | |
} |
Here’s the thing: let’s say we want to target the child element of the modificator class, something like:
.fabeni--inverse .fabeni__child-element { | |
border-color: green; | |
} |
Using Stylus, I realized three different ways we could write it (probably there is more).
Rewriting the parent class
I have to confess that I’ve already done that. It’s ok! It’s not so beautiful, but it works.
.fabeni | |
background blue | |
&__child-element | |
border solid 1px blue | |
&--inverse | |
background-color green | |
.fabeni__child-element | |
border-color green |
Holding the main class in a variable
Using this preprocessor feature, we could easily reuse the class.
myClass = 'fabeni' | |
.{myClass} | |
background blue | |
&__child-element | |
border solid 1px blue | |
&--inverse | |
background-color green | |
.{myClass}__child-element | |
border-color green |
Targeting the parent class dynamically
And boom! It’s possible to target the parent class using magic. ^[0]
.
.fabeni | |
background blue | |
&__child-element | |
border solid 1px blue | |
&--inverse | |
background-color green | |
& ^[0]__child-element | |
border-color green |
I don’t know exactly which Stylus version supports it, but it’s good homework (I tested directly on the Stylus website).