Bij hoveren over de knop, of als deze focus heeft, verschuift de afbeelding langzaam, waardoor de eronder zittende tekst van de link zichtbaar wordt.
Alles op deze site kan vrij worden gebruikt. Je gebruikt het wel op eigen risico: als er ergens fouten in zitten, ben ik daar niet verantwoordelijk voor en ook niet voor eventueel daardoor aangerichte schade in welke vorm dan ook. Een link naar http://www.css-voorbeelden.nl is niet verplicht, maar wordt wel gewaardeerd.
Bij dit voorbeeld wordt onder andere gebruik gemaakt van een nog niet officieel gedefinieerde eigenschap van css 3: transition. Ook wordt gebruik gemaakt van border-radius en box-shadow, twee css 3-eigenschappen die al wel min of meer officieel zijn gedefinieerd.
Niet alle browsers ondersteunen deze eigenschappen, en voor zover ze ze ondersteunen, is dat niet altijd in gelijke mate. Zie voor de verschillen en dergelijke Bekende problemen.

Internet Explorer 7 als over de link wordt gehoverd.
Browsers die één of meer van deze css 3-eigenschappen niet (volledig) ondersteunen, laten de beweging, de schaduw en/of de ronde hoeken weg.
Maar zelfs de meest achtergebleven browser (Internet Explorer 7) verplaatst bij hoveren of als de link focus heeft de afbeelding. Waardoor de eronder zittende tekst dus zichtbaar wordt. De gebruikte css 3-eigenschappen voegen alleen extra's toe, ze zijn niet essentieel voor een goede werking.
Op de afbeelding hiernaast wordt in Internet Explorer 7 over de link gehoverd, en alles werkt gewoon. Alleen minder fraai.
(Ten onrechte gebruikt Internet Explorer 7 :active waar het :focus moet zijn, maar dat maakt voor de werking verder geen verschil.)
Hoewel het hier maar om twee losstaande knoppen gaat en niet om een heel menu, staan ze toch in een ongeordende lijst <ul>. In het algemeen is het veel beter (en makkelijker) om een menu in een <ul> te zetten.
Een menu in een <ul> kan vaak door spraakbrowsers en dergelijke worden herkend, zodat gebruikers het in één keer kunnen passeren en naar de eigenlijke inhoud van de pagina kunnen gaan. Om dezelfde reden kan het nuttig zijn een skip-link aan te brengen gelijk voor het menu, zodat het menu in één keer gepasseerd kan worden.
Bij dit soort links is het extra belangrijk voor spraakbrowsers en dergelijke (en voor zoekmachines) dat bij de link 'n title en bij de afbeelding een alt-tekst is opgegeven. Afhankelijk van programma en instellingen worden dan title, alt-tekst of beide gelezen.
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:
Bij hoveren over een link of als de link focus heeft, kan de afbeelding al heel lang worden verplaatst met behulp van alleen css. Heel vaak wordt hier JavaScript voor gebruikt, maar dat is volstrekt onnodig.
De basis van dit voorbeeld gebruikt alleen css uit versie 2.1, dus deze werkt in alle niet-prehistorische browsers. De extra's waarmee dit verder is opgeleukt, werken bij lange na niet in alle browsers. Maar omdat het om extra's gaat, maakt dat niet zoveel uit.
Het is wel belangrijk dat de basis altijd werkt, omdat je anders problemen in oudere browsers kunt krijgen. Ook in de nieuwste browsers trouwens, als ze toevallig Internet Explorer heten.
De knop is een gewone link, die als blok-element wordt weergegeven, zodat hij opgemaakt kan worden. Binnen de link zitten een afbeelding en tekst. De tekst zit in een aparte span, zodat deze apart opgemaakt kan worden. Afbeelding en link hebben een zwarte rand.
Bij hoveren over de afbeelding, of als deze focus heeft (of in Internet Explorer 7 foutief: als de link actief is), wordt de afbeelding iets omhoog en naar links gezet. Hierdoor wordt de eronder zittende tekst zichtbaar.
Dit is het deel dat in alle browsers altijd zal werken.
Bij de browsers die dat herkennen, krijgen afbeelding en link ronde hoeken. Dat zijn alle browsers behalve Internet Explorer 7 en 8. Internet Explorer 9 herkent het ook.
Bij de browsers die box-shadow herkennen, krijgt de afbeelding een schaduw onder en rechts, als hij wordt verplaatst. Dat zijn weer alle browsers behalve Internet Explorer 7 en 8. Ook Internet Explorer 9 herkent dit.
Deze schaduw staat gedeeltelijk over de tekst binnen de link heen. Daardoor zou die tekst gedeeltelijk onzichtbaar zijn. Om dat te voorkomen, wordt de schaduw doorzichtig gemaakt met behulp van rgba(). Dit werkt niet in Internet Explorer 7 en 8, maar dat is geen probleem, want die herkennen box-shadow ook niet, dus die geven toch geen schaduw. Ook Internet Explorer 9 herkent rgba().
De nieuwe css 3-eigenschap transition geeft de mogelijkheid om allerlei veranderingen geleidelijk aan uit te voeren in plaats van schoksgewijs. Eventueel kun je aan het begin ook nog een vertraging inbouwen.
De afbeelding wordt niet in één keer verplaatst, maar beweegt zich geleidelijk naar de nieuwe positie. Door de grootte van de beweging naar boven en naar links verschillend te maken en een vertraging in de beweging naar links op te nemen, lijkt de afbeelding weg te draaien.
Firefox herkent transition pas in versie 4, dus in eerdere versies zie je wel de doorzichtige schaduw en de ronde hoeken, maar de afbeelding wordt in één keer verplaatst.
Internet Explorer 7, 8 en 9 kennen transition niet, dus hierin verspringt de afbeelding ook in één keer.
Als je dat belangrijk vindt, kun je op zoek gaan naar een JavaScript-bibliotheek of zoiets die een min of meer goede imitatie van dit voorbeeld in de speelgoed-browsers van Microsoft mogelijk maakt. Op de pagina met links staan onder css → Bugs en hacks → Dingen mogelijk maken in Internet Explorer links naar onder andere dat soort bibliotheken.
(En excuseer mijn gemopper op Internet Explorer, maar je wordt toch werkelijk niet goed van alle beperkingen, afwijkingen en bugs in de diverse versies. Dat moet wereldwijd vele, vele miljarden hebben gekost aan extra ontwikkelkosten.)
Voordat een nieuwe css-eigenschap wordt ingevoerd, is er in de regel een experimentele fase. Browsers passen het dan al toe, maar met een aangepaste naam. Tijdens deze fase kunnen problemen worden opgelost en worden veldslagen uitgevochten over hoe de standaard precies moet worden toegepast.
Als iedereen het overal over eens is en alle problemen zijn opgelost, wordt de officiële naam uit de standaard gebruikt.
De belangrijkste browsers hebben elk een eigen voorvoegsel:
Firefox: -moz-, naar de maker: Mozilla.
Google Chrome en Safari: -webkit-, naar de gebruikte weergave-machine: webkit.
Opera: -o-, je mag zelf bedenken waar de letter o vandaan komt (hint: Opera wordt door Opera Software gemaakt).
Internet Explorer: -ms-, naar de maker: Microsoft. Traditiegetrouw heeft Microsoft zich hier jarenlang niets van aangetrokken, pas bij Internet Explorer 8 is Microsoft -ms- gaan gebruiken. Omdat het ook zonder -ms- werkt en de speciale css voor Internet Explorer toch in een aparte stylesheet staat, gebruik ik -ms- nooit voor oudere versies dan Internet Explorer 9.
Hoewel deze voorvoegsels door w3c zelf genoemd worden, rekent de validator ze vreemd genoeg toch fout. Je zou verwachten dat alles achter zo'n voorvoegsel gewoon wordt genegeerd door de validator, of hoogstens een waarschuwing krijgt, maar dat is dus niet zo. Dit tot irritatie van veel sitebouwers, waaronder ik, omdat je nu steeds moet kijken, waarom je 'n foutmelding krijgt. Terwijl in dit geval een fout gewoon acceptabel is, omdat je precies weet, waardoor die fout ontstaat.
In dit voorbeeld gaat het om de eigenschappen transition, border-radius en box-shadow, waarbij af en toe nog deze voorvoegsels nodig zijn.
border-radiusFirefox: nieuwere versies hebben het voorvoegsel -moz- niet meer nodig. Maar omdat er nogal wat oudere versies in gebruik zijn, is het beter voorlopig ook -moz-border-radius nog te gebruiken.
Safari: de nieuwste versie heeft het voorvoegsel -webkit- niet meer nodig. Maar omdat dit pas sinds kort is, is het beter -webkit-border-radius voorlopig ook nog te gebruiken.
Opera en Internet Explorer 9 herkennen border-radius.
box-shadowSafari heeft nog een voorvoegsel nodig bij box-shadow. Dat wordt dus -webkit-box-shadow-.
Opera, Google Chrome en Internet Explorer 9 herkennen box-shadow.
Firefox: nieuwere versies hebben het voorvoegsel -moz- niet meer nodig Maar omdat er nogal wat oudere versies in gebruik zijn, is het beter voorlopig ook -moz-box-shadow nog te gebruiken.
transitionOpera, Firefox, Safari en Google Chrome hebben allemaal nog een voorvoegsel nodig: -o-transition, -moz-transition en -webkit-transition.
Internet Explorer: waarschijnlijk gaat Internet Explorer 10 dit ook ondersteunen, dus vooruitlopend daarop zetten we er nog -ms-transition bij.
rgba()Opera, Firefox, Safari, Google Chrome en Internet Explorer 9 herkennen rgba() allemaal zonder voorvoegsel.
Zodra de experimentele fase voorbij is, wordt het voorvoegsel weggelaten. Omdat dat moment niet bij alle browsers hetzelfde is, zet je nu ook al de officiële naam erbij. Deze wordt als laatste opgegeven.
Bijvoorbeeld Firefox herkent -moz-transition. Zodra Firefox transition gaat herkennen, zal dit -moz-transition overrulen, omdat het er later in staat. Dat ze er beide in staan, is dus geen enkel probleem.
Op dit moment moet je dus voor transition de volgende css schrijven:
{-moz-transition: ...; -webkit-transition: ...; -o-transition: ...; -ms-transition: ...; transition: ...;}
In de toekomst kun je volstaan met:
{transition: ...;}
Dit zal nog wel 'n behoorlijke tijd duren. Firefox, Safari, Opera en Google Chrome hebben een goed update-mechanisme. Maar Internet Explorer blijft altijd jaren en jaren in omloop, en tijdens die omloop worden alleen bugs gerepareerd, er worden nooit veranderingen aangebracht. Dus als Microsoft -ms- gaat gebruiken, duurt het nog jaren voor de laatste schrijfwijze mogelijk is.
Voor de eigenschappen border-radius en box-shadow geldt hetzelfde: eerst de vorm met de voorvoegsels en als laatste de officiële naam zonder voorvoegsel.
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 gebruikt 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 laat ik de afbeelding ook verschuiven als de link focus heeft, of als er over de link wordt gehoverd. Ook bij hoveren of focus heeft de tekst die dan verschijnt extra toegevoegde waarde. En omdat de beweging van de afbeelding niet heel groot is, is de kans vrij klein dat andere elementen door de afbeelding worden bedekt.
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>
<html 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.html.
Gebruik het volledige doctype, inclusief de eventuele url, anders werkt het niet goed.
Het hier gebruikte doctype is dat van html 5. Dit kan al veilig worden gebruikt.
<meta charset="utf-8">
Zorgt dat de browser letters met accenten en dergelijke goed kan weergeven.
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 die uit de algemene stylesheet dan in principe overrulen.
<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, zoals ik die in dit voorbeeld gebruik. Maar als je dat doet, garandeer ik je hele grote problemen, omdat het volstrekt onoverzichtelijk is. Ik gebruik deze lay-out alleen, 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.
color: black;
Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hieronder geef ik een achtergrondkleur op. Sommige mensen hebben zelf de kleur en/of achtergrondkleur veranderd, bijvoorbeeld omdat ze slecht kleuren kunnen onderscheiden. Als ik nu de achtergrondkleur verander, maar niet de tekstkleur, loop ik het risico dat tekstkleur en achtergrondkleur te veel op elkaar gaan lijken.
Door beide op te geven, weet ik redelijk zeker dat achtergrond- en tekstkleur genoeg van elkaar blijven verschillen. Als de gebruiker !important heeft gebruikt, is er nog niets aan de hand, want dan veranderen achtergrond- en tekstkleur geen van beide.
Hoewel in dit voorbeeld verder geen gewone tekst wordt gebruikt, laat ik dit toch staan. Het is een goede gewoonte om voorgrond- en achtergrondkleur samen op te geven bij de body. Als er mogelijk later alsnog tekst wordt toegevoegd, kan dan niet worden vergeten om alsnog een tekstkleur op te geven.
background: #ff9;
Achtergrondkleurtje.
ul
Alle ongeordende lijsten. Dat is er hier maar eentje: die waar de knoppen in staan.
width: 600px;
Breedte. Die is hier alleen maar nodig om horizontaal te kunnen centreren, zoals ik gelijk hieronder doe.
margin: 0 auto;
Omdat voor onder en links geen waarden zijn ingevuld, krijgen die automatisch dezelfde waarde als boven en rechts. Hier staat dus eigenlijk 0 auto 0 auto in de volgorde boven – rechts – onder – links.
Boven en onder geen marge. Links en rechts auto wat hier betekent: evenveel. De marge links en rechts is dus altijd even groot, ongeacht de grootte van het venster van de browser.
Deze manier van horizontaal centreren van blok-elementen werkt alleen, als het te centreren blok-element een breedte heeft.
Standaard hebben ongeordende lijsten afwijkende marges in de diverse browsers. Ook om die reden is het altijd goed zelf een marge op te geven of deze op 0 te zetten.
padding: 0;
Standaard hebben ongeordende lijsten een afwijkende padding in de diverse browsers. Om die reden is het altijd goed zelf een marge op te geven of deze op 0 te zetten.
list-style: none;
De gebruikelijk balletjes en dergelijke van een ongeordende lijst zijn hier niet welkom.
li
Alle lijst-ingangen. Dat zijn er hier maar twee: één voor elke knop.
float: left;
Van zichzelf is een lijst-ingang een blok-element en komt dus op een nieuwe regel te staan. Door ze naar links te floaten komen ze naast elkaar op dezelfde regel te staan.
margin: 80px 0;
Omdat voor onder en links geen waarde is ingevuld, krijgen die automatisch dezelfde waarde als boven en rechts. Hier staat dus eigenlijk 80px 0 80px 0 in de volgorde boven – rechts – links – onder.
Boven en onder een marge van 80 px. Dit geeft wat afstand tussen de knoppen en de bovenkant van het venster van de browser. Dat er onderaan ook een marge is, is hier niet van belang, dus die laten we lekker staan.
Links en rechts geen marge.
li + li
Een lijst-ingang die volgt op een andere lijst-ingang. Omdat er hier maar twee zijn, geldt dit alleen voor de lijst-ingang waar de rechterknop in staat. Dat is hier nou eenmaal de enige lijst-ingang die volgt op een andere.
float: right;
Zover mogelijk naar rechts zetten.
Bij li zijn alle lijst-ingangen naar links gefloat. Daardoor staan ze helemaal tegen elkaar aan, en de erin zittende knoppen dus ook. Door de tweede lijst-ingang naar rechts te floaten, komt deze helemaal rechts in de ongeordende lijst te staan. En de daarin zittende knop dus ook.
De eerste knop staat nu helemaal links in de <ul>, de tweede helemaal rechts. En omdat de <ul> horizontaal gecentreerd is, staan de knoppen automatisch ook netjes in het midden van het venster van de browser.
a
Alle links. Dat zijn er hier maar twee: eentje voor elke knop.
position: relative;
Door een relatieve positie te geven aan de link te geven, ook al vul ik daar verder niets bij in, kan ik kinderen van de link positioneren ten opzichte van de link. Dat doe ik bij a span met de in de link zittende span met tekst.
display: block;
Van zichzelf is een link een inline-element. Door er een blok-element van te maken, kan ik eigenschappen als breedte en hoogte gebruiken.
width: 200px; height: 207px;
In de link zit een afbeelding. Bij hoveren over de link en als de link focus heeft, wordt deze afbeelding verplaatst. De link zelf blijft gewoon op dezelfde plaats staan. De link heeft een witte achtergrond en een zwarte rand, die normaal genomen precies samenvallen met de afbeelding. Daarvoor moet de link precies even groot zijn als de afbeelding.
De in de link zittende afbeelding is 180 px breed en 187 px hoog. Omdat de afbeelding een padding van 10 px heeft, komt daar aan alle kanten nog 10 px bij. Dat levert een breedte van 200 px en een hoogte van 207 px op. Dat is dus ook de grootte die de link moet krijgen.
border: black solid 1px;
Zwart randje van 1 px breed.
-moz-border-radius: 15px; -webkit-border-radius: 15px; border-radius: 15px;
Hier staat drie keer hetzelfde op drie verschillende manieren: border-radius: 15px;. Waarom dat zo is, staat bij De voorvoegsels -moz-, -ms-, -o- en -webkit-.
Maak ronde hoeken. Omdat ik maar één maat opgeef, wordt de hoek zuiver cirkelvormig. Zowel de achtergrond als de border krijgen deze hoek.
text-decoration: none;
Tekst in een link wordt normaal genomen onderstreept. Dat wil ik hier niet.
color: black;
Tekst in een link krijgt normaal genomen een afwijkende kleur. Ook dat wil ik hier niet.
background: white;
Witte achtergrond.
Als de afbeelding verschuift, blijft de link gewoon op z'n plaats staan. Hierdoor wordt de witte achtergrond van de link zichtbaar.
img
Alle afbeeldingen. Dat zijn er hier maar twee.
Ja, ik weet het, de css bij deze selector ziet er vreselijk uit. Haal even adem, doe even een yoga-oefening of laat de hond van de buren uit, en kom dan terug. Dit lijkt erger dan het is. En bedenk hoeveel indruk je op verjaardagen kunt maken, als je deze css als modern gedicht voordraagt. Wat zeg ik, voordraagt? Op gedragen toon declameren!
position: relative;
De afbeelding zit in een link, die ik bij a precies even groot heb gemaakt als deze afbeelding. De afbeelding vult dus exact de hele link.
Maar rondom de afbeelding zit een border van 1 px breed, net als rondom de link. Hierdoor komt de afbeelding 1 px te laag en 1 px te veel naar rechts te staan. De afbeelding wordt immers, met border en al, netjes tegen de boven- en linkerkant van de link gezet.
De border van de link speelt daarbij niet mee: de afbeelding met de om de afbeelding zittende border wordt binnen de link gezet, niet binnen de border rondom de link.

Linkerbenedenhoek zonder correctie voor de border.
Hierdoor komen border van link en afbeelding aan de linkerkant en bovenaan naast elkaar te staan, niet over elkaar heen. Daardoor wordt de border links en boven 2 px breed in plaats van 1 px. (Bovendien komt de afbeelding 1 px te laag en te veel naar rechts te staan, maar dat zie je pas als over de link hovert, omdat de onderste en de rechter border dan 1 px lijken te verspringen.)
Op de afbeelding links is de border sterk vergroot, waardoor duidelijk het verschil in dikte tussen de border links en onder is te zien.
Verder moet ik een z-index gebruiken om te voorkomen dat de tekst van de link boven de afbeelding komt te staan. En een z-index kan alleen worden gebruikt bij elementen, die absoluut, fixed of relatief gepositioneerd zijn.
top: -1px; left: -1px;
Afbeelding 1 px hoger en 1 px naar rechts zetten om de reden die gelijk hierboven wordt omschreven.
z-index: 10;
De in de link zittende tekst zit in een span. Deze komt in de html na de afbeelding en is ook nog absoluut gepositioneerd. Hierdoor komt de tekst boven de afbeelding te staan en zou dus altijd zichtbaar zijn, ook zonder hoveren of zo.
De standaardwaarde van z-index is auto. Normaal genomen is dat hetzelfde als 0. Door deze z-index hoger te maken, komt de afbeelding toch boven de tekst te staan.
border: black solid 1px;
Zwartje randje van 1 px dik rondom de afbeelding.
padding: 10px;
Omdat het niet mooi is als de zwarte rand pal tegen de afbeelding staat, geef ik wat afstand tussen afbeelding en rand.
-moz-border-radius: 15px; -webkit-border-radius: 15px; border-radius: 15px;
Hier staat drie keer hetzelfde in drie verschillende varianten: border-radius: 15px;. Waarom dat zo is, staat bij De voorvoegsels -moz-, -ms-, -o- en -webkit-.
Twee van de drie vallen dus eigenlijk weg. Ik zei toch al dat het erger lijkt dan het is? Dadelijk gaan we pas echt opruimen...
Maak ronde hoeken. Omdat ik maar één maat opgeef, wordt de hoek zuiver cirkelvormig. Afbeelding, achtergrondkleur en border krijgen allemaal deze zelfde hoek.
background: white;
Rondom de afbeelding is een padding van 10 px aangebracht. Van zichzelf is een element doorzichtig. Dus als de afbeelding wordt verplaatst, zie je door deze padding heen de onderliggende pagina. Dat wordt voorkomen door de afbeelding een witte achtergrond te geven.
De padding bij een element krijgt altijd dezelfde achtergrondkleur als het element zelf. Dat is dus anders dan bij een marge, want die krijgt geen achtergrondkleur.
-moz-transition: top 0.4s ease-out, left 0.6s ease-out 0.2s, -moz-box-shadow 0.4s 0.1s; -webkit-transition: top 0.4s ease-out, left 0.6s ease-out 0.2s, -webkit-box-shadow 0.4s 0.1s; -o-transition: top 0.4s ease-out, left 0.6s ease-out 0.2s, box-shadow 0.2s 0.1s; -ms-transition: top 0.4s ease-out, left 0.6s ease-out 0.2s, box-shadow 0.2s 0.1s; transition: top 0.4s ease-out, left 0.6s ease-out 0.2s, box-shadow 0.2s 0.1s;
De eerder beloofde échte opruiming. Hier staat vijf keer hetzelfde, in vijf verschillende varianten:
transition: top 0.4s ease-out, left 0.6s ease-out 0.2s, box-shadow 0.2s 0.1s;
Waarom dat zo is, staat bij De voorvoegsels -moz-, -ms-, -o- en -webkit-.
Maar geef toe dat dit 'n slok op 'n borrel scheelt in de hoeveelheid css. En we hoeven ons dus alleen maar hiermee bezig te houden, niet met de vier andere varianten, want die werken – als het goed is – precies hetzelfde.
transition geeft aan dat de overgang van de ene weergave naar de andere geleidelijk aan moet verlopen.
Bij bijvoorbeeld border kun je kiezen voor een uitgebreide omschrijving per onderdeel of voor zogenaamde shorthand-notatie. Bij border is dat het beknopte
border: black solid 1px;
tegenover het veel uitgebreidere
border-color: black; border-style: solid; border-width: 1px;
Bij transition is ook zo'n shorthand-notatie mogelijk, die er alleen iets lastiger uitziet. Bij transition is het
transition: left 0.6s ease-out 0.2s
tegenover
transition-property left; transition-duration: 0.6s;, transition-timing-function: ease-out; transition-delay: 0.2s;
Bovendien kun je bij transition meerdere eigenschappen achter elkaar neerzetten, en dan gaat het helemaal schelen. Zonder shorthand-notatie moet je deze hele riedel herhalen voor élke eigenschap die je wilt veranderen.
Bij bovenstaande selector geef ik aan dat de verandering top, left en box-shadow betreft. De verschillende eigenschappen worden door een komma gescheiden.
Ik heb de huidige waarden van deze eigenschappen eerst op de normale manier opgegeven. De nieuwe waarden geef ik pas verderop bij :hover, :focus en :active op.
Oude en nieuwe waarden worden dus volledig op de gebruikelijke manier opgegeven. transition geeft alleen maar aan, voor welke eigenschappen transition geldt, en op welke manier de verandering moet worden uitgevoerd.
Als de verandering voor álle eigenschappen geldt, kun je ook all gebruiken. Maar dat kan alleen als alle waarden voor alle eigenschappen hetzelfde zijn.
transition werkt alleen voor eigenschappen die geleidelijk kunnen veranderen. Niet alle eigenschappen kunnen dat. Een lijst van eigenschappen waar transition voor werkt is te vinden bij www.w3.org/TR/css3-transitions. (Mogelijk moet je even zoeken naar de nieuwste versie van de specificatie.)
De volgorde bij elke eigenschap is steeds hetzelfde.
Als eerste komt de naam van de eigenschap, die veranderd moet worden. Deze waarde moet altijd worden opgegeven.
De tweede waarde geeft in seconden de tijd aan, dat de verandering moet duren. Deze waarde moet altijd worden opgegeven.
De derde waarde geeft aan op welke manier de verandering moet worden uitgevoerd. Als je hier niets invult, wordt de standaardwaarde ease gebruikt.
De vierde waarde geeft in seconden de wachttijd aan, voordat de verandering wordt begonnen. Als je hier niets invult, wordt gelijk begonnen.
top 0.4s ease-out:
Dit geldt voor de eigenschap top.
De verandering wordt uitgesmeerd over 0.4seconde. Er wordt een punt, geen komma, gebruikt om de decimalen aan te geven.
De manier waarop de verandering wordt uitgevoerd is ease-out. Dit bleek het beste te werken hier, andere waarden gaven een schokkerige beweging.
De vierde waarde is niet ingevuld, dus de verandering wordt zonder vertraging gelijk begonnen.
De oorspronkelijk hier opgegeven waarde is -1 px. Bij hoveren over de link of als deze focus heeft, is de waarde -40 px. Er vindt dus een verplaatsing omhoog plaats over 39 px, uitgesmeerd over 0,4 seconde, die gelijk begint.
left 0.6s ease-out 0.2s:
Dit geldt voor de eigenschap left.
De verandering wordt uitgesmeerd over 0.6seconde. Er wordt een punt, geen komma, gebruikt om de decimalen aan te geven.
De manier waarop de verandering wordt uitgevoerd is ease-out. Dit bleek het beste te werken hier, andere waarden gaven een schokkerige beweging.
Er is een vierde waarde van 0.2seconde, dus er wordt 0,2 seconde gewacht voor met de horizontale beweging wordt begonnen. Er wordt een punt, geen komma, gebruikt om de decimalen aan te geven.
De oorspronkelijk hier opgegeven waarde is -1 px. Bij hoveren over de link of als deze focus heeft, is de waarde -15 px. Er vindt dus een verplaatsing naar links plaats over 14 px, uitgesmeerd over 0,6 seconden, die pas na 0,2 seconde begint.
box-shadow 0.2s 0.1s:
Dit geldt voor de eigenschap box-shadow.
De verandering wordt uitgesmeerd over 0.2seconde. Er wordt een punt, geen komma, gebruikt om de decimalen aan te geven.
De soort beweging is niet ingevuld, daardoor wordt de standaardwaarde ease gebruikt.
Er is een tweede tijd van 0.1seconde ingevuld. Hoewel er geen soort beweging, de derde waarde, is ingevuld, levert dat geen problemen op. Er zijn hooguit twee tijden, en een eventuele tweede tijd is áltijd de vertraging aan het begin. Hier dus 0,1 seconde. Er wordt een punt, geen komma, gebruikt om de decimalen aan te geven.
Oorspronkelijk is bij deze selector helemaal geen box-shadow opgegeven. Bij hoveren over de link of als deze focus heeft, moet wel een box-shadow verschijnen. Bij a:hover img, a:focus img, a:active img wordt opgegeven:
box-shadow: 9px 15px rgba(200, 200, 200, 0.8);
Deze schaduw moet dus vanuit het niets (geen schaduw opgegeven) in 0,2 seconde worden gevormd, met een vertraging aan het begin van 0,1 seconde.
Bij Opera is de schaduw gelijk volledig zichtbaar, zie daarvoor verder bij Bekende problemen.
De beste eventuele derde waarde, de soort beweging, is alleen maar met in mijn ogen superhoge wiskunde te vinden. Daarom het advies zoals je dat vrijwel overal ziet: gewoon even uitproberen. Er zijn maar zes mogelijkheden: ease, ease-in, ease-out, ease-in-out, linear en cubic-bezier. De standaardwaarde is ease. Deze zes mogelijkheden gewoon even proberen kost aanzienlijk minder tijd dan een spoedcursus doctoraal wiskunde. Als je al geen hoogleraar moet zijn om die berekeningen te begrijpen. Brrr.
a span
De spans die binnen een link liggen. Dat is hier bij elke link maar één span: de span waar de tekst van de link in staat. Door deze tekst in een eigen span te stoppen, kan ik hem opmaken zonder de rest van de link te beïnvloeden.
position: absolute;
Om de span, en dus de daarin zittende tekst, op de juist plaats te kunnen zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die zelf een fixed, absolute of relatieve positie heeft. Dat is hier de <a> waar de span in staat.
Een span is van zichzelf een inline-element. Door de span absoluut te positioneren, verandert deze in een blok-element en kan ik eigenschappen als breedte gebruiken.
bottom: 0; left: 0;
De span, en dus de daarin zittende tekst, helemaal linksonder in de link neerzetten.
width: 200px;
De span even breed als de link maken. Als ik nu de tekst binnen de span horizontaal centreer, staat hij ook gelijk horizontaal gecentreerd binnen de link.
font-size: 1.9em;
Lekker grote letter. Als eenheid neem ik em, zodat ook gebruikers van Internet Explorer de lettergrootte kunnen veranderen.
text-align: center;
Tekst horizontaal centreren binnen de span. Omdat de span even breed is als de link, staat de tekst dan ook gelijk horizontaal binnen de link gecentreerd.
a:hover img, a:focus img, a:active img
Als ik over een link hover, of als de link focus heeft, of als de link actief is, doe dan iets met de daarin zittende afbeeldingen. Hier zijn maar twee links, en binnen elke link zit maar één afbeelding.
Waarom hier ook :active staat, kun je lezen bij Alleen :hover of :hover, :focus en :active?
top: -40px; left: -15px;
Verplaats de afbeelding 40 px naar boven en 15 px naar links ten opzichte van de positie die hij normaal genomen zou innemen.
Omdat de afbeelding bij img relatief is gepositioneerd, heeft de rest van de pagina van deze verplaatsing geen last. Bij een relatieve positionering wordt het element wel op een andere plaats getoond, maar in werkelijkheid blijft het gewoon op z'n eigenlijke plaats staan. Alleen op het scherm verandert de plaats. Hierdoor zullen buur-elementen niet mee verschuiven.
Als ik bijvoorbeeld zou verplaatsen door een negatieve marge op te geven, wordt de afbeelding daadwerkelijk verplaatst. Daardoor zouden buur-elementen opzij worden geduwd, wat een enorm onrustig beeld oplevert.
-moz-box-shadow: 9px 15px rgba(200, 200, 200, 0.8); -webkit-box-shadow: 9px 15px rgba(200, 200, 200, 0.8); box-shadow: 9px 15px rgba(200, 200, 200, 0.8);
Hier staat drie keer hetzelfde in drie verschillende varianten:
box-shadow: 9px 15px rgba(200, 200, 200, 0.8);
Waarom dat zo is, staat bij De voorvoegsels -moz-, -ms-, -o- en -webkit-.
Het eerste getal geeft de plaats en de breedte van de schaduw in horizontale richting aan. Een positief getal betekent, dat de schaduw rechts van het element komt. Een negatief getal zorgt ervoor, dat de schaduw links van het element komt te staan. De schaduw komt hier dus rechts te staan en is 9 px breed.
Het tweede getal geeft de plaats en de breedte in verticale richting aan. Een positief getal betekent, dat de schaduw onder het element komt. Een negatief getal zorgt ervoor, dat de schaduw boven het element komt te staan. De schaduw komt hier dus aan de onderkant te staan en wordt 15 px breed.
Omdat de schaduw gedeeltelijk over de tekst in de link heen komt te staan, heb ik hem doorzichtig gemaakt. Dat regel je met rgba en de daarachter staande getallen.
Meestal wordt voor 'n kleur de hexadecimale notatie gebruikt. Daarbij worden niet alleen cijfers, maar ook letters gebruikt. 0 t/m 9 werken precies hetzelfde als altijd, maar na de 9 komen nog A, B, C, D, E en F.
Als je telt is 't dus: 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12, enz. Daarbij is A gelijk aan het tientallige 10, B aan 11, enz. Op deze manier kun je met twee cijfers en/of letters 256 mogelijkheden aangeven: van 00 t/m FF.
De eerste drie getallen bij rgba geven de kleur aan. Deze lopen van 0 t/m 255, dus ook hiermee kun je 256 mogelijkheden aangeven. En omdat er drie getallen zijn levert dat 256 x 256 x 256 = 16.777.216 mogelijke kleuren op, net iets meer dan het aantal kleurpotloden in de gemiddelde kleurdoos van 'n kind.
De notatie bij rgba geeft dus precies evenveel mogelijkheden als de hexadecimale.
Het eerste getal staat voor rood, het tweede voor groen en het derde voor blauw (feitelijk de Engelse namen, maar de eerste letter is toevallig in het Nederlands hetzelfde). Uit deze drie kleuren zijn alle kleuren op een monitor opgebouwd.
255 wil zeggen volledig aanwezig, 0 wil zeggen helemaal ontbrekend.
255, 255, 255 levert wit op, 0, 0, 0 zwart.
In dit voorbeeld heb ik bij deze schaduw alle drie kleuren een even grote waarde gegeven: 200. Drie gelijke waarden levert altijd zwart, wit of grijs op. In dit geval grijs.
In plaats van getallen mag je ook percentages gebruiken, bijvoorbeeld: rgba(10%, 20%, 100%, 0.8)
Het vierde getal staat voor het alfa-kanaal. Hiermee wordt de doorzichtigheid aangegeven. Dit getal loopt van 0 naar 1. Volledig doorzichtig is 0, volledig ondoorzichtig is 1.
Het getal voor het alfa-kanaal wordt in breuken aangegeven, dus bijvoorbeeld 0.5 wil zeggen halfdoorzichtig. Let erop dat je 'n punt gebruikt, de Amerikaanse manier om breuken aan te geven. Als je 'n komma gebruikt denkt de browser dat er twee verschillende getallen staan.
In dit voorbeeld is deze schaduw een beetje doorzichtig: 0.8. Deze doorzichtigheid is voldoende om de grote letters eronder te kunnen zien.
<!--[if IE 7]>
<style type="text/css">
a:hover img, a:active img {border: #000001 solid 1px;}
</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 die uit de algemene stylesheet dan in principe overrulen.
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 7]>
<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 7 in. De css voor Internet Explorer 7 komt dan apart in die stylesheet te staan, zodat het de andere browsers niet stoort.
Het is belangrijk dat de spaties in <!--[if IE 7]> en <![endif]--> precies zo worden overgenomen, zoals ze hier staan.
a:hover img, a:active img
Doe iets met de afbeeldingen binnen een link, maar alleen als over de link wordt gehoverd of als deze actief is. Dit zijn hier alleen de twee knoppen.
:active werkt in Internet Explorer 7 zoals :focus in alle andere browsers (inclusief Internet Explorer 8 en later) werkt. Dit is foutief geïmplementeerd in Internet Explorer 7 en eerder. :focus werkt helemaal niet in Internet Explorer 7.
Deze selector geldt dus in feite als over de link wordt gehoverd, of als deze focus heeft.
border: #000001 solid 1px;
Verander de kleur van de rand rondom de afbeelding.
Die rand was zwart. Dat is als hexadecimale kleurcode #000000. Met een hexadecimale kleurcode kun je 16.777.216 mogelijke kleuren aangeven.
#000001 is voor een mens niet te onderscheiden van #000000. Van deze kleurverandering zie je dus helemaal niets. Waarom ik het dan doe?
Ook Internet Explorer 7 is nog steeds een waar bug-paradijs. Om wat voor reden dan ook verschuift de afbeelding niet bij hoveren of als de link focus heeft. Als ik echter de rand rondom de afbeelding één tint wijzig, werkt het wel.
Internet Explorer 6 zat helemaal stampvol met dit soort hoog-technologische bugs, maar ook Internet Explorer 7 kan er nog wat van. Dit soort subtiele bugs is zo geniaal, dat je technisch wel zeer begaafd moet zijn om dit in elkaar te broddelen. Compliment aan Microsoft voor hun fantastische verzameling bugs!
(Overigens heeft elke browser dit soort bugs. Maar Microsoft is de enige die weigert bugs in de weergave te repareren. Pas bij een volledig nieuwe versie wordt een bug, als je geluk hebt, gerepareerd.)
Dat die verandering van kleur werkt, heb ik ooit bij toeval ontdekt. Ongetwijfeld zijn er ook andere oplossingen mogelijk, maar dit is simpel en 't werkt.
<!--[if IE 8]>
<style type="text/css">
a:focus {};
</style>
<![endif]-->
Deze code geldt alleen voor Internet Explorer 8. Uitleg zie bij Speciaal voor Internet Explorer 7.
a:focus {};
Dit slaat helemaal nergens op. Het moet aan het einde van de css staan, na alle andere css.
In Internet Explorer 8 blijkt een bug te zitten: als je met de Tab-toets van knop naar knop gaat, blijft de afbeelding overal op de gewijzigde plaats staan. Kennelijk wordt de focus niet naar de volgende knop verplaatst, wat duidelijk 'n bug is.
Bovendien werkt dit ook als je #het-paard-van-sinterklaas:focus {} gebruikt, wat natuurlijk gewoon genegeerd hoort te worden, omdat er helemaal geen paard van Sinterklaas in dit voorbeeld aanwezig is. Het maakt niet uit wat er voor de :focus {} staat, als dit maar onderaan in de css staat.
Omdat dit overduidelijk 'n bug is, zet ik het apart voor Internet Explorer 8, dan hebben andere browsers er geen last van.
Trouwens 'n aardig voorbeeld van een gekmakende bug. Ik heb deze bug bij een eerder voorbeeld ontdekt. In dat voorbeeld werkte op de site alles goed, maar in de download niet. In de stylesheet die bij dat voorbeeld op de site hoorde, stond namelijk 'n heel eind verder iets wat eindigde op :focus. Maar wel met drie id's ervoor die geen van drieën in dat voorbeeld voorkwamen. Die :focus verderop had dus gewoon volkomen genegeerd moeten worden. Mooi niet dus...
Die css stond niet in de download, want daar staat alleen de css in die bij het voorbeeld uit de download hoort. Door bovenstaande regel toe te voegen aan de css in de download, bleek de focus ook in Internet Explorer 8 op de juiste wijze te veranderen.
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 'n duur product (299 dollar) van Microsoft wilt gebruiken, neem dan Microsoft Expression Web 2. Andere uitvoeringen zijn nog veel duurder.
Je kunt natuurlijk ook het gratis programma Kompozer, de opvolger van nvu, gebruiken. Dit programma is te downloaden vanaf www.kompozer.net/download. Meer links over Kompozer 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.
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 html 5. 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 html 5 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 html 5. Met een transitional doctype en het gebruik van afgekeurde tags kun je niet overstappen naar html 5. 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.
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 html 5 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 menu, header, en dergelijke, 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 zijn een volstrekt verouderde techniek, die heel veel nadelen met zich meebrengt. Deze zijn hier netjes op een rijtje gezet: Webrichtlijnen. iframes hebben voor een deel dezelfde nadelen.
Als je 'n stuk code vaak wilt gebruiken, zoals 'n menu dat op elke pagina hetzelfde is, include dat dan met PHP of SSI. Dan ziet iedereen (ook 'n zoekmachines dus!) alles als één pagina in plaats van als los zand aan elkaar hangende teksten.
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 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. Hetzelfde 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. Nog een soortgelijk gratis programma is WebFormator.
De Firefox-extensie Web Developer heeft de mogelijkheid om 'n pagina te bekijken zonder css en/of afbeeldingen.
Tenslotte 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
www.webrichtlijnen.nl/toetsen De enige Nederlandstalige site. Test op toegankelijkheid.
Laatst gecontroleerd op 12 september 2011.
Dit voorbeeld is getest in Firefox, Opera, Safari, Google Chrome, Internet Explorer 7, 8 en 9 in de resoluties 800x600, 1024x768 en 1280x1024. 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 en 1280x1024 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 staan bij Bekende problemen.
Naast deze 'gewone' browsers is alles ook getest in Lynx, WebbIE, Jaws 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. Jaws is een screenreader, zoals die door blinden wordt gebruikt. Fangs Screen Reader Emulator is een extensie bij Firefox, die een screenreader simuleert.
Als het voorbeeld in deze drie 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.
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!)
31 december 2010:
Nieuw opgenomen.
11 september 2011:
-moz- geüpdatet.transform gebruikt, waar transition moest staan.-mozkit-. Dat hoorde -moz- te zijn. Wel geestig gevonden...Omdat in de css gebruik wordt gemaakt van voorvoegsels als -moz-, valideert de css niet. Ook herkent de validator transition nog niet. Omdat de reden van het niet-valideren bekend is, lijkt me dat hier geen probleem.
Als de lettergrootte sterk wordt vergroot, kan de tekst gedeeltelijk onder de afbeelding blijven staan, ook als deze wordt verplaatst. De oplossing is simpel: verplaats de afbeelding meer, of maak de letters kleiner, zodat ze bij vergroten niet té groot worden.
Als een of meer van de gebruikte css 3-eigenschappen niet werkt, zal de afbeelding nog steeds gewoon verplaatst worden bij hoveren over de link of als deze focus heeft. Alleen de extra toeters en bellen missen, maar alles werkt nog gewoon. Bij Opmerkingen staat een afbeelding hoe het er in Internet Explorer 7 uitziet.
Bij Opera verandert de box-shadow niet. Deze staat gelijk op de volle breedte, terwijl bij transition wel is opgegeven dat ook deze moet veranderen. In Google Chrome, Safari en Firefox verschijnt de schaduw wel met enige vertraging.
Het is onduidelijk wie het hier bij het rechte eind heeft, en hoe dit uiteindelijk zal werken. Volgens de specificatie zou text-shadow moeten werken in combinatie met transition. box-shadow wordt niet genoemd bij de specificatie voor transition.
Maar bij de specificatie voor text-shadow wordt weer deels verwezen naar box-shadow. Beetje onduidelijk allemaal.
Veel maakt het niet uit, het is alleen net iets mooier als de schaduw ook geleidelijk zichtbaar wordt.
Ronde hoeken zijn niet te combineren met position: relative;.
border-radius werkt sowieso niet in Internet Explorer 7 en 8, maar je kunt toch ronde hoeken krijgen door gebruik van een zogenaamde behavior. Alleen werkt dat hier dus ook niet.
rgba() en box-shadow werken ook niet in deze browsers. Omdat mijn masochistische tijdperk inmiddels achter mij ligt, heb ik dit verder ook niet uitgeprobeerd met behavior, filter, astrologie, hypnose, voodoo of bij het technisch niveau van Internet Explorer passende technieken. Jomanda wilde wel, maar was te duur. Dus helaas...In Internet Explorer 7 en 8 wordt dus alleen de afbeelding verplaatst, meer niet. Maar de tekst in de link is nog steeds goed te zien, dus alleen de extra toeters en bellen vallen weg.
Mogelijk werkt een oplossing met een JavaScript-bibliotheek wel. Op de pagina met links staan onder css → Bugs en hacks → Dingen mogelijk maken in Internet Explorer links naar onder andere dat soort bibliotheken. Wat 's werelds grootste softwarebedrijf kennelijk niet voor elkaar kan krijgen, lukt vaak onbetaalde vrijwilligers wel.
Internet Explorer 9 gaat ondersteuning voor box-shadow, rgba() en border-radius krijgen.
Er is geëxperimenteerd met transition, maar het lijkt er niet op dat dit in de uiteindelijke Internet Explorer 9 wordt opgenomen. Voor het geval dat toch nog zou gebeuren, is ook -ms-transition gebruikt.