REDnet.nl
REDnet.nl
Creative Vision Interaction   [=] NederlandsSwitch to Nederlands Home
Articles
(0 comments) show comments CSS en SPAN - foutloos floaten in een DIV (Fr jun. 2nd, '06 at 23:27 pm) Sorry, this item is not available in English
Ik herinner me nog hoe alles in de TABLE dagen makkelijk was. Een header maken die links en rechts tekst heeft staan is ongeveer een standaardmethode geworden om gescheiden informatie te tonen in een header van één regeltje. En in de dagen dat rommelige td th tr table markup niet langer in de mode is, zijn DIV en SPAN je vriend. Maar dan moet je er wel mee kunnen omgaan.

DIV en SPAN zijn een fijne combo, en als je een maandje aan het markuppen bent leer je de mankementen van de belangrijke browsers wel kennen. Wanneer je dan wegens ver@$%plich4!@#tiH!gnen (ik ben allergisch voor dat woord en kan het niet meer tiepen) een poos aan het afkicken bent koelt deze browserkennis af en zijn alle onlogische fouten weer net zo irritant als de eerste keer dat je ze meemaakte.

Omdat het gebruiken van een links-rechts headertje zo elementair is en sommige browsers het verneuken zal ik het voor eens en altijd uitleggen zodat jij en ik het nooit meer hoeven te vergeten. Hoewel het imo toch echt een fout is, is het megasimpel te omzeilen, en toch was ik voor de tweede keer zo lang vol onbegrip aan het zoeken naar de reden van de frop dat ik me ervoor zou moeten schamen.

Genoeg gepraat. Neem deze code:

<html>
<head>
<title>REDnet.nl rules</title>
<style type="text/css">
div#bif {
border: 2px #00557f solid;
padding: 4px;
width: 200px;
height: 60px;
}

div#cif {
background-color: #00557f;
border: 1px #000000 solid;
}

span.links {
font-weight: bold;
}

span.rechts {
float: right;
font-size: 10px;
}
</style>
</head>
<body>

<div id="bif">
<div id="cif">
<span class="links">Links</span>
<span class="rechts">Rechts</span>
</div>
Zomaar een beetje tekst die onder de header komt te staan. Ja?
</div>

</body>
</html>
Een DTD zou netjes zijn maar heeft geen invloed op deze fout. Als je het natiept ziet het er wat anders uit omdat ik standaard werk in de REDnet CSS omgeving, maar dat is in feite ook irrelevant.

#bif is een tekstblok en ook irrelevant, maar zonder deze DIV zou de #cif DIV zo breed als het venster zijn en dat is niet handig voor de screenshots.
#cif is de header, een balkje waarin we links én rechts een stukje tekst willen hebben staan.
Check de SPAN CSS en markup, en je snapt precies de bedoeling.

Opera snapt het iig wel:

Opera 8.54
(De rechtertekst is een pixel te hoog, er moet een extra SPAN om deze tekst (zie dit artikel) om dit te fixen. Maar te veel irrelevante tags maakt het voorbeeld onoverzichtelijk.)

Maar Internet Explorer is het er niet mee eens:

Internet Explorer 6.0.2900

Ook Firefox doet liever moeilijk als het makkelijk kan:

Firefox 1.5.0.4
(En merk op hoe het dit maal Firefox is die een uitzondering maakt qua breedte van de elementen.)

Met een beetje geklooi zou je het compatibel kunnen krijgen, maar ik heb de (in dit geval slechte) eigenschap om dingen rationeel uit te gaan zitten denken. Hoe zouden malafide browsers denken?

Hmmm.. een DIV, ok, een leeg blok. Wat zit er in? Ah, een SPAN in de zelfde layer.
Alles zonder position- float- of layer-tag zit in de zelfde layer. De tweede SPAN is dus een andere layer.
een inline element dus. Verder geen child-elementen van deze DIV in de zelfde layer? Dan vul ik de regel als een block element. Volgende element in de DIV is een SPAN met een float: right. Het is dus een andere layer maar (stukje IE/FF logica) deze regel is bezet dus float ik de SPAN maar rechts op de volgende regel!

Je zou denken dat IE en FF van het W3C layerprincipe zijn afgestapt, omdat ze de tweede SPAN iets laten aantrekken van het BLOCK element. Alsof het in de zelfde layer zit.

Nu heb ik eens een pro-MS nerd horen zeggen dat IE de parent de ruimte die een element inneemt omvat als deze parent zelf ook float. Het nadeel is dat de parent van de parent dan ook moet floaten, anders omvat deze op zijn beurt zijn child niet meer, enzovoort. Dat levert wel onnodig werk, maar als het moet dan moet het. Nieuwe code:

div#cif {
background-color: #00557f;
border: 1px #000000 solid;
float: left;
}

div#bif {
border: 2px #00557f solid;
padding: 4px;
width: 200px;
height: 60px;
}

span.links {
font-weight: bold;
float: left;
}

span.rechts {
float: right;
height: 1em;
font-size: 10px;
}
Nu weet Internet Explorer er wel raad mee:

Internet Explorer 6.0.2900

En Firefox, steeds meer op IE lijkende dan vroeger:

Firefox 1.5.0.4

Maar Opera denkt nu '#cif is een float; een layer die niet kan weten hoe breed de parent op een andere layer is. Daarom maak ik hem maar zo breed als nodig om de childs erin te kunnen passen.'

Opera 8.54

Dit kan je natuurlijk oplossen door de DIV een width te geven:

div#cif {
background-color: #00557f;
border: 1px #000000 solid;
float: left;
width: 188px;
}

Opera 8.54
Nu werkt het wel, maar ik heb een hekel aan statische layouts (denk aan de strookjes in het midden van een 21 inch scherm) en een header met een vaste breedte is niet te gebruiken in een vloeibare layout. Het is dus niet in alle gevallen te gebruiken, werkt niet vlekkeloos en heeft potentie om uit te groeien tot een grotere rommel dan een TABLE markup. Vooral in een ingewikkeldere site (zoals deze) is het gewoon niet te doen, alles tot en met de überparent te laten floaten, wil de markup een beetje leesbaar blijven. Bovendien is dat af te raden omdat je site dan totaal onleesbaar wordt met oudere browsers.

Weer terug naar de eerste versie dus, en opnieuw denken. Waar was ik? Oja. Je zou denken dat IE en FF van het W3C layerprincipe zijn afgestapt, omdat ze de tweede SPAN iets laten aantrekken van het BLOCK element (de DIV parent). Alsof het in de zelfde layer zit.

Hmm.. je zou ze dus als eerste met de tweede SPAN moeten opschepen om hem rechts op de zelfde regel te krijgen, omdat de DIV dan nog leeg is. Draai dus je SPANs even om:

<span class="rechts">Rechts</span>
<span class="links">Links</span>
Opera vind het zo ook best:

Opera 8.54

Internet Explorer kan het nu ook:

Internet Explorer 6.0.2900

En Firefox ook:

Firefox 1.5.0.4

Wat denken de IE/FF maatjes nu?

Hmmm.. een DIV, ok, een leeg blok. Wat zit er in? Ah, een SPAN die rechts wil.
De SPAN wordt rechts in de DIV gezet. Maar nu wordt het opeens wel als een volwaardige layer gehanteerd, omdat de DIV blijkbaar nog leeg is:
Volgende element is een SPAN. Ok die zetten we netjes in de DIV. Verder geen child-elementen van deze DIV in de zelfde layer? Dan vul ik de regel als een block element.

Dit slaat nergens op. Elementen van verschillende layers zouden van nature elkaar niet in de weg moeten kunnen zitten, ongeacht de volgorde. Ratio is dus niet de manier! Tenzij je alleen aandacht voor Opera gebruikers hebt. Maar goed, het werkt wel.

DE TAGS DIE RECHTS FLOATEN MOETEN DUS GEWOON EERST, DAT IS ALLES.

Opera maakt de volgorde verder niet uit.
Home
Creative
Vision
Interaction
 
~Home~


Recent reactions
[13/11] Firefox versus Opera
[3/11] CSS en DIVs - gedoe
[22/12] Korn coverband
[14/5] Lost en de buggy leader
[10/1] J-Five - Modern Times
[7/2] Schijt aan deze buurt
[22/3]
[1/4] Wie heeft mijn tas meegenomen?
~Creative~


Parts
Red photoshed
Classics
RED @ RED
Interdimensionals
RED's Place 3
The Radon clan
RED's Place 2
~Vision~


Articles
[8/1] Windows 7, SSH daemons and Cygwin
[31/12] I'ma stick to Ubuntu, sorry!
[15/4] Rid your consoles- XBMC and Arcade Browser are here!
[5/2] Import those frickin' contacts on your Nokia N Series
[30/11] Onhandigheden en ambtenarij van de IB-Groep
Columns
[9/1] C1000
[3/4] Albert Heijn Klantenservice is een idiocratie
[11/3] What Really Boils My Blood II
[16/2] Je beste vriend de politie
[4/2] Kanker NS
~Interaction~


Guestbook
Post message
Contact