maandag 16 april 2012

Footer positioneren

De footer van je website. Hoe zet je die netjes onderin de browser als de inhoud van je pagina korter is dan je browser, maar wel altijd onder de inhoud indien je moet scrollen? Dat gaan we in dit topic behandelen.

We hebben op zich helemaal niet veel nodig om ons doel te bereiken: Een div met een div erin en een div voor de footer met een div erin. De truc is om je gehele pagina in een div te wikkelen, behalve de footer. Door de footer buiten te sluiten, wordt deze automatisch naar beneden gedwongen.

De HTML-code:

<div id="page">
  <div id="pageInner">

  </div><!-- /pageInner -->
</div><!-- /page -->

<div id="footer">
  <div id="footerInner">
    Dit is de footer
  </div><!-- /footerInner -->
</div><!-- /footer -->

Wat we hierboven hebben gedaan is een div aangemaakt met de id 'page' en daarin een div 'pageInner. Alles wat er op de webpagina word weergegeven komt hierin te staan, behalve de footer. Alles wat NIET bij de footer hoort, gaat dus in de div 'pageInner'. Waarom twee divs dan? Aan het einde van deze tutorial wordt duidelijk waarom dit nodig is.

Dan hebben we eronder de div 'footer' geplaatst. zoals je kan zien is deze div geheel gescheiden van de bovenstaande div. In de div 'footer' staat nog een div 'footerInner'. Ook hierover geef ik nader uitleg aan het einde van deze tutorial.

De CSS dus. Deze is eigenlijk vrij simpel. Laten we beginnen met het geven van achtergrond-kleuren aan een aantal elementen, zodat we precies kunnen zien wat we doen:

html, body {
    background-color:aqua;
}

#page {
    background-color:lime;
}

#footerInner {
    background-color:fuchsia;
}

Zoals je hier wellicht is opgevallen, maken we hier onder andere gebruik van een 'html, body'-tag. Dit is geen class of id die wij hebben meegegeven, maar het is zoals de naam al doet vermoeden van toepassing op de html-tag en body-tag die in iedere HTML pagina standaard aanwezig zijn. Deze gaan we zometeen een extra eigenschap mee geven, vandaar dat we hem noemen.

Het tweede opvallende is dat we niet de footer-div zelf, maar de div daarin (footerInner) een achtergrond kleur hebben gegeven.Waarom ik dit doe, laat ik verderop in dit topic zien.

Op dit moment valt er nog niet veel te zien, alles is lichblauw (dit is dus de 'html, body'). We gaan nu verder met de volgende stap: Hoogtes. Als we geen hoogtes aangeven aan alles wat boven de footer staat, zal de footer niet naar beneden worden geduwd. Hier komt de 'html, body'-tag aan bod. Deze gaan we een height geven van 100% (We geven op deze manier aan dat de html EN body altijd de hele hoogte van het venster van de browser moeten gebruiken).

Dit is echter nog niet genoeg. Ook de 'page'-div geven we een height van 100%. Daarmee vertellen we de 'page'-div dat hij altijd van de volledig beschikbare ruimte gebruik moet maken die de parent (in ons geval dus de 'html, body') bied en die is net zo hoog als het venster van de browser. (aangezien de html-tag geen parent heeft, is 100% de hoogte van het venster van de browser).

Ook de 'footer'-div moet een hoogte krijgen, deze zetten we op 50px en ook de 'footerInner'-div zetten we op 50px om even hoog te worden als zijn parent (footer). Tevens geven de 'footerInner' een float:left, zodat we afdwingen dat 'footer' netjes om 'footerInner heen valt.

html, body {
    background-color:aqua;
    height:100%;
}

#page {
    background-color:lime;
    min-height:100%;
}

#footer {
    height:50px;
}

#footerInner {
    background-color:fuchsia;
    float:left;
    height:50px;
}

Als je dit alles nu in je browser previewt, zie je al iets meer. Er staat nu een groot groen vlak (page) in het blauwe en je ziet een scroll-balk. Als je dan helemaal naar beneden scrollt, dan zie je een roze vlakje links onder in beeld, dat is de 'footerInner'-div.

Footer positioneren

Voordat we naar de laatste stap gaan, eerst nog even wat muggenziften: We geven 'footerInner' een 100% width, zodat het roze vlak zich mooi uitbreid over de hele breedte van de pagina. Heel misschien denk je nu wel: Ho ff, waarom is die 'page'-div dan wel al even breed als de pagina, terwijl we daar niets hebben gedefinieerd? Scherp... ;-)

Welnu, de 'footerInner', die we de achtergrond-kleur hebben gegeven, staat in een parent (footer) waarbij we geen width hebben gedefinieerd. De 'footerInner' heeft dus geen referentie en gaat een aanname doen van hoe breed hij moet zijn. Hij bepaald dan standaard dat hij zijn breedte aanpast aan de inhoud (dat is in ons geval de tekst 'Dit is de footer'). Maar, denk je nu: Voor de parent van de 'page'-div hebben toch ook geen width gedefinieerd? Je let goed op ;-) De parent van de 'page'-div is de body, deze heeft standaard al een breedte van 100%.

Verder halen we nog de margins en paddings weg uit de 'html, body'-tag in de CSS. Op deze manier verwijderen we de blauwe randen die zojuist nog zichtbaar waren.

De code:

html, body {
    background-color:aqua;
    height:100%;
    margin:0;
    padding:0;
}

#page {
    background-color:lime;
    min-height:100%;
}

#footer {
    height:50px;
}

#footerInner {
    background-color:fuchsia;
    float:left;
    width:100%;
    height:50px;
}

Je zou nu het volgende moeten zien:

Footer positioneren

Het begint al ergens op te lijken, maar hebben nog een probleem: De scrollbalk. Onze footer staat nu netjes onderaan, maar nu hebben we zo'n vervelende scrollbalk waardoor de footer buiten beeld valt. Hoe komt dit? Heel simpel, we hebben de 'page'-div een 100% hoogte (dus de totale hoogte van het venster van de browser) gegeven, dus de hoogte van de footer komt nog eens bovenop die 100%. Het geheel is dus groter dan het venster van de browser. 

Om dit op te lossen geven we de footer-div een negatieve marge aan de bovenkant: margin-top:-50px;. De negatieve marge zorgt ervoor dat de 'footer'-div de 'page'-div een stukje gaat overlappen. Je trekt dus als het ware de footer omhoog, over de 'page'-div heen. 

(het laatste element in de html-pagina schuift standaard over de voorgaande element heen in geval van overlapping en het voorgaande element gaat dus standaard onder het element erna. Hetzelfde geldt voor elementen die in een ander element liggen, de binnenste ligt standaard bovenop).

De waarde van de negatieve marge moet hetzelfde zijn als de hoogte van de footer (in ons geval dus 50px), zodat de onderkant van de footer gelijk komt te staan met de onderkant van de 'page'-div.

de footer-tag in de CSS moet er nu zo uitzien, rest blijft ongewijzigd:

#footer {
    height:50px;
    margin-top:-50px;
}

Et voila! De scrollbalk is weg :-)

Nu gaan we testen of de footer ook onder de inhoud van onze pagina blijft staan, indien de inhoud langer is dan het venster. Om dit te kunnen zien zetten we wat tekst in de div 'pageInner'. Je HTML-pagina moet er nu vergelijkbaar uitzien:

<div id="page">
  <div id="pageInner">
    <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
    Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque
    penatibus et magnis dis parturient montes, nascetur ridiculus mus.
    Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem.
    Nulla consequat massa quis enim. Donec pede justo, fringilla vel,
    aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut,
    imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede
    mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum
    semper nisi. Aenean vulputate eleifend tellus.</p>
  </div><!-- /pageInner -->
</div><!-- /page -->

<div id="footer">
  <div id="footerInner">
    Dit is de footer
  </div><!-- /footerInner -->
</div><!-- /footer --> 

Eens kijken wat we nu in de browser zien:

Footer positioneren

Okeeeeee! Dat lijkt dus helemaal nergens op: De scrollbalk is weer terug, we zien ineens weer een blauwe rand bovenin en de footer loopt gewoon dwars door de inhoud van de 'pageInner'-div heen. Op dit punt gaat duidelijk worden wat de divs 'pageInner' en 'footerInner' voor ons doen. Wat dan? Ga ik zo uitleggen, eerst de oplossing.

De oplossing is slechts 1 eigenschap, die we aan de div 'pageInner' gaan mee geven, namelijk 'float:left;'.

De totale CSS moet er nu zo uitzien:

html, body {
    background-color:aqua;
    height:100%;
    margin:0;
    padding:0;
}

#page {
    background-color:lime;
    min-height:100%;
}

#pageInner {
    float:left;
}

#footer {
    height:50px;
    margin-top:-50px;
}

#footerInner {
    background-color:fuchsia;
    float:left;
    width:100%;
    height:50px;
}

En zie het resultaat:

Footer positioneren
Inhoud korter dan het browser-venster
Footer positioneren
Inhoud langer dan het browser-venster

Doe met je browser of met de inhoud wat je wilt, die footer staat altijd op de goede plaats!

Nu dan de verklaring van het waarom betreffende de divs 'pageInner' en 'footerInner'. Ik begin maar meteen met het vernietigen van alle magie: De footer staat helemaal niet netjes onder de rest van de pagina, maar gewoon altijd onderaan het browser-venster. Geef in je code de div 'footer' maar eens een achtergrondkleur en zie wat er gebeurt als de inhoud langer word dan het browser-venster ;-)

De uitleg:

De html-tag heeft een hoogte van 100%. Dat is, omdat html het hoogste element is en dus geen parent heeft, de totale hoogte van het browser-venster. De body heeft ook een hoogte van 100%. Dat is dus de totale hoogte van de parent en de parent is de html-tag (welke even hoog is als het totale browser-venster, dus de body is dat ook). Dan de div 'page', ook een hoogte van 100% en de parent van 'page' is de body-tag. Kortom, ook de div 'page' is even hoog als het browser-venster.

Dan plakken we de div 'footer' er aan vast. de footer valt buiten de div 'page', dus de hoogte van 'footer' moet worden opgeteld bij de hoogte van 'page'. Juist daarom verdwijnt 'footer' dus buiten beeld en moet je scrollen om m te zien. Dat heffen we op met het negatieve marge aan de bovenkant van de div 'footer'. We geven 'footer' een hoogte en trekken die hoogte vervolgens weer van de margin-top af. De footer schuift nu een stukje voor de div 'page' en valt nu dus binnen de 100% die de div 'page' hoog is, in plaats van erbuiten. De scrollbalk is weg en de footer staat keurig onderaan de pagina.

Dit werkt, zo lang als de inhoud van de pagina korter is dan het browser-venster. Zodra de inhoud langer wordt, kan je het vergeten...

De divs 'page' past zich, door zijn procentuele hoogte, alleen aan aan zijn parent. Alle andere aspecten (zoals inhoud) worden daarbij genegeerd. Overschrijd de inhoud die 100% die we hebben ingesteld, dan is dat jammer maar helaas, 100% is 100%. De div 'footer' komt direct na 'page' en zal om die reden dus altijd worden beïnvloed door de afmeting van 'page'.

Op dit punt gaan de divs 'pageInner' en 'footerInner' ingrijpen. Waar 'page' zich dus niks aantrekt van eventuele inhoud en gewoon eigenwijs de maten van het venster blijft aanhouden (en 'footer' daarin meeneemt), hebben 'pageInner' en 'footerInner' geen procentuele hoogte en zijn niet afhankelijk van elkaar (aangezien er van beide kanten nog een parent tussen zit). Zij zullen zich juist aanpassen aan hun inhoud, of we kunnen een vaste hoogte geven (in pixels of EMs).

In ons geval hebben we 'footerInner' een vaste hoogte gegeven, namelijk 50 pixels. 'pageInner' hebben we geen hoogte gegeven en die hoogte wordt dus bepaald door de inhoud. Op die manier betekend meer inhoud, meer hoogte en andersom.

'pageInner' kan op deze wijze onbeperkt uitrekken, wat betekend dat hij op een gegeven moment de footer gaat tegenkomen. De div 'footer' is volledig afhankelijk van 'page' die 100% hoog is, waardoor de div 'footer' achter de div 'pageInner' zal schuiven. Om deze reden kan je de div 'footer' geen achtergrond-kleur of inhoud geven, want we willen natuurlijk helemaal niet zien dat de footer achter de inhoud schuift.

daar hebben we dus de div 'footerInner' voor nodig. Deze is, in tegenstelling tot zijn parent 'footer', niet afhankelijk van de div 'page'. Om deze reden zal hij de hoogte van 100% dus negeren en zal hij dus onder het laagste element plaatsnemen, ongeacht de hoogte van dat element.

Mooi he? ;-)

maandag 2 april 2012

Kolommen gelijk maken

Een veel voorkomend probleem in het webdesign is het probleem met ongelijke kolommen. De ene kolom bevat meer inhoud dat de andere en daardoor wordt deze langer dan de andere. Veel liever zou je willen zien dat de kolommen allemaal mooi gelijk zijn, nietwaar?

In deze blogpost ga ik uitleggen hoe je dat op kunt lossen, zonder CSS-hacks en zonder het cross-browser en de flexibiliteit uit het oog te verliezen. Ik laat hier een voorbeeld zien met 3 kolommen, maar het kan uiteraard ook met 2 of met meer dan 3 kolommen.

We beginnen met de HTML-code. Allereerst hebben we lege divs nodig die we om onze kolommen heen gaan zetten. De (Engelse) vakterm voor zo'n div is vaak 'container'. Voor iedere kolom hebben we een container-div nodig, dat zijn bij elkaar dus 3 container-divs. Ik geef deze 3 divs voor het gemak de id's 'container1', 'container2' en 'container3'. De container-divs komen in elkaar te staan, dus 'container1' staat in 'container2' en 'container2' weer in 'container3'. Deze container-divs zijn als het ware hulpstukken.

Verder hebben we de kolommen nodig waarin straks inhoud komt te staan. Ook dit zijn divs en die geef ik de id's 'column1', 'column2' en 'column3'. Deze divs komen echter niet in elkaar, maar los van elkaar in de HTML te staan. Onze HTML-code komt er dus zo uit te zien:

<div class="container3">
  <div class="container2">
    <div class="container1">
      <div class="column1">Kolom 1
      </div>

      <div class="column2">Kolom 2
      </div>

      &;lt;div class="column3">Kolom 3
      </div>
    </div>
  </div>
</div>

We gaan nu verder met de CSS. De eerste stap is het bepalen van de breedte van de container-divs. Dat doen we in procenten om onze website mooi flexibel te houden, ongeacht de schermresolutie van de bezoeker. Onze container-divs moeten allemaal 100% breed zijn om ons doel te bereiken. 100% is dus de volledige breedte van het bovenliggende object (In het geval van de binnenste container-divs is dit de container-div die om de betreffende container-div heen ligt, in het geval buitenste container-div is dit de body). In onze situatie zijn alle container-divs dus even breed, namelijk het hele scherm.

In de volgende stap maken we een begin met het positioneren van de container-divs. Om een element goed te kunnen positioneren moet je de CSS gaan vertellen waaraan het de positie van het element moet refereren. Dat doe je door middel van een 'float'. Een float bepaald de positie van een element ten opzichte van andere elementen. Als je divs in de HTML-code in elkaar plaatst, houd dat niet automatisch in dat de buitenste div zich aanpast aan de binnenste div. Wordt de binnenste div groter, dan blijft de buitenste gewoon zoals ie al was. Een float zorgt dat de buitenste div zich wel aanpast. Dit is wat we willen, dus we gaan als eerste onze container-divs een float geven:

.container3 {
    width:100%;
    float:left;
    background-color:blue;
}

.container2 {
    width:100%;
    float:left;
    background-color:yellow;
}

.container1 {
    width:100%;
    float:left;
    background-color:red;
}

In de CSS hebben we onze divs tevens een achtergrondkleur gegeven, zodat we goed kunnen zien wat er gebeurt als we verder gaan met de stappen in deze handleiding.

We hebben imiddels bereikt dat alle container-divs in elkaar staan, even breed zijn en de hoogte aannemen van de inhoud die we aan het einde van deze tutorial gaan toevoegen. In de browser ziet het er nu zo uit:

Kolommen even lang maken in CSS

We zijn duidelijk nog niet klaar. De container-divs zijn eigenlijk een trucje om de feitelijke kolommen allemaal even hoog te laten lijken. Een stukje gezichtsbedrog dus eigenlijk, want in werkelijkheid zijn de kolommen zelf helemaal niet gelijk en dat zullen ze ook nooit worden zolang je ze geen hoogte geeft (en we geven geen hoogte omdat we de hoogte automatisch willen aanpassen aan de hoogte van de inhoud).

De laatste stap in het positioneren van de container-divs is het geven van marges aan de zijkanten van de container-divs, waardoor ze elkaar deels gaan overlappen. Op deze manier zie je van iedere container-div een deel wel en een deel niet. Hiermee bereiken we het visuele effect van 3 gelijke kolommen (de container-divs zijn immers allemaal even hoog door de floats die we eerder gaven).

Om marges te kunnen geven, moeten we de container-divs eerst vertellen hoe ze zich moeten positioneren. Dan doen we door ze 'position:relative' mee te geven. Dit houd in dat het element zich positioneert in verhouding tot zijn normale positie. Als we dan een marge geven van 30%, dan weet de div dat hij 30% moet opschuiven ten opzichte van waar hij stond voordat we de marge gaven.

De marge zelf stellen we in door te zeggen 'right:30%' (30% kan ook een andere waarde zijn, naar wens). De div schuift nu 30% naar links, zodat er rechts van de div een ruimte ontstaat (de marge dus). Dit gaan we doen met de twee binnenste container-divs. De buitenste niet, want die moet zo ver mogelijk rechts blijven staan. De middelste container-div geven we een marge van 30%. Hierdoor wordt (aan de rechterkant) 30% van de buitenste container-div zichtbaar. De binnenste container-div geven we een marge van 40%. Hierdoor wordt (in het midden) 40% van de middelste container-div zichtbaar. We kunnen nu dus 30% van de buitenste container-div zien en 40% van de middelste container-div.

Nu zal je wellicht denken, als de breedte al 100% en je daar dan een marge bij op telt, dan worden je container-divs toch breder dan je scherm? Dat klopt. En daarom voegen we aan de buitenste container-div een 'overflow:hidden' toe. Deze zorgt ervoor dat alles wat uit steekt, onzichtbaar wordt.Op deze manier blijft het totaal 100% en zien we dus automatisch van de binnenste container-div 100% - 30% -40% = 30%.

.container3 {
   width:100%;
   float:left;
   background-color:blue;
   position:relative;
   overflow:hidden;
}

.container2 {
   width:100%;
   float:left;
   background-color:yellow;
   position:relative;
   right:30%;
}

.container1 {
   width:100%;
   float:left;
   background-color:red;
   position:relative;
   right:40%;
}

Na deze aanpassingen hebben we het volgende resultaat:

Kolommen even lang maken in CSS

Voor het oog hebben we nu 3 kolommen, die altijd allemaal even hoog zullen zijn, ongeacht de inhoud. Met de container-divs zijn we nu dus klaar.

Zoals je wellicht is opgevallen zijn de tekstjes die we in de kolommen hadden gezet, verdwenen. Dat komt omdat we met de kolommen zelf nog niets hebben gedaan. Daar zullen we nu dus mee verder gaan.

Als eerste gaan we een paar dingen herhalen die we zojuist ook met de container-divs hebben gedaan. We geven floats en zetten de position op 'relative'. Daarnaast heb geven we de kolommen een background-color zodat we precies kunnen zien wat we doen. We voegen de volgende code toe aan onze CSS:

.column1 {
    float:left;
    position:relative;
    background-color:lime;
}

.column2 {
    float:left;
    position:relative;
    background-color:aqua;
}

.column3 {
    float:left;
    position:relative;
    background-color:fuchsia;
}

Voor het oog is er nu nog niet zoveel gebeurt, behalve dat het geheel nog korter is geworden. We zien echter nog steeds onze kolommen niet terug.

De twee dingen die we nog moeten doen is het geven van een breedte aan de kolommen en het geven van marges om ze op de juiste plaats te laten verschijnen. De kolommen bevatten de feitelijke inhoud van de website, zoals teksten en plaatjes. De kolommen moeten dus de breedte krijgen die we met de container-divs al hebben gesimuleerd. Met andere woorden: De kolommen moeten precies in de gekleurde vakken gaan passen. Om de breedte van elke kolom te bepalen kijken we naar de ruimtes die we in de container-divs hebben gecreëerd.

We zien dan dat 'container2' een marge heeft aan de rechterkant van 30%, waardoor er dus 30% van 'container3' zichtbaar is. 'col3' moet dus 30% breed worden om in het zichtbare deel van 'container3' te passen.

'container1' heeft een marge aan de rechterkant van 40%, waardoor er 40% van 'container2' zichtbaar is. 'col2' moet dus een breedte krijgen van 40% om in 'container2' te passen.

De afmeting van 'col1' is het deel dat overblijft na aftrek van de eerdere 30 en 40%. Dat is dus 100-30-40= 30%. 'col1' moet dus 30% breed worden om in 'container1' te passen.

.column1 {
    float:left;
    position:relative;
    background-color:fuchsia;
    width:30%;
}

.column2 {
    float:left;
    position:relative;
    background-color:fuchsia;
    width:40%;
}

.column3 {
    float:left;
    position:relative;
    background-color:fuchsia;
    width:30%;

De kolommen hebben nu de juiste afmeting. Als je in de browser gaat kijken wat er is gebeurt kan je zien dat er nu een roze vlak met de tekst 'Kolom 3' staat, waar eerder het rode vak was. We schieten dus al op. Zie onderstaande afbeelding:

Kolommen even lang maken in CSS

Nu het laatste stukje: De marges. We zien nu maar 1 kolom (namelijk 'col3'), omdat we de kolommen nog niet op de goede plek hebben gezet. Dat gaan we nu doen en dan doen we op dezelfde manier als dat we eerder met de container-divs hebben gedaan, maar nu de andere kant op. We geven nu dus geen marges aan de rechterkant, maar juist aan de linkerkant.

Eigenlijk is het bepalen van de marges in dit geval heel simpel. De kolommen krijgen allemaal een marge van 70% aan de linkerkant. Ze staan namelijk al tegen elkaar aan (door de floats die we eerder hebben gegeven), dus we hoeven er alleen nog maar voor te zorgen dat ze allemaal opschuiven. Dat doen we door het totaal aan marges die we aan de rechterkant van de container-divs hebben gegeven, aan de linkerkant van iedere kolom te geven. Zo komen de marges van de container-divs, verrekend met de marges van de kolommen, dus weer op 0 en staat alles keurig op de goede plaats.

.column1 {
    float:left;
    position:relative;
    background-color:fuchsia;
    width:30%;
    left:70%;
}

.column2 {
    float:left;
    position:relative;
    background-color:fuchsia;
    width:40%;
    left:70%;
}

.column3 {
    float:left;
    position:relative;
    background-color:fuchsia;
    width:30%; 
    left:70%;
}

Resultaat:

Kolommen even lang maken in CSS

Zoals je waarschijnlijk is opgevallen, kunnen we nu de container-divs niet meer zien. Dat komt door de achtergrondkleur die we aan de kolommen hebben gegeven. Dat hebben we puur en alleen maar gedaan om te kunnen zien hoe de kolommen zich gedragen. We gaan de achtergrondkleuren bij de kolommen nu weer verwijderen, omdat het juist de bedoeling is dat de container-divs de achtergrondkleuren gaan verzorgen, zodat de kolommen altijd even hoog lijken. Je werk moet er nu zo uitzien:

Kolommen even lang maken in CSS

Probeer de kolommen nu maar eens de vullen met verschillende hoeveelheden tekst, en zie wat er gebeurt met de hoogte van de kolommen. Hier een voorbeeld:

Kolommen even lang maken in CSS

Toch is het nu nog niet helemaal zoals we het graag zouden willen zien. De text staat nu precies tegen de randen van de (zichtbare) kolommen aan en daar willen we natuurlijk liever wat ruimte tussen. Om dit voor elkaar te krijgen gaan we paddings gebruiken.

Ook met de paddings gaan we werken met procenten. Dit zorgt ervoor dat de paddings ook netjes 'meerekken' bij hogere resoluties. Paddings worden altijd berekend aan de hand van de breedte van het bovenliggende element. Dat geldt dus ook voor de top- en bottom-paddings. Op deze manier blijven de paddings aan alle kanten altijd mooi gelijk, ook als de kolom heel hoog wordt.

Het opgeven van maten in procenten houd altijd in dat je een percentage berekend van het bovenliggende element. Je totaal mag dus nooit (onbewust) boven de 100% uitkomen (lager mag wel), want dan zou het betreffende element groter worden dan zijn 'parent'. In ons geval is de parent van alle kolommen 'container1'. Deze is 100% breed en alle kolommen samen zijn ook 100% breed. Per kolom is de breedte dus kleiner, namelijk 30%, 40% en weer 30%.

We beginnen met 'col3'. Als we ruimte vrij willen maken voor de padding, moeten we dat dus aftrekken van de breedte van de kolom zelf, zodat het totaal van padding EN kolombreedte uitkomt op de 30% die 'col3' nu breed is (tevens het zichtbare deel van de groene container-div). Over de top- en bottom padding hoeven we ons geen zorgen te maken, want deze wordt automatisch hetzelfde als de left- en right padding.

We willen een padding van 1%. Dat moeten we aftrekken van de breedte van de kolom. Bedenk echter wel, dat er zowel aan de linker- als de rechterkant een padding van 1% komt. Totaal zal er dus sprake zijn van 2%. We moeten dus 2% van de breedte van de kolom aftrekken: 30% - 2% = 28%.

Deze stappen herhalen we voor kolom 1 en 2. De code ziet er nu als volgt uit:

.column1 {
    float:left;
    position:relative;
    width:28%;
    padding:1%;
    left:70%;
}

.column2 {
    float:left;
    position:relative;
    width:38%;
    padding:1%;
    left:70%;
}

.column3 {
    float:left;
    position:relative;
    width:28%; 
    padding:1%;
    left:70%;
}

Het resultaat moet er zo uitzien:

Kolommen even lang maken in CSS

Zoals je nu ziet is er een kleine ruimte ontstaan tussen te tekst en de randen van de kolommen. Het geheel oogt nu netjes en overzichtelijk.

Dat was het voor zover deze tutorial. Ik hoop dat je er wat aan hebt en ik zou het leuk vinden als je een reactie achterlaat met je mening over deze tutorial. Als er nog andere problemen zijn waar je tegen aan loopt hoor ik het ook graag. Wie weet kan ik daar ook een tutorial over schrijven.