Inloggen
Username:
Password:



Password vergeten?
Menu
Home
Forums
Wiki
Script Library
Forum tracker
RSS Feed
Sponsoren
Vacature plaatsen

Aanmelden
Huisregels
Vereniging

Adverteren
Disclaimer
Zoeken

In:
Aantal leden
PHPFreakz kent momenteel 50394 geregistreerde leden.
Opties
Printversie
Div's centreren
Div's centreren
door Bert ter Voert

Iets wat mijzelf en, gezien de regelmatig terugkerende vraag op de forums, velen met mij steeds weer bezighoud, is de vraag hoe toch een pagina zo uit te lijnen dat deze mooi in het midden van het scherm komt te staan. Ook bij veranderende resolutie. Ik geloof dat ik nu een zeer bevredigende oplossing heb, die zowel onder IE als onder Firefox goed werkt.
Ik ben tot deze oplossing gekomen door het doorspitten van de vele suggesties die hier (en elders) op de forums werden gedaan om dit probleem op te lossen. Ik wil dan ook niet spreken van mijn oplossing, maar van een oplossing die voor mij doet wat ik beoog: de inhoud mooi centreren op het beeldscherm.

Maar genoeg gepraat, laten we ons maar eens richten op die oplossing. We gebruiken CSS om de div in het midden te krijgen (en te houden!). Vaak wordt er gesproken van een soort container-div, die gecentreerd wordt en die de rest van de inhoud zal bevatten. Dit heeft echter als nadeel dat je alle andere div’s zult moeten nesten, en dat kan een heel werk zijn om die dan goed uitgelijnd te krijgen. Op de manier die ik zal bespreken is het nesten niet nodig, wat in mijn ogen een groot voordeel is.

Om te beginnen maken we een div die de hoogte en breedte heeft van de weer te geven inhoud (bijvoorbeeld width: 956px; height: 600px;) en kennen deze position: absloute toe. Deze hoeft uiteindelijk niet eens op de pagina te komen, maar kan gemakkelijk zijn tijdens de ontwerpfase (zeker als je ook nog een contrasterende rand opgeeft).
Vervolgens bepalen we het middelpunt van het scherm en maken dat tot linkerbovenhoek van onze div, door het volgende op te nemen in css: top: 50%; left: 50%;.

Tot nu toe hebben we dus de volgende css-code:

#werklaag {
    position: absolute;
    width: 956px;
    height: 600px;
    top: 50%;
    left: 50%;
}

Maar daarmee staat de div nog niet gecentreerd, zelfs verre van dat! Wat er nu nog moet gebeuren is de marge voor de linker- en bovenzijde bepalen en toevoegen. We hebben de linkerbovenhoek in het midden staan. Om de div als geheel in het midden te krijgen, doen we het volgende. De div moet de helft van zijn breedte naar links opschuiven en de helft van zijn hoogte omhoogschuiven. In ons voorbeeld dus de helft van 956 is 478px naar links en de helft van 600 is 300px naar boven.
Daarvoor gebruiken we in css margin-top en margin-left. Als we nu bovenstaande waardes gewoon zouden invullen (margin-top: 300px; margin-left: 478px;) en het resultaat bekijken, zouden we zien dat de div nog verder van het midden verwijderd is. Om het geheel de goede kant op te krijgen moeten we de negatieve waardes gebruiken.

De volledige css-code voor de juist gecentreerde div wordt dan dus als volgt:

#werklaag {
    position: absolute;
    width: 956px;
    height: 600px;
    top: 50%;
    left: 50%;
    margin-top: -300px;
    margin-left: -478px;
}

Nu hebben we ook de coördinaten voor de linkerbovenhoek van onze inhoud: -300px(top) bij -478px(left). We kunnen dus ook de coördinaten voor de rest van de inhoud gaan bepalen.
Stel dat we een div (50px/400px) willen plaatsen die als linkerbovenhoek 100px lager en 210px naar echts moet komen ten opzichte van de linkerbovenhoek van de inhoud. Wat zijn door dan de coördinaten van? 100 px lager wil zeggen dat de marge groter moet worden. We moeten de twee waardes dus optellen: -300 + 100 = -200px. Hetzelfde geldt voor het naar rechts verschuiven: -478 + 210 = -268px. Dit kan enigszins verwarrend lijken omdat we met negatieve getallen werken, maar een div met marge -268 staat wel degelijk verder naar rechts dan een div met marge -478.
De css-code voor deze div zou dan als volgt worden:

#laagx {
    position: absolute;
    width: 400px;
    height: 50px;
    top: 50%;
    left: 50%;
    margin-top: -200px;
    margin-left: -268px;
}

Door nu de combinatie van top en left op 50% en margin-top en margin-left te gebruiken, is het niet nodig om div’s te nesten om de gehele inhoud gecentreerd te krijgen en te houden. Mocht het toch nodig zijn om een div te nesten, dan krijgt deze geneste div natuurlijk position: relative; komen de coördinaten in top en left te staan en vervallen margin-top en margin-left.
Een voorbeeld:

In de body van de html-code staat het volgende:

        <div id="werklaag"></div>
        <div id="laagx">
            <div id="genest"></div>
        </div>

De css-code voor "werklaag" en voor "laagx" zijn zoals hierboven beschreven. De css-code voor "genest" wordt dan bijvoorbeeld als volgt:

#genest {
    position: relative;
    width: 200px;
    height: 40px;
    top: 5px;
    left: 20px;
}

Ik heb gemerkt dat, als je eenmaal een beetje gewend bent aan het werken met de negatieve getallen, ik in staat ben snel en met een grote vrijheid (zeker in combinatie met het gebruik van de z-index voor div’s) de layout voor voor een site te maken die mooi gecentreerd op het scherm staat en blijft staan, ook bij veranderende resolutie!

Nu werd ik echter op een punt attent gemaakt, dat een zwakke plek in deze aanpak naar voren bracht. Juist omdat de layout zo mooi gecentreerd blijft, zal bij het verkleinen van de resolutie een steeds groter deel van je inhoud onbereikbaar worden! De schuifbalk die onderaan het scherm zal verschijnen, geeft je wel toegang tot het rechterdeel van de inhoud, maar niet tot het uiterste linkerdeel. En, geef toe, dat is uitermate vervelend als daar nu juist de navigatie voor je site te vinden is.
De navigatie naar de rechterkant verplaatsen is wel erg kort door de bocht en doet verder ook niet echt iets aan het probleem. Dus dan maar weer terug naar de tekentafel en het geheel nog eens goed overdenken.

Over horizontaal uitlijnen is volop informatie te vinden op het net, maar als je gaat zoeken naar verticaal uitlijnen, dan is die informatie toch een stuk schaarser. Hier volgt nu wat ik zelf de meest elegante oplossing vind van alle suggesties die ik tijdens mijn zoektocht tegengekomen ben.

De aanbevolen manier om de horizontale centrering tot stand te brengen is de linker- en rechtermarge op auto te zetten. Dus als we dan weer even uitgaan van de werklaag (zie eerder in dit artikel), dan hebben we nu:

#werklaag {
    margin-left: auto;
    margin-right: auto;
}

Dit werkt prima in de meeste browsers die CSS2 ondersteunen, maar natuurlijk is er een uitzondering. IE5 voor WIN (het zal eens niet zo zijn…) kan hier niet mee overweg. Nu heb ik allerlei manieren gezien om dit aan te pakken, maar het blijkt vrij simpel op te lossen. Daarvoor maken we gebruik van een andere ‘rariteit’ van IE5, namelijk de manier waarop IE5 het "text-align" attribuut toepast op blokelementen. Door nu de CSS-code text-align: center; toe te kennen aan het element dat #werklaag bevat (aan de body dus) wordt de div ook in IE5 horizontaal gecentreerd. Dat geeft in CSS-code dus het volgende:

body {
    text-align: center;
}

#werklaag {
    margin-left: auto;
    margin-right: auto;
}

BELANGRIJK: omdat het attribuut "text-align" overgeërfd wordt, zul je dit attribuut expliciet moeten declareren in de div’s als je niet wilt dat alle inhoud gecentreerd wordt.

Dit is de horizontale centrering. Dan nu over naar de verticale. Zoals ik al zei, daar is heel wat minder informatie over te vinden. Dus ben ik zelf maar wat aan het experimenteren gegaan. Gewoon de methode van top in procenten en dan een negatieve waarde voor margin-top blijkt niet te werken in combinatie met de nieuwe methode voor het horizontaal uitlijnen.
De oplossing die ik nu zal beschrijven is niet de meest perfecte, maar ik heb geprobeerd om het puur bij CSS te houden en geen combinatie met javascript te maken. Om de div verticaal uit te lijnen, geef ik een percentage in bij margin-top. De juiste waarde hiervan zal afhangen van de hoogte van #werklaag ten opzichte van de schermhoogte die je verwacht. Minpuntje van deze manier is, dat bij verkleinen van de schermhoogte de topmarge niet mee verandert. Pluspunt is dat wel de hele site bereikbaar blijft met de schuifbalken.

Dan tot slot de CSS-code in zijn geheel:

body {
    border: 0;
    padding: 0;
    text-align: center;
    height: 96%;
}

#werklaag {
    width: 955px;
    height: 600px;
    margin-left: auto;
    margin-right: auto;
    margin-top: 9%;
}

Hierbij is height: 96% om te voorkomen dat IE al meteen een schuifbalk laat zien. Overflow instellen op hidden is geen optie, omdat dan bij verkleining van het venster geen schuifbalk te zien zal zijn en een deel van de site dus onbereikbaar wordt. Verder heb ik de margins apart gedefinieerd, omdat sommige browsers blijkbaar moeite hebben met de notatie margin: 9% auto;

Ik hoop dat hiermee anderen ook vooruit kunnen en dat centreren van inhoud niet langer een bron van irritatie of frustratie hoeft te zijn.

Veel succes.

Bert

Commentaar op dit artikel
TitelDoorDatum
RE: Doe niet zo moeilijk M. B. 29-03-2009 16:40
Geen scrollbar? Danny (dw-designs.nl) 18-01-2009 21:59
RE: RE: RE: RE: waarom geen table Martin P (Verenigingslid) 08-01-2009 14:56
RE: RE: RE: RE: waarom geen table Enrico Pallazzo 19-12-2008 20:31
RE: RE: RE: waarom geen table Bart Golsteijn 13-11-2008 22:36
Text-align: center niet nodig voor >= IE6 Martin P (Verenigingslid) 19-09-2007 21:18
Simpelste oplossing David Schaap 26-07-2007 23:42
RE: Automatische hoogte? vespino (www.opolo.nl) 10-03-2007 12:39
volgens mij kan dat makkelijker Owen Hardy 01-03-2007 09:46
RE: RE: RE: Waarom gebruik je dat css? xfinx . 27-02-2007 15:08
RE: RE: Waarom gebruik je dat css? xfinx . 27-02-2007 15:06
Doe niet zo moeilijk Arjan Nijsink 17-02-2007 15:51
RE: Waarom gebruik je dat css? Wouter Nieuwstraten 31-01-2007 11:29
Waarom gebruik je dat css? Guardian of souls 19-01-2007 23:32
1 tabel maar dan in een lus? Franko Mulder (Verenigingslid) 09-01-2007 12:13
Kan 100x makkelijker Erik Nijland 02-01-2007 23:27
RE: Tabel Vincent de Lau (Verenigingslid) 03-11-2006 22:31
Tabel Marchello E 03-11-2006 04:00
RE: Zo eenvoudig mogelijk crossbrowser Tepel Streeltje 23-09-2006 20:25
Zo moeilijk is een beetje CSS toch niet Sirik [online] 04-09-2006 18:28
Zo eenvoudig mogelijk crossbrowser Erik Baan 11-07-2006 11:13
Dit gaat ook.... Jeroen Lambrichts 14-06-2006 19:34
de body veranderen om div's te centreren! cochuyt gino 01-06-2006 09:35
RE: Site centreren? Dan frames gebruiken! Dennis Wijnberg 19-05-2006 12:36
RE: Site centreren? Dan frames gebruiken! Ruben Nijveld 09-05-2006 18:23
Site centreren? Dan frames gebruiken! Wim Merks (Verenigingslid) 02-05-2006 23:09
@Menno Reen L. 30-04-2006 15:59
RE: RE: waarom zo moeilijk Menno Homan 26-04-2006 10:38
RE: waarom zo moeilijk Koen Punt 05-04-2006 13:28
RE: waarom geen table Stephan de Jong 02-04-2006 17:33
check dit.. oplossing voor all (mijn) probs Steven in OZ 17-03-2006 16:39
RE: Werkt niet op IE Mac... Tom Won 12-03-2006 18:04
hoogte automatisch [nav yupsie.nl] Bert ter Voert 02-03-2006 17:16
RE: RE: RE: RE: RE: RE: RE: RE: RE: Automatische h Bert ter Voert 02-03-2006 15:15
RE: RE: RE: RE: RE: RE: RE: RE: Automatische hoogt Yupsie .nl 02-03-2006 15:01
RE: RE: RE: RE: RE: RE: RE: Automatische hoogte? Bert ter Voert 02-03-2006 14:16
RE: RE: RE: RE: RE: RE: Automatische hoogte? Yupsie .nl 02-03-2006 13:12
RE: RE: RE: RE: RE: Automatische hoogte? Bert ter Voert 02-03-2006 09:47
RE: RE: RE: RE: Automatische hoogte? Yupsie .nl 02-03-2006 01:40
RE: RE: RE: Automatische hoogte? Yupsie .nl 02-03-2006 01:34
RE: RE: Automatische hoogte? Yupsie .nl 02-03-2006 00:50
RE: Automatische hoogte? Bert ter Voert 02-03-2006 00:08
Automatische hoogte? Yupsie .nl 01-03-2006 22:22
RE: RE: Ander probleem: Maximale breedte Join Deckhengst 25-02-2006 18:00
RE: Ander probleem: Maximale breedte Bert ter Voert 25-02-2006 17:39
Ander probleem: Maximale breedte Join Deckhengst 25-02-2006 17:31
antwoord op vragen Erik Minekus 25-02-2006 12:48
RE: RE: RE: RE: RE: waarom geen table Gillis Dnepropetrov 24-02-2006 22:03
RE: RE: RE: RE: waarom geen table D Vivendi 24-02-2006 13:42
tables frames out of date Gillis Dnepropetrov 24-02-2006 12:27
Werkt niet op IE Mac... Frances de Waal 24-02-2006 10:08
RE: RE: RE: waarom geen table michel ypma 24-02-2006 01:15
Daarom geen table Ted van Geest 23-02-2006 11:05
RE: RE: waarom geen table Tamar Mansveld 23-02-2006 10:09
RE: RE: waarom geen table Jaap van Duyn 21-02-2006 15:20
RE: waarom geen table Erik Minekus 21-02-2006 14:28
RE: RE: RE: waarom zo moeilijk l0c4lh0st (127.0.0.1) 21-02-2006 09:26
RE: RE: RE: waarom zo moeilijk Edward Brüheim (Verenigingslid) 20-02-2006 08:02
RE: RE: waarom zo moeilijk Peter R (Verenigingslid) 19-02-2006 22:25
RE: waarom zo moeilijk Edward Brüheim (Verenigingslid) 19-02-2006 12:28
Goed artikel Yann Zeeuwe (Verenigingslid) 18-02-2006 13:00
RE: RE: waarom zo moeilijk Web- WaKKo 18-02-2006 10:15
waarom geen table D Vivendi 17-02-2006 09:36
RE: waarom zo moeilijk Gillis Dnepropetrov 10-02-2006 17:24
RE: waarom zo moeilijk Bert ter Voert 10-02-2006 13:17
waarom zo moeilijk Gillis Dnepropetrov 10-02-2006 12:38
Nou... ViTruS Sjoerd 08-02-2006 12:11
RE: RE: css Bruce Lee (Verenigingslid) 08-02-2006 07:33
RE: css l0c4lh0st (127.0.0.1) 07-02-2006 17:40
css Mr D 07-02-2006 16:36
RE: RE: Nut? l0c4lh0st (127.0.0.1) 07-02-2006 16:20
RE: Nut? Sirik [online] 07-02-2006 15:34
RE: Nut? Bert ter Voert 07-02-2006 14:40
Nut? l0c4lh0st (127.0.0.1) 07-02-2006 13:03
Recente topics
Website layout hu...
selecteer tekst t...
Weergaven form in...
Website Hulp gezocht
Refresh na invoeren.
Weeknummers selec...
jquery table sort...
Meerdere menu's i...
jQuery slide content
HTML SELECT met 2...
TCPDF geeft é nie...
session_id(); > b...
Nieuwe regel
Variabele analyseren
heleboel foutmeld...
Recente Wiki's
JavaScript: High Performance
MagicQuotes
Escapen
Datamanipulatie
RabbitVCS
Continuous integration
Apache Veilig Maken
Charactersets
Het Wiel Uitgevonden:Formulieren
XSD

Meer wiki ...
Recente Scripts
Unieke `random` n...
twitterPHP 0.1 (a...
CSS minifier
PINI - PHP >>INI<...
Sudoku [StateSolver]
base64 file encoder
Session class

Meer scripts ...
Gehost door
RedKnot Hosting