CSS voor objecten

Dat je kunt programmeren in objecten is waarschijnlijk al bekent. Maar dat je ook CSS in objecten kunt gebruiken is nog vrij nieuw. Tijd om dat eens te ontdekken!

De concepten

Onderhoud

Onderhoud, dat is een hele belangrijke factor in de scriptwereld. Sommige mensen kiezen voor een korte ontwikkeltijd, met als nadeel dat je langer doet over het onderhoud. Andere mensen kiezen voor een lange ontwikkeltijd, waardoor je later sneller dingen kunt aanpassen. Die laatste methode is naar mijn mening de beste, en daar probeer ik mijn lezers van te overtuigen.

Hergebruik

CSS code kun je op sommige momenten heel makkelijk hergebruiken. Als ik eenmaal een hele mooie button heb gemaakt kan ik die in al mijn toekomstige projecten gebruiken. Eigenlijk zou dat zo moeten bij heel veel CSS dingen, vind je niet? Stel je nou voor dat je later heel snel een webpagina kan maken, doordat je alleen wat CSS scriptjes bij elkaar hoeft te voegen?

Overerving

Nog zo’n typisch concept in zowel CSS als OO. De C in CSS staat voor Cascading, overerving. Waarom zullen we daar dan geen gebruik van maken?

Het probleem is dat het vanuit je CSS file niet duidelijk is waarvan je dingen overerft. Je moet in de HTML code kijken naar de klassen, het element en zijn parents.

Werk NIET met elementen en IDs

De oplossing is om niet te werken met element selectoren of IDs. Stel je nou voor dat je een <header> element stijlt, zodat hij er goed uitziet als pagina header. Een maandje later kom je er achter dat je deze header tag ook wilt gebruiken voor de header van een artikel. Ai, daar heb je een probleem. Die krijgt nu ook al die stijlen van de pagina header mee.

Het kan ook andersom. Je maakt een footer en die stijl je met het id #footer. Alles ziet er mooi uit en nu wil je ook dezelfde stijlen gebruiken voor de footer in een post. Ga je nu alle CSS code kopieren?

Werk WEL met classes

De oplossing is het gebruik van classes. Hiermee limiteer je jezelf niet tot bepaalde elementen, of het maar 1 keer mogen voorkomen in een pagina. Als ik de stijlen voor een button wil gebruiken in mijn header dan moet ik vrij genoeg zijn om dat te mogen doen.

Quasi-qualified selectors

om ons niet te limiteren op bepaalde elementen, maar om toch aan te geven bij welk element deze klasse hoort kun je quasi-qualified selectors gebruiken. Stel we hebben dit:

1
2
3
article.featured{
    /* ... */
}

Nu kunnen we de .featured class alleen op een <article> element gebruiken. Maar misschien wil ik later wel helemaal geen pagina op de homepagina, maar wil ik bijv. een <section> of <img> element deze class meegeven.

Om toch aan te geven dat hij bij een article element hoort, maar om hem niet te limiteren op dit element, plaatsen we de selector in een comment:

1
2
3
/*article*/.featured{
    /* ... */
}

Voor CSS is dit nu gewoon een .featured class, maar voor de lezer wordt dit gezien als een .featured class op een article element: Het is quasi-qualified.

De BEM techniek

Het basis concept van objecten in CSS wordt BEM genoemd. Dit staat voor Block, Element, Modifier.

Ik ga een voorbeeld laten zien van deze techniek doormiddel van deze HTML code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<article>
    <header>
        <h1>Hello World</h1>
        <img src="img/thumbs/hello-world.png">
    </header>
    <article>
        <!-- ... -->
    </article>
    <footer>
        <p>Geplaatst in <a href="...">Nieuws</a></p>

        <nav>
            <ul>
                <li><a href="...">Tweet</a></li>
                <li><a href="...">like</a></li>
                <li><a href="...">+1</a></li>
            </ul>
        </nav>
</article>

Een Block is het hoofdobject, in ons geval is dit een post. We geven onze article element dus een post class mee:

1
2
3
<article class=post>
    <!-- ... -->
</article>

Een Block heeft children. In ons geval heeft hij een header, body en footer. Dit zijn de Elementen. De conventie voor een element class naam is block__element (2 underscores). In ons geval wordt het bijvoorbeeld post__header:

1
2
3
4
5
6
7
8
9
10
11
<article class=post>
    <header class=post__header>
        <!-- ... -->
    </header>
    <article class=post__body>
        <!-- ... -->
    </article>
    <footer class=post__footer>
        <!-- ... -->
    </footer>
</article>

Deze Elementen hebben ook weer children. Dit zijn ook allemaal Elementen van de post, we hebben een post__title, post__tumbnail, ect.:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<article class=post>
    <header class=post__header>
        <h1 class=post__title>Hello World</h1>
        <img class=post__thumbnail src="img/thumbs/hello-world.png">
    </header>
    <article class=post__body>
        <!-- ... -->
    </article>
    <footer class=post__footer>
        <p class=post__meta>Geplaatst in <a href="...">Nieuws</a></p>

        <nav class=post__social>
            <ul>
                <li><a href="...">Tweet</a></li>
                <li><a href="...">like</a></li>
                <li><a href="...">+1</a></li>
            </ul>
        </nav>
    </footer>
</article>

Dan hebben we als laatst nog een Modifier. Dit betekend dat het een Block is, die net wat anders is als de vorige block. Als je bijv. op de hompagina van deze website kijkt zie je dat het nieuwste bericht groter is. Het is een uitbereiding van de overige nieuwsblokjes. Dit wordt gedaan doormiddel van een modifier.

Zodra je aan een element een Modifier meegeeft geef je ook altijd de Block mee. Want, zoals ik in het begin al verkondigde, we moeten gebruiken maken van de Cascade.

Een Modifier gebruikt als conventie block--modifier. In ons geval wordt dit waarschijnlijk post--latest:

1
2
3
4
5
6
7
<article class="post  post--latest">
    <!-- ... -->
</article>

<article class=post>
    <!-- ... -->
</article>
[note]
Een opmerkzame lezer zal zien dat ik 2 spaties tussen de classnamen heb
geplaatst. Hierdoor kun je snel zien wat de classnamen zijn, met 1 spatie
staan ze te dicht op elkaar om het snel te kunnen zien.

Harry Roberts en Inuit.css

Voordat ik stop met schrijven wil ik jullie kennis laten maken met Harry Roberts en zijn framework Inuit.css.

Harry Roberts is een van de actieve front-end developers die strijden voor het gebruik van BEM. Hij heeft 2 jaar gewerkt aan grote websites en heeft daardoor een hele interessante kijk op CSS. Het loont zeker de moeite om zijn artikelen te lezen.

Daarnaast heeft hij Inuit.CSS gemaakt. Een framework die werkt via het BEM principe en zijn meeste andere ideeën. Deze blog is ook gemaakt via Inuit.CSS en de code hiervan kun je bekijken.