Niet exact BEM; ik was al een tijdje bezig met onderzoeken hoe ik het beste mijn CSS zou kunnen indelen en kwam langzamerhand op deze manier uit. Pas later ontdekte ik BEM. Het komt grotendeels overeen, alleen gebruik ik niet al die funky scheidingstekens voor CSS classes die zij als voorbeeld tonen.
Zo is mijn navigatie met dropdown menu's (wat bij T.net bovenin de Nieuws, Reviews etc balk zou zijn, excl. logo) bijv. een samenstelling van
.navigation
.navigation-menu
.navigation-menu-item
.navigation-menu-item-with-submenu
.navigation-submenu
.navigation-submenu-item
De navigatie zit weer in de header, dus die heeft iets als:
.header
.header-logo
.header-logo-image
.header-navigation-wrapper (hierin zit dan de .navigation)
.header-actions-wrapper (voor eventuele zaken die rechts uitgelijnd zijn zoals inloggen e.d. op t.net)
Ik vermijd het gebruik van:
- meer dan 1 classname per element (dus niet zoals bootstrap .btn.btn-default.btn-large... CSS debug hel)
- IDs in CSS (wel in JS)
- CSS declaraties met nested elementen
Ik maak wel gebruik van nested CSS declaraties wanneer er bijv. user-generated content in een container getoond moet worden. Zo is er bijv. een markdown editor in het adminpaneel die simpelweg H1, H2, P, enz uitpoept. In de SCSS geef ik dan styles aan de HTML elementen binnen een container element met een classname die vaak het woord "fragment" bevat, zoals bijv. een klein tekstje in de footer:
code:
1
2
3
4
5
| .footer-fragment {
p { ... }
h1 { ... }
h2 { ... }
} |
Ook maak ik soms gebruik van classnames die vanuit JS gezet kunnen worden. Dit is de enige situatie waarin meerdere classnames op een element gezet mogen worden. Ik gebruik hiervoor vaak een enkel woord, zoals "open" of "active". In mijn SCSS voeg ik dan eventuele wijzigingen toe aan de styles voor elementen binnen het element met zo'n "modifier". Realistisch voorbeed:
code:
1
2
3
4
5
6
| .navigation-menu-item-with-submenu {
...
&.open .navigation-submenu { display: block; }
}
.navigation-submenu { display: none; } |
Ik weet echter nog niet of ik hier 100% tevreden mee ben. Zo stoor ik me aan de volgorde van de CSS declaraties (alle declaraties onder &.open moet eigenlijk onderaan naar mijn idee, gezien deze styles "overschrijven")
Ook twijfel ik nog over de naam conventie van mijn classes. Ik heb er ook aan gedacht om i.p.v. "open" iets als ".navigation-menu-item-with-submenu-open" op het element erbij te zetten, maar dan krijg je echt idiote classnames. Bovendien is dat niet consistent met mijn regel om meer dan 1 classname per element toe te wijzen: De naam ".navigation-menu-item-with-submenu-open" geeft de indruk dat deze classname ook op zichzelf gebruikt kan worden, terwijl dat niet zo is.
Een ander alternatief is om de classname ".navigation-menu-item-with-submenu" te vervangen door ".navigation-menu-item-with-submenu-open" en weer terug bij het schakelen van het submenu. Dit is in de JS echter weer wat complexer.
Ook wil ik vermijden dat die classnames veelvoudig voorkomen in CSS/JS: Het liefst zie ik iedere classname maximaal 1x in een CSS en JS file. Zodra een classname meervoudig voorkomt in een CSS of JS file, wordt het beheer ervan al gauw lastiger. Mocht het toch voorkomen (regelmatig) dat een classname vaker dan eens gebruikt wordt in een CSS/JS file, dan wil ik dat ze niet ver uit elkaar liggen, zodat je ze in ieder geval direct bij elkaar kan zien in de sourcecode.
[
Voor 52% gewijzigd door
Gamebuster op 01-05-2015 10:06
]