Laatst aangepast: .
Sitemap in de vorm van een boomstructuur met lijnen. Er worden geen afbeeldingen gebruikt.
Alles op deze site kan vrij worden gebruikt, met twee beperkingen:
* Je gebruikt het materiaal op deze site volledig op eigen risico. Het kan prima zijn dat er fouten in de hier verstrekte info zitten. Voor eventuele schade die door gebruik van materiaal van deze site ontstaat, in welke vorm dan ook, zijn www.css-voorbeelden.nl en medewerkers daarvan op geen enkele manier verantwoordelijk.
* Deze uitleg wordt regelmatig bijgewerkt. Het is daarom niet toegestaan deze uitleg op welke manier dan ook te verspreiden, zonder daarbij duidelijk te vermelden dat de uitleg afkomstig is van www.css-voorbeelden.nl en dat daar altijd de nieuwste versie is te vinden. Dit is om te voorkomen dat er verouderde versies worden verspreid.
Een link naar www.css-voorbeelden.nl wordt trouwens altijd op prijs gesteld.
Bij een echte sitemap zou je waarschijnlijk van elke ingang een link maken. Hier heb ik van een aantal ingangen geen link, maar een span gemaakt, zodat je ziet dat een gewone span ook werkt.
Het is vrijwel onmogelijk om deze sitemap boven een achtergrond-afbeelding te plaatsen, omdat delen van de achtergrond-afbeelding zullen wegvallen. Om bepaalde te lange lijntjes af te dekken, wordt gebruik gemaakt van spans in de kleur van de pagina. Deze zijn (vrijwel) onmogelijk precies goed neer te zetten. Zie verder bij Om die te lange ...
In tegenstelling tot de meeste andere voorbeelden zijn hier alle maten in px. Daardoor is de lettergrootte in Internet Explorer 6, 7 en 8 niet te veranderen, want die heeft daar de eenheid em voor nodig. Als je em neemt als eenheid, of 'n combinatie van px en em, dondert de hele structuur in elkaar bij 'n andere lettergrootte of zoomen.
De css voor deze sitemap bleek redelijk ingewikkeld te zijn, niet echt iets voor als je net met css begint. Het toevoegen of weghalen van ingangen uit de sitemap is vrij simpel. Alleen de css is ingewikkeld, de html niet echt.
Zonder css is deze sitemap gewoon 'n serie geneste <ul>'s. Voor spraakbrowsers en dergelijke levert deze constructie dus geen extra problemen op. Afhankelijk van programma en instellingen worden titels en/of schermtekst en/of diepte van de lijst voorgelezen.
Links in deze uitleg, vooral links naar andere sites, kunnen verouderd zijn. Op de pagina met links vind je steeds de meest recente links.
Alles op deze site is gemaakt op een systeem met Linux. Daarbij is vooral gebruik gemaakt van Quanta Plus, GIMP en Firefox met extensies. De pdf-bestanden zijn gemaakt met LibreOffice.
Vragen of opmerkingen? Fout gevonden? Ga naar het forum.
Iets gevonden waar je wat aan hebt? Mooi. Als je je waardering wilt uiten, maak dan een donatie over aan War Child Nederland, een organisatie die kinderen uit oorlogsgebieden helpt hun trauma's te verwerken. Of - nog beter - wordt donateur:
Een sitemap met lijntjes wordt meestal met behulp van plaatjes gemaakt. Dat is vaak weinig flexibel, omdat je meestal aan het monteren moet slaan als er iets verandert in de sitemap. Als je alleen borders en dergelijke gebruikt, veranderen die in principe gewoon mee met de sitemap.
In een sitemap die alleen uit css en html bestaat kun je relatief makkelijk ingangen toevoegen of weghalen, omdat de html relatief eenvoudig is.
De css daarentegen bleek nog 'n behoorlijke puzzel te zijn, maar die hoef je in principe maar één keer te maken. Daarna zal die in de regel niet ingrijpend meer veranderen.
In tegenstelling tot de meeste andere voorbeelden zijn alle maten hier in px en niet in em. Het bleek onmogelijk om met een combinatie van px en em een goede lay-out te maken, die in alle browsers hetzelfde resultaat gaf.
Dat betekent dat in Internet Explorer 6, 7 en 8 de lettergrootte niet kan worden veranderd. In Firefox en Safari kan de lettergrootte wel gewoon worden veranderd.
Zoomen werkt wel gewoon in alle browsers die dat kunnen, ook in Internet Explorer 7 en 8. Kleine (en bij Internet Explorer 7 grotere) onvolkomenheden bij zoomen staan bij Bekende problemen.
De sitemap is niets meer dan een serie ongeordende lijsten (<ul>). Elk witte vlak is een gewoon lijst-item <li> met een <a> of een span erin, die een witte achtergrondkleur en een randje heeft. Hoe dieper de lijst is genest, hoe kleiner het lijst-item en de inhoud daarvan zijn.
Twee <ul>'s met alleen de linker-border van de <ul>'s en de witte <a>'s en spans.
In de afbeelding hiernaast staan twee <ul>'s. Er zijn er meer, maar het principe is voor allemaal hetzelfde. De buitenste lijst heb ik even 'n blauwe achtergrond gegeven. Deze buitenste lijst zit zelf weer in de <li> 'Gecentreerd', en is dus zelf ook weer een sub-lijst. De lijst-items in deze blauwe lijst zijn 'Geen header', Meescrollende header' en 'Vaste header'.
Deze drie <li>'s hebben elk weer een sub-lijst, die hier roze is gekleurd. De eerste sub-lijst heeft alleen '013' als lijst-item, de tweede '003' en '061' en de derde '002' en '005'.
In elk lijst-item staat een <a> of een span met witte achtergrond en border. Om dit te kunnen doen zijn ze in een blok-element veranderd. Links van <a> of span is een marge, wat ruimte geeft om daar later een horizontaal lijntje neer te zetten.
De <ul>'s hebben links een border. Deze vormen de lange verticale lijnen van de sitemap. Dat de lijnen te lang zijn, corrigeer ik later.
De lijsten springen steeds iets in, waardoor de borders aan de linkerkant van de <ul>'s dus ook iets inspringen.
De <ul>'s hebben aan de bovenkant een kleine padding, waardoor de eerste <li> van de lijst iets lager komt te staan. Dit zorgt voor een kleine afstand tussen de eerste <li> van een sub-lijst en de <li> waarbinnen de sub-lijst staat. Op de afbeelding is dat onder andere tussen 'Geen header' (die bij de blauwe <ul> hoort) en het erboven staande 'Gecentreerd', en tussen '013' (dat bij de roze <ul> hoort) en het erboven staande 'Geen header'.
Ik gebruik hier padding en geen margin, omdat dan de verticale border aan de linkerkant van de <ul> doorloopt. Naast een margin zou de border niet doorlopen.
Door elke <li> aan de onderkant 'n kleine marge te geven, ontstaat een afstand tussen de <li>'s binnen dezelfde <ul>. Dat zijn op de afbeelding bijvoorbeeld '003' en '061'. Bovendien krijg ik nu ook 'n kleine afstand tussen bijvoorbeeld '013' uit de roze <ul> en het eronder staande 'Meescrollende header', dat bij de blauwe lijst hoort. Omdat 'Meescrollende header' niet de eerste <li> uit de blauwe <ul> is, had die nog geen ruimte aan de bovenkant gekregen en zou anders pal tegen '013' komen te staan.
Dezelfde afbeelding met nu ook de horizontale lijntjes erin getekend.
De <li>'s zijn relatief gepositioneerd. Voor elke <a> of <span> met een tekst (zoals 'Geen header' of '013') staat nog een span. Deze span is helemaal leeg en wordt alleen gebruikt voor de horizontale lijntjes. Dit horizontale lijntje is een border aan de onderkant van deze span.
De span wordt in een blok-element veranderd en door een combinatie van hoogte, breedte, padding, marge en absoluut positioneren kan ik het lijntje precies goed krijgen: horizontaal halverwege de <li>, tegen de border van de <a> of <span> met de tekst aan, en aan de andere kant tegen de border aan de linkerkant van de <ul>.
In de afbeelding hiernaast zijn de spans die voor de horizontale lijntjes zorgen even rood gekleurd. (In het echt zijn ze doorzichtig en dekken dan ook niet de verticale lijnen af.)
Nu is het enige wat nog moet gebeuren het wegwerken van de te lange verticale lijnen. Dat zijn borders bij de <ul>, dus die lopen door tot de onderkant van de <ul>. Ze moeten echter ophouden bij het onderste horizontale lijntje halverwege de laatste <li> uit de <ul>. Vooral als die laatste <li> een sub-lijst bevat, zoals bij de blauwe <ul> uit de afbeelding hierboven, is duidelijk te zien dat de lijn veel te lang is.
Nogmaals dezelfde afbeelding, nu met de 'afdeklijntjes' rood gekleurd.
Om die te lange verticale lijn weg te werken, komt er in elke onderste <li> van 'n lijst nog 'n extra lege span te staan. Deze span wordt drie px breed en krijgt dezelfde kleur als de achtergrond. In de afbeelding hiernaast heb ik hem rood gekleurd om hem zichtbaar te maken.
Deze span wordt absoluut gepositioneerd ten opzichte van de <li> waar hij in staat. De grote rode lijn linksonder hoort bij de <li> met de tekst 'Vaste header'. Hij wordt precies over het te lange deel van de verticale border van de <ul> gezet.
De span is 3 px breed, terwijl de border maar 1 px breed is. Het bleek namelijk dat bij zoomen de span anders af en toe precies naast de border wordt gezet, waardoor de te lange lijn zichtbaar wordt.
Hoewel je in het voorbeeld deze rode lijn niet ziet, is het deze lijn die het vrijwel onmogelijk maakt de sitemap boven 'n afbeelding te zetten. De in de afbeelding zichtbare rode lijnen zouden dan moeten bestaan uit een stukje van de afbeelding en exact op de juiste plaats moeten worden gezet. Dat is vrijwel onmogelijk voor elkaar te krijgen in alle browsers, en bij zoomen of 'n andere lettergrootte gaat 't hoe dan ook iets verschuiven en zou je dus 'n foeilelijke verschuiving binnen je afbeelding krijgen. Als de span gewoon de kleur van de pagina heeft, zie je zo'n verschuiving niet.
Het toevoegen van 'n nieuwe ingang gaat dus gewoon door het plaatsen van 'n gewone link in 'n gewoon lijst-item. Voor die link komt dan 'n lege span te staan voor het horizontale lijntje:
<li><span class="hoek"></span><a href="links.html" title="Links">Links</a></li>
Bij elk laatste lijst-item van een <ul> komt nog 'n extra lege span te staan voor het afdekken van de te lange verticale lijn:
<li><span class="hoek"><span class="onderste"></span><a href="links.html" title="Links">Links</a></li>
Het eerste deel van deze tekst is voor alle voorbeelden met links en dergelijke hetzelfde, het laatste deel (onder het kopje Speciaal bij dit voorbeeld) is speciaal voor dit voorbeeld.
De meeste mensen openen 'n link door erop te klikken. Er is echter 'n tweede manier: met behulp van de Tab-toets (sommige browsers gebruiken andere toetsen, maar het principe is hetzelfde). Met behulp van de Tab-toets kun je van link naar link 'springen'. Op welke link je staat, wordt door alle browsers aangegeven met een of ander kadertje rondom de link.
De link met het kadertje eromheen heeft focus. Dat wil zeggen dat je die link volgt als je op de Enter-toets drukt. In principe werkt dit precies hetzelfde als gewoon klikken op de link.
Als iemand geen muis wil of kan gebruiken, bijvoorbeeld door 'n handicap, is deze manier om 'n link te openen erg handig. Als de volgorde van de links in de code niet logisch is, kun je eventueel met behulp van tabindex
'n afwijkende volgorde van de links opgeven. De Tab-toets volgt dan die afwijkende volgorde.
Tot zover is er nauwelijks verschil tussen het gebruik van de Tab-toets of van de muis.
Als je echter extra dingen onder de link hebt gestopt, die pas gaan werken als je over de link hovert, is er wel 'n verschil. Je geeft dat aan met :hover
: als je over de link hovert. Met de Tab-toets alleen kun je niet over 'n link hoveren. Dus als er bijvoorbeeld 'n pop-up wordt geopend, zul je die niet zien als je de Tab-toets gebruik om naar 'n link te gaan.
Om dit op te lossen kun je op dezelfde manier als je :hover
gebruikt :focus
gebruiken: als de link focus heeft. Dat is dus als er 'n kadertje rondom de link staat en de link wordt gevolgd bij het indrukken van Enter.
Door dus a:hover, a:focus {...}
te gebruiken, opent bijvoorbeeld 'n pop-up ook als je de Tab-toets gebruikt. Maar er zitten 'n paar adders onder het gras.
* Naast :hover
en :focus
is er nog :active
. Deze laatste zou horen te werken als de muis wordt ingedrukt op de link. Dat werkt ook zo in alle browsers, behalve in Internet Explorer vóór versie 8. In haar onmetelijke wijsheid heeft Microsoft besloten af te wijken van de standaard: :active
werkt in oudere versies zoals :focus
hoort te werken, en :focus
werkt gewoon helemaal niet vóór versie 8. In alle andere browsers werken :focus
en :active
dus wel volgens de standaard, en met ingang van versie 8 van Internet Explorer houdt Microsoft zich ook eindelijk aan de standaard.
Dit betekent dat je niet kunt volstaan met a:hover, a:focus {...}
, maar dat je a:hover, a:focus, a:active {...}
moet gebruiken, want anders werkt het niet in oudere versies van Internet Explorer. Het zal nog jaren duren voor deze oude versies niet meer worden gebruikt, maar omdat Microsoft zich nu eindelijk ook aan de standaard houdt op dit punt, wordt :active
nu ook langzaamaan bruikbaar voor waar het voor is bedoeld.
* Belangrijke informatie moet je niet geven via :focus
of :active
, omdat dit niet werkt als css uit staat.
* Ten slotte kan 'n pop-up of zoiets gruwelijk in de weg komen te staan, bijvoorbeeld door de rest van de pagina af te dekken. Iemand die gewoon de muis kan gebruiken, verplaatst deze even en de pagina is weer zichtbaar. Iemand die moeite heeft met het gebruik van de muis, heeft deze mogelijkheid niet of minder. Als je buiten de link en de daarbij horende pop-up en dergelijke klikt, sluit deze weliswaar, maar dat is nu juist het probleem: mensen die de muis niet goed kunnen gebruiken, hebben nou net daar problemen mee.
Als je via de terug-toets teruggaat naar de vorige pagina, heeft de link waar je vandaan kwam nog steeds focus, en dus staan pop-up en dergelijke ook nog open. Wat ook heel storend kan zijn als andere delen van de pagina daardoor niet te zien zijn. Op het moment dat ik dit schreef, werkte de terug-toets bij alle browsers zo, met uitzondering van Google Chrome. Maar 't kan best zijn dat Google Chrome het inmiddels ook doet, of 'n andere juist weer niet, want dit schijnt nogal te veranderen.
Om al deze redenen is het goed je even af te vragen of de voordelen van 'n pop-up en dergelijke wel opwegen tegen de nadelen. Ik zet zelf mijn eigen overwegingen bij elk voorbeeld steeds even erbij. Wat natuurlijk niet wil zeggen dat je daar geen andere mening over zou kunnen hebben.
In dit voorbeeld verandert alleen de kleur van het lijst-item in de lijst. Dat levert dus geen enkel probleem op voor de rest van de pagina. Daarom gebruik ik hier :hover
, :focus
en :active
alle drie.
De code die te maken heeft met de basis van dit voorbeeld is rood
gekleurd. Alle voor dit voorbeeld niet-essentiële code is bruin
.
Deze uitleg hoort bij het voorbeeld dat in de download zit. Het voorbeeld uit de download verschilt iets van het voorbeeld hier op de site. In de download ontbreken bijvoorbeeld de witte vlakken met de links. Ook in de kopregels zit vaak wat verschil. Daarnaast kunnen er nog andere (meestal kleine) verschillen zijn.
Als je deze uitleg leest naast de broncode van het voorbeeld op de site, kan het dus bijvoorbeeld zijn dat 'n h1 uit de css bij 'n <h2> uit de html hoort. Maar het gaat niet om hele grote, fundamentele afwijkingen.
Als je dit lastig vindt, downloadt dan de hele handel (ga terug naar het voorbeeld en kies daar voor downloaden). In de download zit 'n voorbeeld dat wel naadloos aansluit op de uitleg in de download.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="nl" lang="nl">
Een document moet met een doctype beginnen om weergaveverschillen tussen browsers te voorkomen. Zonder doctype is de kans op verschillende (en soms volkomen verkeerde) weergave tussen verschillende browsers heel erg groot.
Geldige doctypes vind je op www.w3.org/QA/2002/04/valid-dtd-list.
Gebruik het volledige doctype, inclusief de url, anders werkt het niet goed.
De toevoeging achter <html
hierboven hoort bij het gekozen doctype.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Zorgt dat de browser letters met accenten en dergelijke goed kan weergeven. Als je als doctype html hebt gekozen, moet je niet eindigen op />
, maar op >
(dit geldt voor alles in de head wat eindigt op />
).
utf-8 is de beste charset (tekenset), omdat deze alle talen van de wereld (en nog heel veel andere extra tekens) bestrijkt, maar toch niet meer ruimte inneemt voor de code dan nodig is. Als je utf-8 gebruikt, hoef je veel minder entiteiten (ä
en dergelijke) te gebruiken, maar kun je bijvoorbeeld gewoon ä gebruiken.
Deze regel moet zo hoog mogelijk komen te staan, als eerste regel binnen de head, omdat hij anders door sommige browsers niet wordt gelezen.
<link rel="stylesheet" type="text/css" href="../../css/naam-van-stylesheet.css" />
<!--Instellingen voor Internet Explorer -->
<!--[if IE]>
<link rel="stylesheet" type="text/css" href="../../css/naam-van-ie-stylesheet.css">
<![endif]-->
Dit stukje code heeft in dit voorbeeldbestand geen enkel nut. Normaal genomen is het een verwijzing naar een extern stylesheet, waarin de style staat. In dit voorbeeld verwijst de href
naar een niet bestaand bestand.
De bedoeling is dat je bovenstaande regels aanpast voor je eigen bestand. De hele style, die onder deze regels in de <head> staat, wordt dan in het externe bestand geplaatst waar de href
naar verwijst. In dat bestand komt de style precies zo te staan zoals die nu in de <head> staat. Het bestand moet eindigen op .css.
Voordeel van een externe stylesheet is onder andere, dat deze geldig is voor alle pagina's waaraan deze is gelinkt. 'n Verandering in de lay-out hoef je dan maar op één enkele centrale plek te aan te brengen.
In die externe stylesheet zet je alles wat in dit voorbeeld tussen <style type="text/css">
en </style>
staat (zonder deze begin- en eindregel).
De bovenste regel is voor de algemene stylesheet, geldig voor alle browsers. Dit is gewoon 'n link die naar 'n bestand elders verwijst, waar de css in staat. Op de plaats van "../../css/naam-van-stylesheet.css"
moet je pad naar en naam van jouw stylesheet invullen.
Het eigenaardige stukje code daaronder heet een 'conditional comment' en wordt door alle browsers gezien als commentaar, omdat het tussen <!--
en -->
staat. Maar Internet Explorer herkent het, door de extra toevoegingen, als speciaal voor Internet Explorer bedoeld en zal het dus uitvoeren. Het is veiliger dan een zogenaamde 'hack', waarbij vaak gebruik wordt gemaakt van 'n fout (bug) in de browser. Dit is opzettelijk aangebracht door Microsoft en zal dus blijven bestaan, terwijl 'n bug gerepareerd kan worden. Op deze manier kun je 'n stylesheet alleen voor Internet Explorer opnemen.
Dit stukje geldt voor alle versies van Internet Explorer, maar je kunt het ook per versie aangeven.
De link verwijst naar een aparte stylesheet voor Internet Explorer, waarin je css speciaal voor die browser zet. Op de plaats van "../../css-naam-van-ie-stylesheet.css"
moet je pad naar en naam van je stylesheet voor Internet Explorer invullen.
De link naar het aparte stylesheet voor Internet Explorer moet ná de link naar het algemene stylesheet komen, omdat de opdrachten voor Internet Explorer dan over die uit het algemene stylesheet heen gaan.
<style type="text/css">
Voor de duidelijkheid staat de style hier in het bestand zelf, maar het is beter deze in een apart stylesheet te zetten, zoals hierboven beschreven. In die stylesheet komt alles wat tussen bovenstaande regel en </style>
staat.
Technisch gezien is er geen enkel bezwaar om het in die stylesheet te zetten met dezelfde vreselijke lay-out als die ik in dit voorbeeld gebruik. Maar als je dat doet, garandeer ik je hele grote problemen omdat het volstrekt onoverzichtelijk is. Ik gebruik alleen deze lay-out omdat het anders veel te veel regels worden.
Voorbeeld van 'n goede lay-out in je css:
div#header-buiten
{
position: absolute;
right: 16px;
width: 100%;
height: 120px;
background: yellow;
}
div#header-binnen
{
margin-left: 16px;
height: 120px;
text-align: center;
}
body
margin: 0; padding: 0;
Slim om te doen, is soms wat afwijkend in verschillende browsers.
font-family: Arial, Helvetica, sans-serif;
Lettersoort. Als er geen Arial is, wordt gezocht naar Helvetica. Als dat er ook niet is in ieder geval 'n lettersoort zonder schreef (dwarsstreepjes).
font-size: 110%;
Iets groter dan standaard. 't Zal de leeftijd zijn, maar ik vind de standaardgrootte wat te klein.
Ik gebruik hier % als eenheid, en voor alle andere lettergroottes gebruik ik em. Dat komt door Internet Explorer. Als ik als maateenheid iets als px neem, kunnen gebruikers van Internet Explorer de lettergrootte niet veranderen.
Maar als ik overal em neem als maateenheid, wat dan voor de hand zou liggen, kom ik in de problemen met versies van Internet Explorer ouder dan versie 8. De stappen van de verkleining of vergroting zijn in die browsers zo groot, dat 't gelijk onleesbaar klein of absurd groot is.
Als je nou echter bij body geen em gebruikt (font-size: 1.1em;
zou hetzelfde moeten zijn als font-size: 110%;
), dan is de lettergrootte in Internet Explorer te veranderen, en in oudere versies dan versie 8 zijn de tussenstappen teruggebracht tot normale grootte.
Dit werkt ook als je als lettergrootte 100% invult. Dat heeft geen enkele invloed op de lettergrootte, behalve dus dat de tussenstappen in oudere versies nu normaal werken.
In Internet Explorer 8 is deze bug eindelijk gerepareerd. Aangezien we waarschijnlijk nog vele jaren met oudere versies dan Internet Explorer 8 zitten opgescheept, zal deze truc ook nog jaren moeten worden toegepast.
Hoewel in dit voorbeeld verder geen em als eenheid wordt gebruikt, heb ik dit toch laten staan. Het is 'n weinig bekende truc om deze bug in Internet Explorer 6 en 7 te omzeilen, en mogelijk wordt buiten de sitemap wel de eenheid em gebruikt.
color: black;
Zwarte letter.
background: #ff9;
Achtergrondkleurtje.
div#content
De div met id="content". De div waar alles in staat.
Omdat deze div geen breedte heeft gekregen, vult hij automatisch de volle breedte van zijn ouder. Dat is hier het venster van de browser. Wil je de breedte van de sitemap beperken, dan kun je dat het best hier doen, want dan neem je alle kinderen gelijk mee.
margin: 20px 0 20px 20px;
Boven 20 px marge, rechts geen, onder en links 20 px marge. De marge aan de onderkant is omdat de sitemap anders pal tegen de onderkant van het venster van de browser komt te staan.
padding: 0 0 50px;
Omdat voor links geen waarde is ingevuld, krijgt links automatisch dezelfde waarde als rechts. Hier staat dus eigenlijk 0 0 50px 0;
in de volgorde boven - rechts - onder - links. Alleen aan de onderkant 50 px padding. Dat is omdat Internet Explorer 6 en 7 de marge, zoals die hier gelijk boven is opgegeven, negeren. En omdat 't verder niet van belang is voor dit voorbeeld, los ik 't op deze manier (lekker slordig) op.
ul
Alle ongeordende lijsten.
Omdat een <ul> een blok-element is, vult het automatisch de volle breedte van zijn ouder. Dat is in dit voorbeeld div#content
.
margin: 0; padding: 10px 0 0;
Verschillende browsers hebben nogal verschillende ideeën over marges en padding bij lijsten. Door ze hier zelf op te geven, zorg ik dat ze in alle browsers hetzelfde zijn.
De marge haal ik helemaal weg.
Omdat bij padding geen waarde voor links is opgegeven, krijgt dit automatisch dezelfde waarde als rechts. Hier staat dus eigenlijk 10px 0 0 0;
in de volgorde boven - rechts - onder - links.
10 px afstand tussen bovenste <li> en <li> waar de <ul> in staat.
Door elke <ul> een padding aan de bovenkant te geven, komen de lijst-items iets lager te liggen.
De <ul>'s krijgen aan de linkerkant een border, dat is de verticale zwarte lijn. Deze border loopt gewoon door naast de padding en steekt dus boven het bovenste lijst-item uit. Als ik een margin had genomen in plaats van een padding, zou de border niet doorlopen naast de margin.
In de afbeelding hierboven heeft 'Home' een eigen sub-lijst. Het eerste lijst-item in die sub-lijst is 'Links'. Omdat de sub-lijst aan de bovenkant 10 px padding heeft, staat 'Links' dus 10 px onder de bovenkant van de sub-lijst, en dus ook 10 px onder 'Home'.
list-style: none;
De gebruikelijke bolletjes of zo van 'n <ul> zijn hier niet welkom.
li
Alle lijst-items.
Omdat een <li> een blok-element is, wordt hij automatisch even hoog als nodig is om de inhoud ervan weer te kunnen geven. Hij wordt even breed als zijn ouder, dus de <ul> waar hij in zit. En omdat die ook geen breedte heeft, vult die ook weer de volle breedte van zijn ouder: div#content
.
position: relative;
Door ze een relatieve positie te geven, kan ik kinderen van de <li>'s positioneren ten opzichte van de <li>'s. Dat kan alleen maar als de <li> zelf een positie heeft, ook al vul ik daar verder niets bij in.
margin-bottom: 8px;
De marge aan de onderkant van de <li>'s zorgt voor afstand tussen de <li>'s.
Met de padding aan de bovenkant bij ul heb ik gezorgd voor afstand tussen de bovenste <li> en de eerste <li> van een eventueel daarin zittende sub-lijst. Tussen de <li>'s binnen dezelfde <ul> heb ik echter nog geen afstand. Daarom geef ik elke <li> 8 px marge aan de onderkant, zodat ze iets van elkaar af komen te staan.
ul a, ul span.kopje
Alle links en alle spans met class="kopje" binnen een <ul>. Hier geef ik de eigenschappen op die voor alle <a>'s en spans met class="kopje" hetzelfde zijn. De instellingen die voor de diverse <ul>'s verschillen geef ik later apart op.
Binnen de <a>'s staan de teksten die werken als een link. Enkele teksten zijn geen link, maar die moet ik wel kunnen opmaken, dus die zet ik binnen een span.kopje
. <a> en span zien er hetzelfde uit, het enige verschil is dat de een als 'n link werkt en de ander niet.
display: block;
Een <a> en een span zijn van zichzelf een inline-element. Door er een blok-element van te maken kan ik eigenschappen als breedte gebruiken.
width: 360px;
Breedte 360 px. Omdat het nu blok-elementen zijn, zouden ze anders de volle breedte van hun ouder (de <li> waar ze in staan) vullen.
border: #999 solid 1px;
De <li> waar de <a> binnen ligt is even zichtbaar gemaakt door hem roze te kleuren.
Donkergrijs randje rondom de link. Ik geef dat hier op en niet bij de <li> waar de link in staat, omdat die <li> geen breedte heeft en dus de volle breedte van zijn ouder vult. Bovendien moet de <li> even hoog zijn als de er eventueel in staande <ul>, dus die wordt veel te hoog. Bij de <a> speelt dat allemaal niet.
Het is ook overzichtelijker om breedte, border, enz. allemaal hier op te geven, want dan staat het op één plaats bij elkaar.
padding-left: 5px;
Kleine afstand tussen het begin van de tekst en de voorkant van de link. Omdat de link binnen een <li> staat, heb ik nu gelijk wat afstand tussen het begin van de tekst en de voorkant van de <li>.
text-decoration: none;
De gebruikelijke onderstreping van 'n link wil ik hier niet hebben. Hoewel dit alleen voor de <a> nodig is en niet voor de span, kan het verder geen enkel kwaad voor de span. En door <a> en span te combineren spaar ik css uit.
color: black;
En ook de normale kleur van 'n link wil ik niet. Gewoon zwarte tekst.
background: white;
Witte achtergrond.
font-size: 25px;
In tegenstelling tot vrijwel alle andere voorbeelden geef ik de lettergrootte niet in em op. 'n Combinatie van px en em blijkt niet goed te werken, er ontstaan te lange lijnen en gaten.
Dit betekent wel dat je in Internet Explorer de lettergrootte niet kunt veranderen. Zoomen werkt wel gewoon.
line-height: 34px;
Ik geef geen hoogte op, alleen een regelhoogte. Omdat de <a> in een blok-element is veranderd, wordt het automatisch even hoog als de regelhoogte. Door een regelhoogte te gebruiken en geen gewone hoogte komt de tekst automatisch verticaal in het midden te staan.
ul.een a:hover, ul.een a:focus, ul.een a:active
Als ik over een link binnen een <ul> met class="een". hover, of als deze actief is of focus heeft.
Omdat álle <a>'s, ook die binnen de dieper geneste <ul>'s, ook binnen ul.een
staan, geldt dit voor álle <a>'s, ook die binnen de dieper geneste <ul>'s.
Wat dit precies betekent en waarom :focus
én :active
worden gebruikt staat bij Alleen :hover of :hover, :focus en :active?.
border: black solid 1px;
De links hebben een donkergrijze border. Verander deze in een zwarte.
background: #ccc;
En verander de witte achtergrond in donkergrijs.
ul span.onderste
De spans met class="onderste" binnen de <ul>'s. Dit zijn de spans waar de 'streepjes' in staan die de te lange verticale lijnen afdekken. Alleen elke laatste <li> van elke <ul> krijgt deze extra span, omdat alleen het laatste stuk van de verticale lijn moet worden afgedekt.
Hier staan de instellingen die voor al deze spans gelden. Voor de spans die in dieper geneste lijsten staan volgen verderop kleine aanpassingen.
position: absolute;
Absoluut positioneren zodat ik ze kan neerzetten waar ik wil. Er wordt gepositioneerd ten opzichte van de eerste ouder met een positie, dat is hier de <li> waar ze in staan. (Op de afbeelding hieronder is de ouder van de rode span de <li> met 'Plat'.)
Een span is van zichzelf een inline-element. Door haar absoluut te positioneren, verandert ze in een blok-element, waardoor ik eigenschappen als breedte kan gebruiken.
top: 14px;
Door uit te proberen blijkt dit de hoogte te zijn, waarbij de span precies op de juiste plaats komt te staan: tegen het horizontale lijntje aan.
left: -2px;
De span is hier rood gemaakt om hem zichtbaar te maken. Onder de rode span staat de te lange verticale lijn. In werkelijkheid heeft de span dezelfde kleur als de pagina.
De span is 3 px breed. Hij moet precies over het te lange deel van de verticale lijn (de border aan de linkerkant van de <ul>) komen te staan om die af te dekken. Deze border is 1 px breed. De span steekt dus links en rechts 1 px uit.
Als ik de span maar 1 px breed maak, wordt hij in sommige browsers bij bepaalde zoom-standen net links of rechts van de te lange border neergezet, waardoor hij deze dus niet afdekt.
bottom: 0;
Binnen de <li> met 'Plat' staat weer een <ul> met hier op de afbeelding vijf lijst-items. De <li> 'Plat' wordt automatisch precies zo hoog als nodig is om die <ul> erin te kunnen zetten.
Daardoor loopt de <ul> waar de <li> met 'Plat' een lijst-item van is automatisch ook even ver naar beneden door als de <li> met 'Plat', want anders zou deze niet in de <ul> passen.
En daardoor loopt de border aan de linkerkant van de <ul>, de verticale lijn, ook weer even ver naar beneden door als de <li> met 'Plat'. Dus moet de afdekkende span ook tot de onderkant van de <li> met 'Plat' lopen.
width: 3px;
3 px breed. Voor het waarom van deze breedte zie De span is 3 px breed...
background: #ff9;
Zelfde kleur als de achtergrond van de pagina, zodat de span onzichtbaar is.
Omdat de span niet doorzichtig is, kun je deze constructie vrijwel onmogelijk boven 'n achtergrond-afbeelding zetten. Daarvoor zou je 'n stukje van de afbeelding in de span moeten zetten en die span dan precies op de juiste plaats moeten positioneren. Dat is vrijwel onmogelijk in alle browsers goed te krijgen. En als 't al zou lukken, gaat 't gelijk mis bij 'n andere lettergrootte en/of zoomen. Waardoor je dus 'n stukje afbeelding krijgt dat iets is verplaatst ten opzichte van de rest van de afbeelding, wat natuurlijk foeilelijk is.
ul.twee
De <ul>'s met class="twee". Dit is de eerste geneste <ul>, de <ul> van het tweede niveau.
margin-left: 20px;
ul.een
is blauw en ul.twee
is roze gemaakt om ze zichtbaar te maken.
Deze geneste <ul> staat binnen een <li> van de hogere <ul>: op de afbeelding hiernaast staat de roze ul.twee
binnen de <li> met 'Home', die bij de blauwe ul.een
hoort.
De marge van 20 px schuift de hele roze <ul> naar rechts, waardoor ook de border aan de linkerkant van de <ul> mee naar rechts schuift en er wat ruimte ontstaat.
border-left: black solid 1px;
Zwarte lijn aan de linkerkant. Deze borders links zorgen voor de langere verticale zwarte lijnen. Op de afbeelding hierboven is het de verticale zwarte lijn aan de linkerkant van de roze ul.twee
.
ul.twee span.hoek
De spans met class="hoek" die binnen een <ul> met class="twee" liggen. Omdat spans met class="hoek" die binnen een dieper geneste <ul> liggen ook altijd binnen ul.twee
liggen, gelden deze instellingen voor álle spans met class="hoek". Verderop breng ik kleine correcties aan voor de spans die in dieper geneste <ul>'s liggen.
Deze spans zorgen voor het horizontale lijntje tussen de witte vlakken met tekst en de verticale lijn. (Oorspronkelijk zorgde deze span voor een hoek, vandaar de class-naam 'hoek'...)
De spans zijn hier even rood gemaakt. Normaal genomen zijn ze doorzichtig en dekken de verticale lijnen niet af.
In de afbeelding hiernaast is de roze balk een <li> uit ul.drie
, de bruingroene een <li> uit ul.vier
en de groene uit ul.vijf
. De spans zijn even rood gemaakt om ze zichtbaar te maken.
Ik beperk me hier even tot de bruingroene <li> met 'Geen header', maar het principe is overal hetzelfde, alleen de maten verschillen eventueel. Duidelijk is te zien dat de <li> veel groter is dan de erin liggende witte <a>.
position: absolute;
Om de span op de juiste plaats neer te kunnen zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die zelf een positie heeft. Dat is hier de <li> waarbinnen de span staat.
Een span is van zichzelf een inline-element. Door haar absoluut te positioneren, verandert ze in een blok-element, waardoor ik eigenschappen als breedte kan gebruiken.
top: -9px;
Door uitproberen blijkt dit de juiste hoogte te zijn, althans voor de spans binnen ul.twee
. Voor andere <ul>'s wordt dit, als dat nodig is, later gecorrigeerd. De span staan nu halverwege de witte <a> met 'Geen header'. Daardoor staat de zwarte border aan de onderkant ook halverwege deze witte <a>, oftewel: het horizontale zwarte lijntje staat netjes in het midden van de ingang in de sitemap.
In de afbeelding hierboven hoort bij de bruingroene <li> de tweede rode span van boven.
left: 0;
Omdat de <li> verder naar links staat dan de witte <a>, zet ik de span helemaal links. Nu staat hij tegen de border aan de linkerkant van de <ul>, en dus staat de zwarte border aan de onderkant van de span ook tegen deze verticale border aan: een keurige gesloten hoek. (In de afbeelding dekken de roodgemaakte spans de verticale lijnen gedeeltelijk af. In het echte voorbeeld zijn ze doorzichtig en gebeurt dit niet.)
width: 24px;
Iets verderop, bij ul.twee a, ul.twee span.kopje, geef ik alle <a>'s een marge aan de linkerkant van 24 px. Sommige ingangen zijn geen link en staan dus niet in een <a>, maar in een span met class="kopje". Ook die krijgen zo'n marge.
Daardoor komt er dus een ruimte van 24 px tussen de border aan de linkerkant van de <ul>, de verticale lijn, en de witte achtergrond van de <a>'s en spans. Als ik nu deze span even breed maak als die ruimte, vult hij die precies. En dus ook de border aan de onderkant: het horizontale streepje vult nu precies de ruimte tussen de verticale lijn (de border aan de linkerkant van de <ul>) en het kadertje om de <a> of <span> met de tekst.
height: 22px;
De span is hierboven 9 px omhoog geplaatst. Door uitproberen blijkt dit de juiste hoogte te zijn om de border aan de onderkant halverwege het witte vlak van de <a> of span te krijgen.
border-bottom: black solid 1px;
En dan eindelijk waar deze hele exercitie om is begonnen: het kleine horizontale streepje tussen witte vlak en verticale lijn. Omdat dit 'n gewone border is, staat deze automatisch goed als positie en grootte van de span in orde zijn.
ul.twee a, ul.twee span.kopje
Alle <a>'s en de spans met class="kopje" binnen een <ul> met class="twee". Omdat de links en spans binnen dieper geneste <ul>'s ook altijd binnen ul.twee
vallen, gelden de instellingen hier ook voor die links en spans binnen de dieper geneste <ul>'s.
De meeste instellingen voor de <a>'s en spans met class="kopje" zijn al opgegeven bij ul a, ul span.kopje. Hier geef ik alleen 'n marge links op en wat maten die anders moeten dan die bij ul a, ul span.kopje zijn opgegeven. Door het toevoegen van .twee
voorkom ik dat deze eigenschappen ook invloed hebben op de buitenste ul.een
.
width: 280px;
De <a>'s en spans van het tweede niveau worden iets smaller. Omdat de <a>'s en de spans een witte achtergrond hebben, wordt deze dus ook gelijk smaller.
margin-left: 24px;
24 px ruimte tussen de witte achtergrond van de <a>'s en de spans. In deze ruimte komt de span.hoek met het horizontale streepje tussen het witte vlak en de verticale lijn.
font-size: 20px;
Tekst van het tweede niveau wordt iets kleiner
In tegenstelling tot vrijwel alle andere voorbeelden geef ik de lettergrootte niet in em op. 'n Combinatie van px en em blijkt niet goed te werken, er ontstaan te lange lijnen en gaten.
Dit betekent wel dat je in Internet Explorer de lettergrootte niet kunt veranderen. Zoomen werkt wel gewoon.
line-height: 28px;
En dus ook 'n iets kleinere regelhoogte.
ul.drie, ul.vier, ul.vijf
De <ul>'s met class="drie", "vier" of "vijf". Dit zijn de <ul>'s van het derde, vierde en vijfde niveau. Drie is genest in twee, vier in drie, enz.
margin-left: 40px; border-left: black solid 1px;
Precies hetzelfde verhaal als bij ul.twee, alleen is de marge links iets groter.
ul.drie a
De links binnen een <ul> met class="drie".
width: 200px; font-size: 17px; line-height: 24px;
Alle instellingen zijn al opgegeven bij ul a, ul span.kopje en ul.twee a, ul.twee span.kopje. Alleen de hier staande eigenschappen worden aangepast, zodat deze ingangen van het derde niveau iets kleiner zijn.
ul.drie span.hoek
De spans met class="hoek" binnen een <ul> met class="drie". Alle instellingen zijn al opgegeven bij ul.twee span.hoek, alleen de hoogte moet worden aangepast.
height: 21px;
Door uitproberen blijkt dit de juiste hoogte te zijn om de border aan de onderkant halverwege het witte vlak van de ingang van het derde niveau te krijgen.
ul.drie span.onderste
De spans met class="onderste" binnen een <ul> met class="drie". Alle instellingen zijn al opgegeven bij ul span.onderste, alleen top
moet worden aangepast.
top: 13px;
Door uit te proberen blijkt dit de hoogte voor het derde niveau te zijn, waarbij de span precies op de juiste plaats komt te staan, tegen het horizontale lijntje aan.
ul.vier a
De links binnen een <ul> met class="vier".
width: 120px; font-size: 14px; line-height: 20px;
Alle instellingen zijn al opgegeven bij ul a, ul span.kopje en ul.twee a, ul.twee span.kopje. Alleen de hier staande eigenschappen worden aangepast, zodat deze ingangen van het vierde niveau iets kleiner zijn.
ul.vier span.hoek
De spans met class="hoek" binnen een <ul> met class="vier". Alle instellingen zijn al opgegeven bij ul.twee span.hoek, alleen de hoogte moet worden aangepast.
height: 20px;
Door uitproberen blijkt dit de juiste hoogte te zijn om de border aan de onderkant halverwege het witte vlak van de ingang van het vierde niveau te krijgen.
ul.vier span.onderste
De spans met class="onderste" binnen een <ul> met class="vier". Alle instellingen zijn al opgegeven bij ul span.onderste, alleen top
moet worden aangepast.
top: 12px;
Door uit te proberen blijkt dit de hoogte voor het vierde niveau te zijn, waarbij de span precies op de juiste plaats komt te staan, tegen het horizontale lijntje aan.
ul.vijf a
De links binnen een <ul> met class="vijf".
width: 40px; font-size: 12px; line-height: 14px;
Alle instellingen zijn al opgegeven bij ul a, ul span.kopje en ul.twee a, ul.twee span.kopje. Alleen de hier staande eigenschappen worden aangepast, zodat deze ingangen van het vijfde niveau iets kleiner zijn.
ul.vijf span.hoek
De spans met class="hoek" binnen een <ul> met class="vijf". Alle instellingen zijn al opgegeven bij ul.twee span.hoek, alleen de hoogte moet worden aangepast.
height: 17px;
Door uitproberen blijkt dit de juiste hoogte te zijn om de border aan de onderkant halverwege het witte vlak van de ingang van het vijfde niveau te krijgen.
ul.vijf span.onderste
De spans met class="onderste" binnen een <ul> met class="vijf". Alle instellingen zijn al opgegeven bij ul span.onderste, alleen top
moet worden aangepast.
top: 9px;
Door uit te proberen blijkt dit de hoogte voor het vijfde niveau te zijn, waarbij de span precies op de juiste plaats komt te staan, tegen het horizontale lijntje aan.
<!--[if IE 6]>
<style type="text/css">
ul.twee span.hoek {left: -24px;}
ul span.onderste {display: block; height: 500px; left: -26px; border: 0;}
ul.vier span.onderste {top: 13px;}
</style>
<![endif]-->
Dit eigenaardige stukje code heet een 'conditional comment' en wordt door alle browsers gezien als commentaar, omdat het tussen <!--
en -->
staat. Maar Internet Explorer herkent het, door de extra toevoegingen, als speciaal voor Internet Explorer bedoeld en zal het dus uitvoeren. Het is veiliger dan een zogenaamde 'hack', waarbij vaak gebruik wordt gemaakt van 'n fout (bug) in de browser. Dit is opzettelijk aangebracht door Microsoft en zal dus blijven bestaan, terwijl 'n bug gerepareerd kan worden.
De style voor Internet Explorer moet ná de normale komen, omdat de opdrachten voor Internet Explorer dan over de normale heen gaan.
Dit stukje geldt voor Internet Explorer 6, maar je kunt het ook voor andere versies aangeven.
In plaats van de style kun je ook 'n normale link naar 'n extern css-bestand aanbrengen:
<!--[if IE 6]>
<link rel="stylesheet" type="text/css" href="../../css/naam-van-ie-stylesheet.css">
<![endif]-->
Op de plaats van "../../css/naam-van-ie-stylesheet.css"
vul je pad naar en naam van jouw stylesheet voor Internet Explorer 6 in. De css voor Internet Explorer 6 komt dan apart in die stylesheet te staan, zodat het de andere browsers niet stoort.
Het is belangrijk dat de spaties in <!--[if IE 6]>
en <![endif]-->
precies zo worden overgenomen zoals ze hier staan.
ul.twee span.hoek
De spans met class="hoek" die binnen een <ul> met class="twee" liggen. Omdat spans met class="hoek" die binnen een dieper geneste <ul> liggen ook altijd binnen ul.twee
liggen, gelden deze instellingen voor elke span met class="hoek".
Deze spans zorgen voor het horizontale lijntje tussen de witte vlakken met tekst en de verticale lijn.
left: -24px;
Aflevering 398 uit De Wondere Wereld van Internet Explorer 6. Deze spans worden gepositioneerd ten opzichte van de <li> waar ze in staan. Daarom is in de algemene css left: 0;
opgegeven. Om een of andere duistere reden zet Internet Explorer 6 ze dan echter niet aan het begin van de <li>, maar aan het begin van de in de <li> zittende <a> of span met de tekst.
Op deze manier wordt het horizontale lijntje ook in deze als browser vermomde pestilentie op de goede plaats neergezet.
ul span.onderste
De spans met class="onderste" binnen een <ul>. Dit zijn de spans waar de 'streepjes' in staan die de te lange verticale lijnen afdekken.
display: block;
Aflevering 399 uit De Wondere Wereld van Internet Explorer 6. Een span is van zichzelf een inline-element. Maar omdat hij in de algemene css absoluut is gepositioneerd, verandert hij in een blok-element. Om een of andere reden gebeurt dat echter niet in Internet Explorer 6, dus geef ik het hier expliciet op.
height: 500px;
In de algemene css is deze span absoluut gepositioneerd tussen bovenkant en onderkant van de <li>. Maar Internet Explorer 6 negeert de bottom: 0;
volledig.
Daarom geef ik de span 'n hoogte. Deze hoogte is groot genoeg om, bij deze sitemap, ook de langste overbodige delen van de verticale lijnen af te dekken.
left: -26px;
Deze spans worden gepositioneerd ten opzichte van de <li> waar ze in staan. Daarom is in de algemene css left: -2px;
opgegeven. Om een of andere duistere reden zet Internet Explorer 6 ze dan echter 24 px te veel naar rechts.
Op deze manie wordt de afdekkende span ook in Internet Explorer 6 op de goede plaats neergezet.
ul.vier span.onderste
De spans met class="onderste" binnen een <ul> met class="vier".
top: 13px;
De instelling uit de algemene css waar alle andere browsers gelukkig mee zijn is voor dit verwende kreng niet goed genoeg. Het levert 'n kier op. Dus passen we de instelling voor Internet Explorer 6 aan.
<!--[if IE 7]>
<style type="text/css">
ul span.onderste {display: block;}
</style>
<![endif]-->
Deze code geldt alleen voor Internet Explorer 7. Uitleg zie bij Speciaal voor Internet Explorer 6.
ul span.onderste
De spans met class="onderste" binnen een <ul>. Dit zijn de spans waar de 'streepjes' in staan die de te lange verticale lijnen afdekken.
display: block;
Een span is van zichzelf een inline-element. Maar omdat hij in de algemene css absoluut is gepositioneerd, verandert hij in een blok-element. Om een of andere reden gebeurt dat echter niet in Internet Explorer 7, dus geef ik het hier expliciet op.
Gebruik vooral geen FrontPage, Publisher of Word (alle drie van Microsoft). Deze programma's maken niet-standaard code die alleen goed te bekijken is in Internet Explorer. In alle andere browsers zie je grotendeels bagger, áls je al iets ziet.
Publisher en Word zijn niet bedoeld om websites mee te maken. FrontPage is zwaar verouderd en wordt niet meer onderhouden door Microsoft. Als je beslist iets van Microsoft wilt gebruiken, schaf dan (voor honderden euro's) een nieuwer programma aan, dat zich wel aan de standaarden houdt.
Je kunt natuurlijk ook een goed gratis programma gebruiken. Links naar dat soort programma's vind je op de pagina met links onder Gereedschap → wysiwyg-editor.
Maar het allerbeste is om gewoon zelf html, css, enz. te leren, omdat zelfs het allerbeste programma het nog steeds zwaar verliest van 'n op de juiste manier met de hand gemaakte pagina.
Ik maak zelf het liefst een site in Firefox. Als je 'n site maakt in Firefox, Opera, Safari, Google Chrome of Edge, is er 'n hele grote kans dat hij in alle browsers werkt. Ik geef de voorkeur aan Firefox, omdat het de enige grote browser is die niet bij een bedrijf hoort dat vooral op je centen of je data uit is.
Google Chrome wordt ook door veel mensen gebruikt, maar ik heb dus wat moeite met hoe Google je hele surfgedrag, je schoenmaat en de kleur van je onderbroek vastlegt. Daarom gebruik ik Google Chrome zelf alleen om in te testen.
Het allereerste dat je moet invoeren, is het doctype, vóór welke andere code dan ook. Een lay-out met een missend of onvolledig doctype ziet er totaal anders uit dan een lay-out met een geldig doctype. Wát er anders is, verschilt ook nog 'ns tussen de diverse browsers. Als je klaar bent en dan nog 'ns 'n doctype gaat invoeren, weet je vrijwel zeker dat je van voren af aan kunt beginnen met de lay-out.
Geldige doctypes vind je op www.w3.org/QA/2002/04/valid-dtd-list.html.
Gebruik het volledige doctype, inclusief de url, anders werkt het niet goed.
Gebruik een 'strict' doctype of het doctype voor html5. Deze zijn bedoeld voor nieuwe sites. Het transitional doctype is bedoeld voor al bestaande sites, niet voor nieuwe. Het transitional doctype staat talloze tags toe, die in html5 zijn verboden. Deze tags worden al zo'n tien jaar afgeraden. Het transitional doctype is echt alleen bedoeld om de puinhoop van vroeger, toen niet volgens standaarden werd gewerkt, enigszins te herstellen.
Het strict doctype staat verouderde tags niet toe. Daardoor kan met 'n strict doctype, of het nu html of xhtml is, probleemloos worden overgestapt naar html5. Met een transitional doctype en het gebruik van afgekeurde tags kun je niet overstappen naar html5. Je moet dan eerst alle verouderde tags verwijderen, wat echt ontzettend veel werk kan zijn.
Als het om een lay-out of iets dergelijks gaat: zorg eerst dat header, kolommen, footer, menu, en dergelijke staan en bewegen zoals je wilt, en ga dan pas details binnen die blokken invullen. In eerste instantie gebruik je dus bijvoorbeeld 'n leeg blok voor waar uiteindelijk het menu komt te staan.
Als je begint met allerlei details, is er 'n heel grote kans dat die de werking van de blokken gaan verstoren. Bouw eerst het huis, en ga dan pas de kamers inrichten. Als de blokken eenmaal werken zoals je wilt, zul je het gelijk merken als 'n toegevoegd detail als tekst of 'n afbeelding iets gaat storen. Daarvoor moet je natuurlijk wel regelmatig controleren in verschillende browsers of alles nog wel goed werkt.
Je kunt de blokken tijdens het aanpassen opvullen met bijvoorbeeld <br />1<br />2<br />3 enz., tot ze de juiste hoogte hebben. Het is handig om aan het einde even iets toe te voegen als 'laatste', zodat je zeker weet dat er niet drie regels onderaan naar 't virtuele walhalla zijn verhuisd.
Om de breedte te vullen kun je het best 'n kort woord als 'huis' duizend keer of zo herhalen. Ook hier is het handig om aan 't einde (en hier ook aan 't begin) 'n herkenningsteken te maken, zodat je zeker weet dat je de hele tekst ziet.
Valideren, valideren, valideren en dan voor 't slapen gaan nog 'ns valideren.
Valiwie???
Valideren is het controleren van je (x)html en css op 'n hele serie fouten. Computers zijn daar vaak veel beter in dan mensen. Als je 300 keer <h2> hebt gebruikt en 299 keer </h2> vindt 'n computer die ene missende </h2> zonder enig probleem. Jij ook wel, maar daarna ben je misschien wel aan vakantie toe.
Je kunt je css en (x)html zowel valideren als 't online staat, als wanneer 't nog in je computer staat. Web Developer ('n Firefox-extensie) heeft zelfs 'n mogelijkheid om de html voortdurend, bij elke wijziging, opnieuw te valideren. (Die mogelijkheid is er ook bij css, maar daar wordt altijd aangegeven dat 't valid is, wat je er ook aan onzin in zet. Maar als je in de balk op css klikt ga je naar de echte validator, en die controleert wel goed.)
(x)html kun je valideren op: validator.w3.org
css kun je valideren op: jigsaw.w3.org/css-validator
Valideren kan helpen om gekmakende fouten te vinden. Valid code garandeert ook dat de weergave in verschillende browsers (vrijwel) hetzelfde is. En valid code is over twintig jaar ook nog te bekijken.
Eventuele opmerkingen specifiek voor dit voorbeeld staan bij Opmerkingen.
Toegankelijkheid (accessibility in het Engels) is belangrijk voor bijvoorbeeld blinden die een spraakbrowser gebruiken, of voor motorisch gehandicapte mensen die moeite hebben met het bedienen van een muis. Een spider van een zoekmachine (dat is het programmaatje wat de site indexeert voor de zoekmachine) is te vergelijken met een blinde. Als je je site goed toegankelijk maakt voor gehandicapten, is dat dus gelijk goed voor een hogere plaats in een zoekmachine. Dus als je 't niet uit sociale motieven wilt doen, kun je 't uit egoïstische motieven doen.
(Op die plaats in de zoekmachine heb je maar beperkt invloed. De toegankelijkheid van je site is maar één van de factoren, maar zeker niet onbelangrijk.)
Als je bij het maken van je site al rekening houdt met toegankelijkheid, is dat nauwelijks extra werk. 't Is ongeveer te vergelijken met inbraakbescherming: doe dat bij 'n nieuw huis en 't is nauwelijks extra werk, doe 't bij 'n bestaand huis en 't is al snel 'n enorme klus.
Enkele tips die helpen bij toegankelijkheid:
Accesskeys (sneltoetsen) kun je beter niet gebruiken, deze gaven te veel problemen omdat ze vaak dubbelop zijn met sneltoetsen voor de browser of andere al gebruikte sneltoetsen. Bovendien is voor de gebruiker meestal niet duidelijk welke toetsen het zijn.
In de komende html5 waren ze eerst niet toegestaan, maar inmiddels lijkt het erop dat ze toch worden toegestaan, maar op 'n andere manier dan in html 4.01. Ik ga ze zelf pas weer gebruiken als duidelijk is hoe ze gaan werken, en als ze beter zijn uitgedacht dan in html 4.01 het geval was, want bij een goede toepassing is het op zich een heel goed idee.
In het verleden werd vaak aangeraden de volgorde van de code aan te passen. Een menu bijvoorbeeld kon in de html onderaan worden gezet, terwijl het op het scherm met behulp van css bovenaan werd gezet. Inmiddels zijn screenreaders en dergelijke zo verbeterd, dat dit niet meer wordt aangeraden. De volgorde in de html kan tegenwoordig beter hetzelfde zijn als op het scherm, omdat het anders juist verwarrend kan werken.
Een andere mogelijkheid is een zogenaamde skip-link: een link die je buiten het scherm parkeert met behulp van css, zodat hij normaal genomen niet te zien is. Zo'n link is wel zichtbaar te maken in speciale programma's zoals spraakbrowsers. Die link staat boven het menu en linkt naar de inhoud van de pagina, zodat mensen met één klik het hele menu kunnen passeren.
Van oorsprong was html een taal om wetenschappelijke documenten weer te geven, pas later is hij gebruikt voor lay-out. Maar daar is hij dus eigenlijk nooit voor bedoeld geweest. Het gebruiken van html voor lay-out leidt tot enorme problemen voor gehandicapten en tot een lage plaats in zoekmachines.
De html hoort alleen inhoud te bevatten, lay-out doe je met behulp van css. Die css moet in een extern stylesheet staan of, als hij alleen voor één bepaalde pagina van toepassing is, in de head van die pagina. Zoekmachines zijn ook niet dol op een oerwoud van inline-stijlen (dat zijn stijlen in de tag zelf: <div style="...">
.)
Breng een logische structuur aan in je document. Gebruik een <h1> voor de belangrijkste kop, een <h2> voor een subkop, enz. Spraakbrowsers en dergelijke kunnen van kopregel naar kopregel springen. En een zoekmachine gaat ervan uit dat <h1> belangrijke tekst bevat.
Dit geldt voor al dit soort structuurbepalende tags.
Als een <h1> te grote letters geeft, maak daar dan met behulp van je css 'n kleinere letter van, maar blijf die <h1> gewoon gebruiken. Op dezelfde manier kun je al dit soort dingen oplossen.
Frames horen bij een volstrekt verouderde techniek, die heel veel nadelen met zich meebrengt. <iframe>'s hebben voor een deel dezelfde nadelen. Eén van die nadelen is dat de verschillende frames voor zoekmachines, schermlezers, en dergelijke als los zand aan elkaar hangen, omdat ze los van elkaar worden weergegeven. Ze staan wel naast elkaar op het scherm, maar er zit intern geen verband tussen.
Als je 'n stuk code vaker wilt gebruiken, zoals 'n menu dat op elke pagina hetzelfde is, voeg dat dan in met PHP of SSI. Dan wordt de pagina niet pas in de browser, maar al op de server samengesteld. Hierdoor zien zoekmachines, schermlezers, en dergelijke één pagina, net zoals wanneer je maar één pagina met html zou hebben geschreven.
(Je kunt beter PHP dan SSI gebruiken, omdat SSI min of meer aan het uitsterven is en PHP veel meer mogelijkheden heeft. Op deze site wordt in enkele voorbeelden nog SSI gebruikt, maar zodra die worden bijgewerkt, gaat dat vervangen worden door PHP.)
lang=".."
. Ik doe dat op mijn eigen site maar af en toe, omdat de tekst (en vooral de code) een mengsel is van Engels, Nederlands en eigengemaakte namen. Dit soort teksten is gewoon niet goed in te delen in een taal.<abbr>
bij afkortingen. Doe dat de eerste keer op een pagina samen met de title-eigenschap: <abbr title="en dergelijke">e.d.</abbr>
. Daarna kun je op dezelfde pagina volstaan met <abbr>e.d.</abbr>
. Doe je dit niet, dan is er 'n grote kans dat 'n spraakbrowser e.d. uit gaat spreken als Ed, en 'n zoekmachine kan er ook geen chocola van maken.De spider van 'n zoekmachine, spraakbrowsers, en dergelijke kunnen geen plaatjes 'lezen'. Het is soms verbazingwekkend om te zien hoe veel, of eigenlijk: hoe weinig tekst er overblijft op een pagina als de plaatjes worden weggehaald. Het zelfde geldt voor die fantastisch mooie flash-pagina's, als daarbij geen voorzieningen voor dit soort programma's zijn aangebracht.
Op Linux kun je met Lynx kijken hoe je pagina eruitziet zonder plaatjes en dergelijke, als echt alleen de tekst overblijft. Een installatie-programma voor Lynx op Windows is te vinden op csant.info/lynx.
In Windows kun je ook het gratis programma WebbIE installeren. WebbIE laat de pagina zien, zoals een spraakbrowser en dergelijke hem zien. WebbIE is te downloaden vanaf www.webbie.org.uk.
De Firefox-extensie Web Developer heeft de mogelijkheid om 'n pagina te bekijken zonder css en/of afbeeldingen.
Ten slotte kun je je pagina nog online laten controleren op 'n behoorlijk aantal sites. Ik noem er hier enkele. Helaas zijn ze bijna allemaal Engelstalig.
colorfilter.wickline.org Laat zien hoe een kleurenblinde de site ziet.
contentquality.com Test op toegankelijkheid. Heel overzichtelijk.
wave.webaim.org Deze laat grafisch zien hoe de toegankelijkheid is. Heel erg duidelijk, maar bij grotere pagina's wordt 't al snel erg chaotisch.
Omdat ze de uitleg van de icoontjes heel goed hebben weten te verstoppen, geef ik de link daarvan ook maar gelijk: wave.webaim.org/icons
Laatst gecontroleerd op 28 februari 2011.
(Internet Explorer 6 is voor het laatst gecontroleerd op 29 september 2009. Op deze browser test ik niet meer. Maar omdat de code niet is veranderd, neem ik aan dat dit voorbeeld ook nog werkt in Internet Explorer 6.)
Dit voorbeeld is getest in Firefox, Opera, Safari, Google Chrome, Internet Explorer 6, 7, 8 en 9 in de resoluties 800x600, 1024x768, 1280x1024 en 1440x900. Steeds met de laatste versie van die browsers, omdat ik geen zin heb om rekening te houden met mensen die met zwaar verouderde browsers surfen. Dat is trouwens vragen om ellende, want updates van browsers hebben heel vaak met beveiligingsproblemen te maken. In de resoluties 1024x768, 1280x1024 en 1440x900 is ook in- en uitzoomen en een kleinere en grotere letter getest. Er is ingezoomd en vergroot tot zover de browser kan, maar niet verder dan tot 200%.
Eventuele problemen met betrekking tot zoomen en lettergrootte staan bij Bekende problemen.
Er is getest met behulp van muis en toetsenbord.
Naast deze 'gewone' browsers is ook getest in Lynx, WebbIE, NVDA en Fangs Screen Reader Emulator. Lynx is een browser die alleen tekst laat zien en geen css gebruikt. WebbIE is een browser die gericht is op mensen met een handicap. NVDA is een screenreader, zoals die door blinden wordt gebruikt. Fangs Screen Reader Emulator is een extensie bij Firefox die de pagina laat zien zoals een screenreader hem ziet.
Als het voorbeeld in deze vier programma's toegankelijk is, zou het in principe toegankelijk moeten zijn in alle aangepaste browsers en dergelijke. En dus ook voor zoekmachines, want een zoekmachine is redelijk vergelijkbaar met een blinde. Eventuele opmerkingen over de toegankelijkheid van dit voorbeeld staan bij Opmerkingen.
Alleen op de hierboven genoemde systemen en browsers is getest. Er is dus niet getest op bijvoorbeeld mobiele systemen als iOS of Android, en ook niet op apparaten als smartphones, iPad, enz. De kans is heel erg groot dat dit voorbeeld niet (volledig) werkt op dat soort systemen en apparaten. Om het wel (volledig) werkend te krijgen, zul je vaak wijzigingen en/of aanvullingen moeten aanbrengen.
De html is gevalideerd met de validator van w3c, de css ook. Als om een of andere reden niet volledig gevalideerd kon worden, wordt dat bij Bekende problemen vermeld.
Nieuwe browsers test ik pas als ze uit het bèta-stadium zijn, omdat er anders 'n redelijke kans is dat ik 'n bug zit te omzeilen, die voor de uiteindelijke versie nog gerepareerd wordt. Dit voorbeeld is alleen getest in de hierboven met name genoemde browsers. Vragen over niet-geteste browsers kan ik niet beantwoorden, en het melden van fouten in niet-geteste browsers heeft ook geen enkel nut. (Melden van fouten, problemen, enz. in wel geteste browsers: graag!)
Alleen grotere wijzigingen worden hier vermeld, geen dingen als een link die is geüpdatet.
29 september 2009:
Nieuw opgenomen.
28 februari 2011:
In de vorige versie was bij elk lijst-item een nummer aangebracht, dat speciaal voor spraakbrowsers en dergelijke was bedoeld. Het programma dat ik toentertijd gebruikte om een spraakbrowser te imiteren, bleek echter niet echt geweldig te zijn.
Volgens dat programma werden alle lijst-items achter elkaar voorgelezen, als één lange regel. Daarom leek het nodig om voor spraakbrowsers en dergelijke een aparte nummering aan te brengen. Inmiddels gebruik ik veel betere programma's om toegankelijkheid te testen. En die laten heel wat anders zien en horen.
Afhankelijk van programma en instellingen blijken spraakbrowsers en dergelijke de titel en/of de schermtekst en/of de diepte van de lijst voor te lezen. De speciale nummers waren alleen maar ongelooflijk irritant.
Die nummers zijn dus weggehaald en de tekst is daaraan aangepast.
13 februari 2012:
Bij in- en uitzoomen ontstaan er bij bepaalde standen minieme gaatjes in de hoeken en/of lopen de lijntjes in de hoeken 'n heel klein beetje te ver door. Dit is in de regel zo weinig dat je 't eigenlijk niet ziet als je 't niet weet. Als alleen de lettergrootte wordt veranderd, gebeurt dit niet.
Als de letters 140% of meer worden vergroot, komt een enkel woord iets buiten de witte achtergrond te staan. Echte problemen levert dit niet op. Dit speelt alleen bij de lettergrootte, niet bij zoomen.
Bij inzoomen (vergroten) worden sommige lijnen bij bepaalde standen dubbel zo dik als hoort.
Bij een andere lettergrootte ontstaan kleine gaatjes in de hoeken of lopen de lijntjes in de hoeken iets te ver door.
Hè? Ben je Internet Explorer 8 niet vergeten? Nee, vreemd genoeg niet. In dit voorbeeld werkt 8 gewoon beter dan 9...
Bij uitzoomen (verkleinen) vallen grotere stukken lijnen weg. Bij inzoomen (vergroten) gebeurt dat niet, en bij 'n andere lettergrootte gaat 't ook goed.
Bij inzoomen (vergroten) worden sommige lijnen bij bepaalde standen dubbel zo dik als hoort.
De horizontale lijntjes van het diepste niveau staan niet precies in het midden van het witte vlak.