Floating elements
Bron: http://www.sceneone.nl/positionering/float.php
Titel: HTML en CSS tutorials
Auteur: Wybe Weysters
We hebben tot nu toe twee mogelijkheden voor positionering besproken: absoluut- en relatief positioneren.
We hebben gezien dat beide opties hun voordelen, maar zeker ook hun nadelen hebben. Die nadelen zitten
'm er met name in dat elementen in meer (absoluut) of mindere (relatief) mate uit de
flow van de pagina getrokken worden.
Een pagina wordt met deze manier van positioneren een nogal statisch geheel. Niet zo'n probleem bij kleine,
statische websites waarbij je op voorhand precies weet hoeveel content je hebt en waarvan je weet dat
er in de toekomst niet zoveel meer aan gewijzigd zal hoeven worden.
In het geval van een grotere website, waar je wat flexibiliteit in je layout in wilt bouwen, kom je niet meer weg met deze statische oplossingen.
Wat dan wel?
We kennen in css de eigenschap float. Hiermee komen we een eind verder, vooral omdat we ook de eigenschap
clear kennen.
De combinatie van die twee eigenschappen geeft ons een paar mooie flexibele mogelijkheden.
De eigenschap float kent de waarden: left, right en none.
De eigenschap clear kent de waarden: left, right, both en none.
In feite wordt een element wat de eigenschap float krijgt ook weer gedeeltelijk boven de flow van de pagina uitgetild. Op een soortgelijke manier waarop dat ook gebeurt bij relatief positioneren: de elementen die in de html structuur ná het 'zwevende' element komen herkennen het 'zwevende' element niet meer als onderdeel van de flow van de pagina.
Maar in dit geval hebben we daarvoor twee mogelijke goede oplossingen:
- We kunnen van een element wat volgt op een 'zwevend' element ook een 'zwevend' element maken. Hiermee stellen we in feite het probleem uit, maar vaak komt dit goed van pas.
- We kunnen de eigenschap 'clear' gebruiken. Hiermee kunnen we een 'niet-zwevend' element als het ware waarschuwen: " Let op! In de html structuur boven je bevinden zich floating elements. Hou daar rekening mee en behandel ze alsof ze gewoon onderdeel uitmaken van de normale flow."
Oké, genoeg gelul. Een voorbeeld:
CSS: div#box1{
background-color: black;
width: 100%;
height: 75px;
}
div#box2{
background-color: red;
float: left;
width: 15%;
height: 200px;
}
div#box3{
background-color: green;
float: left;
width: 70%;
height: 200px;
}
div#box4{
background-color: silver;
float: left;
width: 15%;
height: 200px;
}
HTML: <div id="box1">box 1</div>
<div id="box2">box 2</div>
<div id="box3">box 3</div>
<div id="box4">box 4</div>
Ik ga er vanuit dat je de mogelijkheden herkent op het moment dat je bovenstaand voorbeeld bekeken hebt.
Je hebt hier een volledig flexibele 3-koloms layout voor je pagina.
Omdat box2, -3 en -4 zwevende elementen zijn gedragen ze zich niet meer helemaal als block
elementen en ze zijn gedeeltelijk uit de flow van de pagina gehaald.
Dit werkt alleen maar bij zwevende elementen onderling. Zou bijvoorbeeld box3 geen zwevend element zijn dan werkt de hele magic niet meer:
CSS: div#box1{
background-color: black;
width: 100%;
height: 75px;
}
div#box2{
background-color: transparent;
float: left;
width: 15%;
height: 200px;
}
div#box3{
background-color: green;
width: 70%;
height: 200px;
}
div#box4{
background-color: silver;
float: left;
width: 15%;
height: 200px;
}
HTML: <div id="box1">box 1</div>
<div id="box2">box 2</div>
<div id="box3">box 3</div>
<div id="box4">box 4</div>
Wat gebeurt er?
Er gebeuren eigenlijk een paar dingen:
- box3 doet niet meer mee met de zwevende elementen en kijkt dus alleen maar naar de normale flow van de pagina. Het eerste wat box3 in de flow van de pagina tegenkomt is box1. Box2 zweeft immers boven die flow. Box3 sluit dus keurig aan waar box1 ophoudt. Box2 wordt niet gezien en box3 loopt onder box2 door.
- omdat box3 geen zwevend element is behoudt hij zijn normale eigenschappen. Eén van die eigenschappen is het feit dat een div een block-element is.
- box4 kijkt in de html structuur boven zich en ziet daar een block-element, namelijk box3. Box4 verhuist dus naar 'de volgende regel'.
Ik zou hier nog pagina's lang over kunnen uitwijden om te proberen het een en ander te verklaren. Dat ga ik niet doen. Ik zou zeggen probeer er zelf eens wat mee, zodat je gaat begrijpen hoe het principe van de floating elements werkt en wat de voordelen zijn.
Wat ik nog wel ga doen is een voorbeeld geven en bespreken waarbij ik de eigenschap 'clear' ga gebruiken:
CSS: div#box1{
background-color: black;
width: 100%;
height: 75px;
}
div#box2{
background-color: red;
float: left;
width: 15%;
height: 300px;
}
div#box3{
background-color: green;
float: left;
width: 70%;
height: 200px;
}
div#box4{
background-color: silver;
float: left;
width: 15%;
height: 200px;
}
div#box5{
background-color: purple;
clear: left;
float: right;
width: 75px;
height: 50px;
}
HTML: <div id="box1">box 1</div>
<div id="box2">box 2</div>
<div id="box3">box 3</div>
<div id="box4">box 4</div>
<div id="box5">box 5</div>
Ik heb box2 wat hoger gemaakt zodat je goed kunt zien wat er gebeurt. Box5 laat ik floaten naar rechts
en geef ik de eigenschap 'clear: left'. Daarmee zeg ik dus tegen box5: "Let op, aan je linkerzijde bevinden
zich zwevende elementen. Negeer ze niet, maar behandel ze alsof ze op een normale manier in de flow van
de pagina zitten."
Op deze manier beweegt box5 altijd mee met de hoogte van óf box2, óf box3, óf box4.
Afhankelijk van welke van die drie boxen het hoogste is:
CSS: div#box1{
background-color: black;
width: 100%;
height: 75px;
}
div#box2{
background-color: red;
float: left;
width: 15%;
height: 200px;
}
div#box3{
background-color: green;
float: left;
width: 70%;
height: 300px;
}
div#box4{
background-color: silver;
float: left;
width: 15%;
height: 200px;
}
div#box5{
background-color: purple;
clear: left;
float: right;
width: 75px;
height: 50px;
}
HTML: <div id="box1">box 1</div>
<div id="box2">box 2</div>
<div id="box3">box 3</div>
<div id="box4">box 4</div>
<div id="box5">box 5</div>
Er zijn nog zoveel voorbeelden te geven, maar zoals al eerder gezegd: probeer zelf maar eens wat uit met
deze eigenschappen.
En probeer dit ook eens in combinatie met het aanbrengen van margins en paddings
voor de fine tuning van de boxen en de inhoud van die boxen.
Je zult zien dat je de elementen en inhoud tot op de pixel nauwkeurig daar kunt krijgen waar je het hebben
wilt.