CSS toegepast: Twee kolommen

Veel websites hebben een paginalayout die bestaat uit twee of drie kolommen. Dit zijn gebieden op de website die horizontaal naast elkaar staan en ieder hun eigen soort inhoud bevat.

Vaak zie je dat websites een menu naast de content hebben staan. Dit dictaat is daar een mooi voorbeeld van. Deze website heeft twee kolommen: één kolom met het menu en één kolom met de inhoud.

Met tabellen

Vroeger deden we dit met tabellen. Je kunt vrij makkelijk een venster vullende tabel maken met één rij en twee kolommen. Dan kun je deze tabel gebruiken voor de kolommen van je website. Dit werkt goed, maar wordt tegenwoordig gezien als een bad practice. Deze techniek moet je dus eigenlijk niet meer gebruiken.

We moeten dus eigenlijk CSS gebruiken voor kolommen, maar waarom gebruiken we niet een <table> als deze vaak makkelijker is?

Met CSS

We hebben met CSS al gezien hoe je elementen naast tekst kunt laten 'floaten'. Als je dit vergeten bent kijk dan snel nog even bij het hoofdstukje 'Float'. Dit floaten kunnen we ook gebruik om twee kolommen naast elkaar te zetten. Stel we hebben de volgende HTML die we in twee kolommen willen zetten:

#kolom1 { border: 1px solid red; } #kolom2 { border: 1px solid blue; } <div id="kolom1">Kolom 1</div> <div id="kolom2"> Kolom 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus consectetur, mi ut elementum ultricies, turpis velit facilisis ante, vitae luctus nunc erat non sem. </div>

Standaard zijn blok elementen zoals div zo breed als ze maar kunnen zijn. Deze twee div's gaan zoals je ziet nooit naast elkaar passen. Laten we ze eerst de juiste breedte geven:

#kolom1 { border: 1px solid red; width: 30%; } #kolom2 { border: 1px solid blue; width: 60%; } <div id="kolom1">Kolom 1</div> <div id="kolom2"> Kolom 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus consectetur, mi ut elementum ultricies, turpis velit facilisis ante, vitae luctus nunc erat non sem. </div>

Dat gaat waarschijnlijk wel passen. We voegen nu een float: left toe aan de eerste kolom. Met float kunnen we ervoor zorgen dat de eerste kolom links van de tweede kolom komt te staan.

#kolom1 { border: 1px solid red; width: 30%; float: left; } #kolom2 { border: 1px solid blue; width: 60%; } <div id="kolom1">Kolom 1</div> <div id="kolom2"> Kolom 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus consectetur, mi ut elementum ultricies, turpis velit facilisis ante, vitae luctus nunc erat non sem. </div>

De div's gedragen zich nu zoals de ballon en de tekst in het hoofdstuk 'Float'. De tweede kolom loopt nu om de eerste heen. Dat is niet wat we willen. We willen dat de tweede div er volledig naast staat.

Om dit te doen kunnen we een eigenschap van floats gebruiken: Als twee floatende elementen dezelfde ruimte willen innemen gaan ze naast elkaar staan. Dit doen ze wel alleen maar als er genoeg horizontale ruimte is, anders gaan ze alsnog onder elkaar staan.

Als we ze allebei dus left laten floaten gaan ze als twee kolommen naast elkaar staan:

#kolom1 { border: 1px solid red; width: 30%; float: left; } #kolom2 { border: 1px solid blue; width: 60%; float: left; } <div id="kolom1">Kolom 1</div> <div id="kolom2"> Kolom 2: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus consectetur, mi ut elementum ultricies, turpis velit facilisis ante, vitae luctus nunc erat non sem. </div>

Het zal je misschien opvallen dat de percentages niet tot 100% optellen. Dit is omdat de width de inhoud van een div aangeeft, exclusief de border. Als we ze wel tot 100% laten optellen is de totale inhoud (100% plus die paar pixels die nodig zijn voor de border) breder dan de beschikbare horizontale ruimte. De twee floatende elementen gaan dan juist weer onder elkaar staan.

Probeer maar eens hierboven de width tot 100% op te laten tellen. En daarna de border weg te halen. Als het goed is past het dan juist weer wel.

Je ziet dat de eerste kolom niet zo hoog is als de tweede kolom. Je kunt met min-height deze hoger maken, maar het is in CSS niet mogelijk om te zeggen dat een element 'even hoog' moet zijn als een ander element.