Uitleg knoppen met toelichting en indicatie van huidige, bezochte en onbezochte pagina's
Laatst aangepast: .

Korte omschrijving
Menu met acht knoppen. In bredere browservensters verschijnt bij hoveren over of aanraken van een knop een bijpassende tekst. Een onderstreping geeft aan, of de link al is bezocht.
BELANGRIJK
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.
Opmerkingen
- De gebruikte gradiënten zijn gemaakt met behulp van de gradiënt generator op colorzilla.com.
-
Bij
#toon-menu
is een extra animatie met de naam 'bugfix' toegevoegd. Deze is om een bug in oudere versies van Android browser te omzeilen. Deze bug zorgt ervoor dat 'menu open' niet in 'menu dicht' verandert, en omgekeerd.Op dezelfde pagina wordt ook een bug in oudere versies van iOS gemeld, met de oplossing daarvoor: het toevoegen van
onclick
bij#toon-menu
. Hoewel ik zelf niet test op die oudere versies, is er niets op tegen om dit toe te voegen, dus dat heb ik voor de zekerheid maar gedaan. - Aantal knoppen, grootte en vorm, kleuren, enz. kunnen natuurlijk worden aangepast.
-
Omdat zonder css de pop-ups niet zichtbaar zijn, moet je nooit belangrijke informatie alleen via dit soort pop-ups geven. Dit soort pop-ups is alleen geschikt voor aanvullende, niet-essentiële informatie.
Voor de pop-ups is gebruikt gemaakt van de css-eigenschap
content
. Ik geeft direct toe dat je 'n hele discussie kunt voeren, of css hier wel voor bedoeld is. Je voegt daadwerkelijke tekst toe, dus werkelijke inhoud, via een taal die bedoeld is voor de opmaak. Er is zeker heel veel voor te zeggen dit niet te doen. In dit geval vind ik het wel acceptabel, omdat het puur bedoeld is voor extra, niet belangrijke, aanvullende informatie. - Als je 'n link hebt bezocht, verandert het lijntje onder de link. Om de oorspronkelijke kleuren van een onbezochte link weer terug te krijgen, moet je de geschiedenis van je browser verwijderen. Of, als de browser die mogelijkheid biedt, alleen de bij de links horende pagina's verwijderen uit de geschiedenis.
-
Als je wilt zien, hoe deze lay-out verandert bij verschillende breedtes, kun je het venster van de browser breder en smaller maken. Als je scherm niet breed genoeg is voor de grotere breedtes, kun je deze simuleren op een site als infobyip.com. Firefox heeft onder Extra → Webontwikkelaar → Responsive Design Weergave een ingebouwde mogelijkheid om grotere breedtes weer te geven.
Overigens werkt in- en uitzoomen in alle desktopversies van browsers, behalve Safari op OSX en de startscherm-versie van Internet Explorer 10, hetzelfde als een smaller of breder venster. In deze browsers kun je een smaller of breder venster dus ook simuleren door in- of uitzoomen.
-
Tradities zijn er om in ere te houden, en ook Microsoft doet daar van harte aan mee. Vandaar dat onder Bekende problemen de traditionele lijst met fouten, afwijkingen, storingen, ordinaire pesterijen, vlagen van acute verstandsverbijstering, niet-werkende dingen, en nog wat andere feestelijkheden staat voor (oudere versies van) Internet Explorer. Soms staat er, ondanks Microsoft, zelfs een oplossing bij.
(Wat ik toch tegen Internet Explorer heb? Met ingang van versie 9 niet zoveel meer. Maar omdat Microsoft haar browsers nooit update, op veiligheids-updates na, loopt elke browser vanaf het moment van verschijnen achter en verandert gelijk in een aftands blok aan het been. Waardoor je dus gedwongen bent om voor alle oude meuk van Microsoft jarenlang extra moeite te doen.)
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 (Kubuntu). Daarbij is vooral gebruik gemaakt van Komodo Edit, GIMP en Firefox met extensies. De pdf-bestanden zijn gemaakt met LibreOffice.
Vragen of opmerkingen? Fout gevonden? Ga naar het forum.
Achterliggend idee
In de vorige versie was het leven nog mooi, omdat touchscreens nog nauwelijks gebruikt werden. De pop-ups konden gewoon met :hover
worden gemaakt en iedereen was gelukkig en tevreden. Toen vonden computerfabrikanten het nodig om machines te maken, die alleen reageren op zware handtastelijkheden: touchscreens.
Bij touchscreens werkt :hover
niet zonder meer. Je kunt er wel met je neus of 'n ander uitstekend lichaamsdeel vlak boven gaan hangen, maar dat levert in het gunstigste geval alleen 'n vies scherm op. Daarom moest de code ingrijpend worden gewijzigd, om dit menu ook op touchscreens werkend te krijgen.
De code valt in twee grote delen uiteen: browservensters smaller dan 740 px en vensters breder dan 740 px. Die tweedeling wordt bereikt door nieuwe @media-regels uit css3 te gebruiken. Elke browser gebruikt de css voor smallere vensters. Pas als de browser daadwerkelijk meldt dat het venster breder is, wordt de css voor browservensters breder dan 740 px gebruikt. Hierdoor werkt dit menu ook in heel oude en heel simpele browsers.
Vensters smaller dan 740 px
In zo'n smal venster zullen mensen niet zitten wachten op een menu, dat voortdurend aanwezig is en voortdurend een deel van de schaarse ruimte in beslag neemt.
In deze vensters staat daarom bovenaan de pagina alleen een balk met daarin de tekst 'Menu open' of 'Menu dicht'. Deze tekst staat in een <label>. Dat <label> hoort bij een checkbox.
De checkbox zelf wordt verborgen, zodat je hem niet ziet. Maar dat maakt voor de werking verder niets uit. Door op het bijbehorende <label> te klikken of door dit aan te raken, wordt de checkbox gewoon uit‑ of aangevinkt, of je hem nu ziet of niet.
Een van de nieuwe pseudo-classes uit css3 is :checked
. Door als selector combinaties als :checked + #menu
te gebruiken, kun je iets op het scherm veranderen, afhankelijk van of de checkbox :checked
(aangevinkt) is of niet.
Het woordje 'Menu' staat altijd op het scherm, maar de daaropvolgende woordjes 'open' of 'dicht' zijn afhankelijk van het al dan niet aangevinkt zijn van de checkbox. Ze worden met behulp van content
gegenereerd.
Het menu zelf heeft normaal genomen een breedte van 0 px, waarbij overflow
op hidden
is gezet. Hierdoor is het menu normaal genomen onzichtbaar. Als de checkbox is aangevinkt, krijgt het menu een breedte, waardoor het zichtbaar wordt en gebruikt kan worden.
Het geheel is wat opgeleukt met transition
en kadertjes en zo, maar dat is voor de verdere werking niet echt van belang.
Vensters breder dan 740 px
Bij gebruik van een muis opent bij hoveren over een knop een kleine pop-up. Pas bij klikken wordt de link gevolgd. De pop-up kan hierbij gewoon in een span binnen de link zitten. Maar als je zo'n pop-up op een touchscreen gebruikt, kom je in de problemen.
Op iOS laten Safari en Chrome for iOS de pop-up even heel kort zien, waarna de link wordt gevolgd. Opera Mini laat de pop-up niet zien, maar volgt gelijk de link.
In Android 4.0.3 laten Chrome voor mobiel, Opera, Firefox en Android browser de pop-up heel kort zien, waarna de link wordt gevolgd.
In Android 2.3.6 tonen Opera, Opera Mini en Firefox de pop-up heel kort, waarna de link wordt gevolgd. Android browser volgt gelijk de link, zonder de pop-up te tonen.
In Windows 8 werkt het bij gebruik van een muis, maar bij gebruik van een touchscreen toont Internet Explorer 10 de pop-up heel kort. Firefox, Opera en Google Chrome volgen gelijk de link, zonder de pop-up te tonen.
Kortom: een pop-up binnen een span werkt niet. Logisch ook, want gewoon hoveren werkt niet op een touchscreen. Als je de link aanraakt, is het logisch dat die gelijk wordt gevolgd en niet eerst een pop-up opent.
Om een en ander werkend te krijgen op een touchscreen, moest er nogal wat aan de code worden gewijzigd.
De menubalk bestaat uit een gewone ongeordende lijst, met in elk lijst-item een link. Deze links worden echter aan de linkerkant buiten het scherm gepositioneerd. Pas bij hoveren over of aanraken van een van de knoppen in de menubalk, wordt de betreffende link op het scherm gezet.
In normale toestand, als er niet over de menubalk wordt gehoverd en deze niet wordt aangeraakt, staan er dus geen links binnen de menubalk. De tekst die bij de links hoort is wel zichtbaar, maar deze wordt gegenereerd met behulp van content bij de lijst-items. Voor het oog ziet het er dus uit, alsof er normale links binnen de menubalk staan, maar dat is niet zo.
De meeste screenreaders en dergelijke lezen gegenereerde tekst niet voor, wat hier een voordeel is, omdat dezelfde tekst ook nog 'ns binnen de 'echte' link staat.
Bij hoveren over of aanraken van een knop binnen de menubalk wordt de tekst binnen die knop onderstreept, waardoor deze er meer als een link uit gaat zien. Gelijktijdig verschijnen onder de menubalk links en rechts twee sluitknoppen. Deze zijn nodig voor iOS om de pop-up eventueel weer te kunnen sluiten.
Omdat er geen links binnen de menubalk staan, zijn onderstreping en sluitknoppen relatief simpel tevoorschijn te toveren. Want waar geen link staat, kan ook geen link voortijdig worden gevolgd. Hoveren over een <li> werkt op de normale manier, en met wat kleine aanpassingen heeft een aanraking van een lijst-item hetzelfde effect.
Tot nu toe staat er geen link binnen de menubalk. Maar op het moment dat een knop wordt aangeraakt, wordt de links buiten het scherm gepositioneerde link 0,24 seconde later binnen de bijbehorende knop geplaatst. Die 0,24 seconde bleek de tijd die minimaal nodig is om te voorkomen dat op een touchscreen de link wordt gevolgd. Omdat er bij aanraking gedurende 0,24 seconde helemaal geen link is, kan deze ook niet worden gevolgd.
De pop-up wordt met behulp van content
vanuit de link gegenereerd. Als de link na 0,24 seconde op z'n plaats staat, kan de pop-up gewoon worden getoond. Omdat het om met behulp van content
gegenereerde tekst gaat, wordt deze ook niet gelezen door de meeste screenreaders en dergelijke. Binnen deze tekst moet dus beslist geen belangrijke informatie worden neergezet.
Eventueel zou je de voor de pop-up gegeneerde tekst ook door gewone tekst binnen een span of zo kunnen vervangen, maar dan moet je die tekst wel op elke pagina in de html herhalen.
Als je een muis gebruikt, verschijnen bij hoveren over een knop sluitkruisjes en onderstreping. 0,24 seconde later staat de link op z'n plaats en kan worden geklikt om de link te volgen. Deze tijd is zo kort, dat het vrijwel onmogelijk is om binnen deze tijd te klikken. Zou dat wel gebeuren, dan wordt de link niet gevolgd, omdat deze stomweg nog niet aanwezig is. Als ik het heel geconcentreerd probeerde, lukte het mij een enkele keer om binnen die 0,24 seconde te klikken. Maar bij normaal gebruik zie ik dat niet zo snel gebeuren.
Op een touchscreen staat de link ook na 0,24 seconde op z'n plaats. Waarna de knop als een gewone link werkt. Bij een tweede aanraking wordt dus gewoon de link gevolgd.
Als mensen de Tab-toets gebruiken om van link naar link te gaan, wordt de link die focus heeft binnen de menubalk geplaatst. Om duidelijk te maken welke link focus heeft, krijgt deze een witte achtergrond. Omdat het wat verwarrend is als daar een vertraging van 0,24 seconde in zit, wordt bij gebruik van de Tab-toets de link zonder vertraging binnen de menubalk geplaatst.
Binnen elke link staat een span, die wordt gebruikt om de gekleurde streep onder de knoppen neer te zetten. Aan elke span wordt een achtergrondkleur gegeven. Deze achtergrondkleur is de gekleurde streep die je onder de knop ziet staan. Vanwege beveiliging kun je bij een bezochte link nog maar enkele dingen veranderen, waaronder de kleur van de achtergrond. Hierdoor kan de streep onder een bezochte link een andere kleur krijgen dan onder een nog niet bezochte.
Omdat de links normaal genomen aan de linkerkant buiten het scherm staan, worden de spans die voor de onderstreping zorgen normaal genomen ver naar rechts gepositioneerd, waardoor ze op de juiste plaats staan. Als de link in de menubalk wordt geplaatst, wordt de positionering van de onderstreping aangepast, waardoor deze ook nu weer op de juiste plaats staat.
Veel van de gebruikte selectors werken niet in Internet Explorer 8. Deze browser heeft daarom een hele serie eigen css. Als je even naar de lengte daarvan kijkt, begrijp je misschien waarom ik regelmatig in een woedekoliek over deze browser schiet. En Internet Explorer 6 en 7 waren nog véél erger... Wereldwijd moet het broddelwerk van Microsoft in de loop der jaren echt miljarden hebben gekost.
Los van wat hierboven staat, zijn er nog wat aanpassingen speciaal voor touchscreens nodig, omdat :hover anders niet of niet goed werkt. Deze staan verderop bij :hover, :focus en :active voor muis, toetsenbord, touchpad en touchscreen.
De voorvoegsels -moz-, -ms-, -o- en -webkit-
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.
Op webkit gebaseerde browsers, zoals Google Chrome en Safari: -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.
Als je css valideert met de w3c css-validator, moet je even instellen dat je geen foutmelding krijgt voor het gebruik van deze voorvoegsels.
In dit voorbeeld worden linear-gradient
, transition
, animation
, @keyframes
en user-select
gebruikt.
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 Safari herkent -webkit-linear-gradient
. Zodra Safari linear-gradient
gaat herkennen, zal dit -webkit-linear-gradient
overrulen, omdat het er later in staat. Dat ze er beide in staan, is dus geen enkel probleem.
linear-gradient
Op dit moment moet je nog het volgende schrijven:
{-webkit-gradient(linear...); -webkit-linear-gradient: ...; linear-gradient: ...;}
In de toekomst kun je volstaan met:
{linear-gradient: ...;}
Je moet twee vormen voor -webkit-
gebruiken, omdat de syntax voor linear-gradient
ingrijpend is gewijzigd. Oudere versies van Safari en andere op webkit gebaseerde browsers gebruiken de eerste vorm van -webkit-
.
Internet Explorer 10, Opera, Google Chrome en Firefox herkennen linear-gradient
zonder voorvoegsel. Browsers die linear-gradient
niet kennen, negeren deze eigenschap gewoon.
transition
Op dit moment moet je nog het volgende schrijven:
{-webkit-transition: …; transition: ...;}
In de toekomst kun je volstaan met:
{transition: ...;}
Internet Explorer 10, Opera, Google Chrome en Firefox herkennen transition
zonder voorvoegsel. Browsers die transition
niet kennen, negeren deze eigenschap gewoon.
animation en @keyframes:
Deze twee eigenschappen worden alleen maar gebruikt om een bug in sommige oudere op webkit gebaseerde browsers te repareren. Daarom hoeft alleen maar op browsers gelet te worden, die op webkit zijn gebaseerd. In dit geval is daarom het volgende voldoende:
{-webkit-animation: ...;}
Hetzelfde geldt voor @keyframes
:
@-webkit-keyframes {...}
In nieuwere browsers is deze bug niet meer aanwezig, dus de versie zonder voorvoegsel hoeft in dit geval helemaal niet gebruikt te worden.
(In het algemeen is het een bijzonder slechte gewoonte om van een eigenschap alleen één bepaalde versie te gebruiken. Dit gebeurt nogal eens voor iOS, waarmee Apple actief wordt geholpen om sites en dergelijke ontoegankelijk te maken voor andere browsers dan Safari. Ontwikkelaars die dit doen, werken mee aan de totstandkoming van eenzelfde wantoestand als in het verleden met het monopolie van Internet Explorer 6 heeft bestaan.
Maar in dit geval maakt het niet uit, omdat het alleen om een bug gaat. Andere browsers hebben deze css helemaal niet nodig.)
user-select:
Deze eigenschap wordt alleen maar gebruikt om een onhandigheid in Internet Explorer 10 op een touchscreen op te lossen. Daarom hoeft alleen maar op deze browser gelet te worden. In dit geval is daarom het volgende voldoende:
{-ms-user-select: …;}
Omdat niet duidelijk is, of dit probleem zich ook in nieuwere versies blijft voordoen, laat ik de vorm zonder -ms-
weg.
Semantische elementen en WAI-ARIA
Ik heb deze twee onderwerpen samengevoegd, omdat ze veel met elkaar te maken hebben.
Semantische elementen
De meeste elementen die in html worden gebruikt, hebben een semantische betekenis. Dat wil zeggen dat je aan de gebruikte tag al (enigszins) kunt zien, wat voor soort inhoud er in het element staat. In een <h1> staat een belangrijke kop. In een <h2> staat een iets minder belangrijke kop. In een <p> staat een alinea. In een <table> staat een tabel (en geen lay-out, als het goed is!). Enz.
Door het op de goede manier gebruiken van semantische elementen, kunnen zoekmachines, screenreaders, enz. de structuur van een pagina begrijpen. De spider van een zoekmachine is redelijk te vergelijken met een blinde. Het is dus ook in je eigen belang, om semantische elementen zo goed mogelijk te gebruiken. Een site die toegankelijk is voor mensen met een handicap, is in de regel ook goed te verwerken voor een zoekmachine en maakt dus een grotere kans gevonden en bezocht te worden.
Als het goed is, wordt het uiterlijk van de pagina bepaald met behulp van css. Het uiterlijk staat hierdoor (vrijwel) los van de semantische inhoud van de pagina. Met behulp van css kun je een <h1> heel klein weergeven en een <h6> heel groot, terwijl screenreaders, zoekmachines, en dergelijke nog steeds weten dat de <h1> een belangrijke kop is.
Slechts enkele elementen, zoals <div> en <span>, hebben geen semantische betekenis. Daardoor zijn deze elementen uitstekend geschikt, om met behulp van css het uiterlijk van de pagina aan te passen: de semantische betekenis verandert niet, maar het uiterlijk wel. Voor een screenreader of zoekmachine verandert er (vrijwel) niets, voor de gemiddelde bezoeker krijgt het door de css een heel ander uiterlijk.
(De derde laag, naast html voor de inhoud en css voor het uiterlijk, is JavaScript. Die zorgt voor de interactie tussen site en bezoeker. De min of meer strikte scheiding tussen css en html aan de ene kant en JavaScript aan de andere kant is met de komst van css3 en html5 veel vager geworden. Je kunt nu bijvoorbeeld ook met css dingen langzaam verplaatsen en met html deels de invoer in formulieren controleren. Maar op JavaScript ga ik op deze site verder niet echt in.)
Html5 heeft een aantal nieuwe elementen, die speciaal zijn bedoeld om de opbouw van een pagina aan te geven. In dit voorbeeld wordt hiervan <nav> gebruikt. <nav> gedraagt zich als een gewone <div>, maar dan een <div> met een semantische betekenis: het is bedoeld om een serie links voor navigatie in te zetten. Hierdoor kunnen screenreaders, zoekmachines, en dergelijke beter zien hoe de pagina is samengesteld.
Met behulp van dit soort nieuwe semantische elementen kan bijvoorbeeld een screenreader in één keer een hele header of <nav> passeren. Alleen hebben deze nieuwe elementen één probleem: ze hebben in de praktijk nog weinig nut, omdat screenreaders en dergelijke ze nog niet herkennen. En voordat alle screenreaders en dergelijke ze herkennen, zijn we jaren verder, want screenreaders zijn peperduur (behalve het uitstekende open source NVDA).
Maar er is niets op tegen, om ze nu vast te gaan gebruiken. Op het moment dat screenreaders, zoekmachines, enz. ze gaan herkennen, is de pagina dan al hierop voorbereid. Extra werk is het eigenlijk niet. Het intypen van <nav> gaat even snel als het intypen van <div>, en zeker sneller dan <div id="menu">,
zoals nu vaak gebeurt.
WAI-ARIA
Los van semantische elementen is er nog een hulpmiddel om pagina's beter toegankelijk te maken voor screenreaders en dergelijke: WAI-ARIA-ondersteuning. WAI-ARIA staat voor Web Accessibility Initiative – Accessible Rich Internet Applications.
WAI-ARIA is een hele serie codes die bijvoorbeeld aangeven, welk deel van een pagina een menu, een header, een footer, enz. is. Daarnaast kan WAI-ARIA bij bijvoorbeeld een formulier aangeven of iets is aangevinkt of niet. Voor blinden zijn dit soort zaken uiterst belangrijk (en dus ook voor zoekmachines).
Screenreaders en dergelijke kunnen al jaren WAI-ARIA-codes herkennen. Dat is nog niet het geval met de nieuwe semantische elementen uit html5, en dat zal ook nog wel even duren, want screenreaders zijn peperduur (behalve het uitstekende NVDA).
Een van de groepen met codes binnen WAI-ARIA bestaat uit de zogenaamde landmarks. Daarmee worden belangrijke onderdelen van een pagina gemarkeerd. De landmarks komen gedeeltelijk overeen met de nieuwe semantische html5-elementen. Omdat screenreaders deze landmarks al wel herkennen, zet ik ze bij de corresponderende html-elementen. In de toekomst zijn ze niet meer nodig, maar dat zal nog wel even duren.
Een screenreader kan niet alleen van kop naar kop, maar ook van landmark naar landmark springen. Daardoor kan bijvoorbeeld het menu snel worden gevonden.
In dit voorbeeld gebruik ik de landmark navigation. Elke landmark wordt voorafgegaan door role=
, op dezelfde manier als dat bij classes of id's gebeurt:
<nav role="navigation">
Omdat de checkbox voor een screenreader geen enkel nut heeft, is in de html aria-hidden="true"
toegevoegd. Dit voorkomt dat de screenreader meldt dat er een checkbox is in te vullen. Om dezelfde reden is dit toegevoegd aan de bij de checkbox horende <label>.
Voor iOS zijn twee sluitkruisjes aangebracht. Het kruisje zelf is gewoon de letter 'X'. Voorlezen daarvan heeft ook geen enkel nut, daarom is ook bij de menubalk voor browservensters smaller dan 740 px aria-hidden="true"
aangebracht.
Op de pagina met links vind je onder het kopje Toegankelijkheid → Forums, richtlijnen, links, artikelen en dergelijke meer info over WAI-ARIA.
:hover, :focus en :active voor muis, toetsenbord, touchpad en touchscreen
:hover
Omdat :hover
mogelijk niet werkt, als css uitstaat, ontbreekt of onvolledig is geïmplementeerd, moet je nooit belangrijke informatie alleen met behulp van :hover
tonen.
Je hovert over een element, als je met behulp van muis of touchpad de cursor boven dat element brengt. Hoveren kan over álle elementen. Het wordt veel gebruikt om iets van uiterlijk te laten veranderen, een pop-up te laten verschijnen, en dergelijke.
In dit voorbeeld wordt :hover
gebruikt in browservensters breder dan 740 px om de teksten in de menubalk te onderstrepen, de links en de pop-ups binnen de menubalk te positioneren, de pop-up zichtbaar te maken en om de standaard-cursor weer te geven boven de link die bij de huidige pagina komt.
Zodra de cursor boven een van de knoppen komt, wordt de in die knop zittende tekst onderstreept, de bijbehorende link boven de knop geplaatst en de pop-up geopend. Op touchscreens gebeurt dit als de knop wordt aangeraakt. Bij gebrek aan een cursor wordt deze natuurlijk niet aangepast.
:focus
Omdat :focus
mogelijk niet werkt, als css uitstaat, ontbreekt of onvolledig is geïmplementeerd, moet je nooit belangrijke informatie alleen met behulp van :focus
tonen.
De meeste mensen gaan met een muis naar een link, invoerveld, en dergelijke. Waarna ze vervolgens klikken om de link te volgen, tekst in te voeren, of wat ze ook maar willen doen.
Er is echter 'n tweede manier om naar links, invoervelden, en dergelijke te gaan: met behulp van de Tab-toets (sommige browsers gebruiken andere toetsen, maar het principe is hetzelfde). Met behulp van de Tab-toets kun je naar links, invoervelden, en dergelijke 'springen'. Waar je staat, wordt door alle browsers aangegeven met een of ander kadertje. De link en dergelijke met het kadertje eromheen heeft focus. Dat wil zeggen dat je die link volgt, als je op de Enter-toets drukt, of dat je in dat veld tekst kunt gaan invoeren, enz.
Als iemand geen muis wil of kan gebruiken, bijvoorbeeld door 'n handicap, is deze manier om de cursor te sturen erg handig. Als de volgorde van de links, invoervelden, en dergelijke in de code niet logisch is, kun je eventueel met behulp van tabindex
'n afwijkende volgorde opgeven. De Tab-toets volgt dan die afwijkende volgorde.
Normaal genomen wordt ook een checkbox, zoals in dit voorbeeld wordt gebruikt, meegenomen in de tab-volgorde. Maar omdat de checkbox hier met display: none;
is verborgen, gebeurt dat niet.
In dit voorbeeld wordt :focus
gebruikt bij de links binnen het menu en de bijbehorende onderstreping, die aangeeft of een link al is bezocht of nog niet. Zodra een link focus heeft, wordt deze samen met de bijbehorende onderstreping binnen de menubalk gezet.
Omdat :focus
hier voor touchscreens verder geen nut heeft, zijn daar geen aanpassingen voor nodig.
:active
Omdat :active
mogelijk niet werkt, als css uitstaat, ontbreekt of onvolledig is geïmplementeerd, moet je nooit belangrijke informatie alleen met behulp van :active
tonen.
:active
wordt hier niet gebruikt. Het is het moment dat een element door de gebruiker wordt geactiveerd, bijvoorbeeld tijdens het indrukken van de muis boven een link.
Aanpassingen voor touchscreens
Het gebruik van :hover
om een pop-up te laten verschijnen, levert op touchscreens nogal wat problemen op. Op internet zijn waanzinnig veel methodes te vinden, om dit voor elkaar te krijgen. De meeste blijken niet, slecht of alleen op één systeem te werken.
Ik ben bijvoorbeeld voor iOS een methode tegengekomen om een pop-up te sluiten door een plaatje (een <img>) aan te raken. Op dit moment werkt dat, maar het kan prima zijn dat dit helemaal niet de bedoeling is van Apple. Als dit in een komende versie van iOS wordt aangepast aan wat Apple eigenlijk wilde, werkt deze methode plotseling niet meer.
Dit is geen vage angst of zo, in het verleden is dit op grote schaal gebeurd. Mensen gebruikten fouten in Internet Explorer om een of andere bug of afwijking voor alleen (een bepaalde versie van) die browser te repareren. Als Microsoft de fout dan in een nieuwe versie had gerepareerd, donderde de hele lay-out grotelijks in elkaar.
De hier gebruikte methode is gebaseerd op de officiële documentatie van Microsoft en Apple. Hierdoor is er een grote kans dat deze methode ook blíjft werken.
Android schittert hier door afwezigheid, omdat ik geen officiële documentatie hierover heb kunnen vinden.
Windows 8
Binnen Windows 8 werkt het met muis, toetsenbord en/of touchpad op de gebruikelijke manier. Op een touchscreen werkt het in Opera, Firefox en Google Chrome ook op de gebruikelijke manier. In Internet Explorer 10 werkt het helemaal niet, omdat de links niet binnen de menubalk worden geplaatst.
Voor Internet Explorer 10 is een kleine aanpassing nodig. Om het in Internet Explorer 10 op een touchscreen goed te laten werken, moet overal in de html, waar :hover
iets moet doen – in dit geval de links binnen de menubalk plaatsen – , aria-haspopup="true"
worden toegevoegd.
Hierdoor wordt bij de eerste aanraking van een knop de link binnen de menubalk geplaatst (en de bijbehorende pop-up geopend). Als je het scherm buiten de menubalk aanraakt, wordt de pop-up weer gesloten. Maar als je de knop – die nu feitelijk een link is geworden – nogmaals aanraakt, wordt de link gevolgd.
In dit geval moeten alle <li>'s in de html de toevoeging aria-haspopup="true"
krijgen, want bij aanraken van deze knoppen moet de link binnen de menubalk worden gezet.
De links zelf staan binnen een <li> en moeten in de html de toevoeging aria-haspopup="false"
krijgen, omdat je anders, na het aanraken van de knop, ook nog twee keer de link moet aanraken. In totaal zou je dan drie keer de knop moeten aanraken, voordat de link wordt gevolgd.
Ik mag graag woest worden over Microsoft, maar in dit geval vind ik dit een heel elegante oplossing. Microsoft maakt gebruik van een al bestaande standaard: WAI-ARIA. Dit is volgens mij stukken beter dan de oplossingen van Apple en Android. Over die bestaande standaard WAI-ARIA kun je op de pagina met links onder het kopje Toegankelijkheid meer vinden.
iOS
Voor iOS zijn in dit geval maar een paar kleine aanpassingen nodig. Een <li> reageert normaal genomen niet op een aanraking. Door het toevoegen van onclick="void(0)"
bij elke <li>, reageert de <li> ook op iOS op een aanraking.
Als de link binnen de menubalk staat en de bijbehorende pop-up is geopend, kan deze niet meer worden gesloten op iOS. Daarvoor is een ander element nodig dat op aanraking reageert. Dit is de functie van div#sluitbalk
. Binnen deze div staan twee sluitkruisjes span.sluiten
, die beide ook een onclick="void(0)"
hebben gekregen. Hierdoor reageren deze op aanraken: door het aanraken van een sluitkruisje, sluit de pop-up (en wordt de link weer buiten het scherm gepositioneerd, maar dat zie je niet).
Android
In Android zijn verder geen speciale aanpassingen nodig. Dat wil zeggen: de hele code is eigenlijk één grote aanpassing. Alleen voor Android is het nodig de link helemaal buiten de menubalk te plaatsen. iOS en Windows 8 kun je ook laten werken met aria-haspopup
en onclick
, maar dat geldt niet voor Android.
De enige manier die ik heb gevonden om dit, zonder JavaScript, werkend te krijgen in Android, is het buiten de menubalk plaatsen van de links.
Beschrijving van code en css
De code die te maken heeft met de basis van dit voorbeeld is onderstippeld blauw
. 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 ontbreekt bijvoorbeeld de navigatie voor de site. 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, kun je bovenaan de pagina de hele handel 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.
Gebruik het volledige doctype, inclusief de eventuele url, anders werkt het niet goed.
Het hier gebruikte doctype is dat van html5.
<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.
In html5 hoeft deze regel niet langer te zijn, dan wat hier staat.
<meta name="viewport" content="width=device-width, initial-scale=1">
Mobiele apparaten variëren enorm in breedte. En dat is een probleem. Sites waren, in ieder geval tot voor kort, gemaakt voor desktopbrowsers. En die hebben, in vergelijking met bijvoorbeeld een smartphone, heel brede browservensters. Hoe moet je op 'n smartphone een pagina weergeven die is gemaakt voor de breedte van een desktop? Je kunt natuurlijk wachten tot álle sites zijn omgebouwd voor smartphones, tablets, enz., maar dan moet je waarschijnlijk heel erg lang wachten.
Mobiele browsers gokken erop dat een pagina een bepaalde breedte heeft. Safari voor mobiel bijvoorbeeld gaat ervan uit dat een pagina 980 px breed is. De pagina wordt vervolgens zoveel versmald dat hij binnen het venster van het apparaat past. Op een iPhone wordt de pagina dus veel smaller dan op een iPad. Vervolgens kan de gebruiker inzoomen op het deel van de pagina dat hij of zij wil zien.
Dit betekent ook dat bij het openen van de pagina de tekst meestal heel erg klein wordt weergegeven. (Meestal, want niet alle browsers en apparaten doen het op dezelfde manier.) Niet erg fraai, maar bedenk maar 'ns 'n betere oplossing voor bestaande sites.
Nieuwe sites of pagina's kunnen echter wel rekening houden met de veel kleinere vensters van mobiele apparaten. Dit menu bijvoorbeeld past zich aan de breedte van het venster aan, ook bij heel smalle vensters. Maar die stomme mobiele browser weet dat niet, dus die gaat ervan uit dat ook het heel smalle menu 980 px breed is, en verkleint dat dan. Dat is ongeveer even behulpzaam als de gedienstige kelner die behulpzaam de stoel naar achteren trekt, net als jij wilt gaan zitten.
Om de door de browser aangeboden hulp vriendelijk maar beslist te weigeren, wordt deze tag gebruikt. Hiermee geef je aan dat de pagina is geoptimaliseerd voor mobiele apparaten.
Een iPad in portretstand bijvoorbeeld is 768 px breed. De kreet width=device-width
zegt tegen de mobiele browser dat de breedte van de weer te geven pagina gelijk is aan de breedte van het apparaat. Voor een iPad in portretstand dus 768 px. En dat klopt, want de weer te geven pagina past zich automatisch aan de breedte van het apparaat aan, omdat de pagina altijd 100% breed is. Als het apparaat 300 px breed is, is de pagina ook 300 px breed, maar nog altijd 100%.
Simpeler gezegd: je zegt tegen het mobiele apparaat dat de pagina geen vaste breedte heeft, en dat het dus niet nodig is om de weergave aan te passen.
Steeds meer mobiele apparaten krijgen een hogere resolutiedichtheid: er staan meer pixels in een inch dan bij een monitor voor de desktop het geval is. Als een lijn 4 px breed is, en de pixels staan vier keer zo dicht op elkaar als op de desktop, zou de lijn maar 1 px breed zijn op een mobiel apparaat. Het is wel een supermooie en strakke lijn, omdat je met vier dicht bij elkaar staande pixels fantastisch scherp kunt weergeven. Alleen is de lijn helaas nauwelijks te zien, omdat hij in al z'n pracht maar 1 px breed is.
Ook niet echt geweldig. Daarom geven ook deze apparaten de breedte weer, alsof de resolutie een standaarddichtheid heeft. Een retina-scherm (een scherm met een hoge resolutiedichtheid) jokt een beetje. Ook een venster van 2048 of 4096 px breed beweert 1024 px breed te zijn. Hierdoor ziet een lijn van 4 px breed er ook op zo'n scherm als 4 px breed uit, en niet als 1 of 2 px breed.
Die hoge resolutiedichtheid heeft wel zin, maar dan op een andere manier. Letters bijvoorbeeld worden al jaren getekend aan de hand van wiskundige formules, het zijn allang geen statische afbeeldingen meer. Die formules kunnen prima met die hoge resolutiedichtheid uit de voeten: een ronding in een letter is in een hogere resolutie veel fijner dan in een lagere resolutie. Ook voor hoge kwaliteit afbeeldingen is een hoge resolutiedichtheid zinvol. Het enige waar het niet zinvol is, is bij het aangeven van een maat. Een lijn van 4 px breed moet 4 px breed zijn, en niet 1 px breed in superkwaliteit.
Er staat nog een tweede deel in de tag: initial-scale=1
. Sommige mobiele apparaten zoomen een pagina gelijk in of uit. Ook weer in een poging behulpzaam te zijn. Ook dat is hier niet nodig, want de pagina past zich aan het apparaat aan. Er is ook een instructie om zoomen helemaal onmogelijk te maken, maar die gebruik ik niet. De bezoeker kan zelf nog gewoon zoomen, wat belangrijk is voor mensen die wat slechter zien.
<link rel="stylesheet" href="../../css/naam-van-stylesheet.css">
<!-- Instellingen voor Internet Explorer -->
<!--[if IE]>
<link rel="stylesheet" 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. In html5 is de toevoeging type="text/css"
niet meer nodig, omdat dit standaard al zo staat ingesteld.
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 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 dat in dit voorbeeld tussen <style> 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. Met ingang van Internet Explorer 10 werken conditional comments niet meer.
De link verwijst naar een aparte stylesheet voor Internet Explorer, waarin je css speciaal voor die browser zet. Op de plaats van "../../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>
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 <style> 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;
}
css voor alle breedtes
body
Het element waarbinnen de hele pagina staat. Veel instellingen die hier worden opgegeven, worden geërfd door de nakomelingen van <body>. Ze gelden voor de hele pagina, tenzij ze later worden gewijzigd. Dit geldt bijvoorbeeld voor de lettersoort, de lettergrootte en de voorgrondkleur.
background: #ff9;
Achtergrondkleur.
color: black;
Voorgrondkleur zwart. Dit is onder andere de kleur van de tekst.
Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hierboven heb ik een achtergrondkleur opgegeven. 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 voorgrondkleur, 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 in een eigen stylesheet, is er nog niets aan de hand, want dan veranderen achtergrond- en voorgrondkleur geen van beide.
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).
margin: 0; padding: 0;
Verschillende browsers hebben verschillende standaardinstellingen hiervoor. Door ze gewoon op 0 te zetten, zijn ze overal hetzelfde.
#checkbox-voor-smal
Het element met id="checkbox-voor-smal". Dit is een <input>-element type checkbox. Als de checkbox is aangevinkt, is het menu zichtbaar. Als de checkbox is uitgevinkt, is het menu niet zichtbaar.
display: none;
Verberg de checkbox.
Verderop in de html staat label#toon-menu
, dat met for
aan deze checkbox is gekoppeld. Als je op dit <label> klikt of dit aanraakt, heeft dat hetzelfde effect, als wanneer je rechtstreeks deze checkbox aanklikt of aanraakt. Alleen kun je het <label> opmaken en tekst geven. Die tekst kun je wijzigen, afhankelijk van of de checkbox wel of niet is aangevinkt.
@-webkit-keyframes bugfix
from {padding-left: 10px;} to {padding-left: 10px;}}
Bij #toon-menu is een animatie toegevoegd om een bug in oudere versies van Android op te lossen. Hier wordt de animatie opgegeven. Als je nou denkt dat hier niets wordt uitgevoerd, omdat de padding links van 10 px in een padding links van 10 px wordt veranderd, dan heb je helemaal gelijk.
Toch neutraliseert deze flauwekul-animatie de bug in Android.
#sluitbalk
Het element met id="sluitbalk". Dit is op iOS nodig om de pop-ups weer te kunnen sluiten.
display: none;
Dit element is alleen nodig in browservensters breder dan 740 px, dus kan het hier worden verborgen.
#content
Het element met id="content". Binnen dit element staat de gewone tekst.
padding: 0 5px;
Omdat voor onder en links geen waarden zijn opgegeven, krijgen die dezelfde waarde als boven en rechts. Hier staat dus eigenlijk 0 5px 0 5px
in de volgorde boven – rechts – onder – links.
Boven en onder geen padding, links en rechts 'n afstand tussen tekst en buitenkant van de div.
#content p:first-child
De paragraaf die het eerste kind is van het element met id="content". Oftewel: de eerste paragraaf met gewone tekst. Dit is de paragraaf waar de naam van de pagina staat.
font-size: 2em;
Grotere letter.
text-align: center;
Tekst horizontaal centreren.
margin: 0;
Van zichzelf heeft een <p> aan boven- en onderkant een marge. Die is hier niet welkom.
css voor vensters breder dan 740 px
@media screen and (min-width: 740px)
De css die hier tot nu toe staat, geldt voor alle browservensters. De css die hieronder staat, geldt alleen voor vensters breder dan 740 px. Voor een deel is dit nieuwe css, voor een deel wordt hierboven staande css aangepast.
Browsers die dit niet begrijpen, gebruiken de hieronder staande css niet, maar alleen wat hierboven staat. Misschien is het resultaat daarvan niet mooi, maar het werkt in ieder geval.
@media
: geeft aan dat het om css gaat die alleen van toepassing is, als aan bepaalde voorwaarden wordt voldaan. Al langer bestond de mogelijkheid, om met behulp van zo'n regel css voor bijvoorbeeld printers op te geven. css3 heeft dat uitgebreid tot bepaalde fysieke eigenschappen, zoals de breedte en hoogte van het venster van de browser.
screen
: deze regel geldt alleen voor schermweergave. Als je wilt printen, is het beter een stylesheet daarvoor te baseren op de algemene css die hierboven staat.
and
: er komt nóg een voorwaarde, waaraan moet worden voldaan.
(min-width: 740px)
: het browservenster moet minstens 740 px breed zijn. Is het venster smaller, dan wordt de css die binnen deze media-regel staat genegeerd.
Gelijk na deze regel komt een {
te staan, en aan het einde van de css die binnen deze regel valt een bijbehorende afsluitende }
. Die zijn in de regel hierboven weggevallen, maar het geheel ziet er zo uit:
@media screen and (min-width: 740px) {
body {color: silver;}
(...) rest van de css voor deze @media-regel (...)
footer {color: gold;}
}
Voor de eerste css binnen deze media-regel staat dus een extra {
, en aan het eind staat een extra }
.
#menu li:first-child
Voor dit element geldt ook de bij #menu li (voor smalle vensters) en #menu li (voor vensters breder dan 740 px) opgegeven css, voor zover die hier niet wordt veranderd.
De <li>'s die eerste kind zijn en binnen het element met id="menu" staan. Omdat er maar één <ul> binnen #menu
staat, is er maar één serie <li>'s, en kan er dus maar eentje 'n eerste kind zijn. Inderdaad, de meest linkse.
border-top-left-radius: 10px;
Linkerbovenhoek afronden. In tegenstelling tot wat de naam van deze eigenschap suggereert, wordt ook de achtergrondkleur afgerond. Omdat maar één waarde is opgegeven, wordt zowel horizontaal als verticaal over 10 px afgerond, waardoor een gelijkmatige ronding ontstaat.
#menu li:last-child
Voor dit element geldt ook de bij #menu li (voor smalle vensters) en #menu li (voor vensters breder dan 740 px) opgegeven css, voor zover die hier niet wordt veranderd.
De <li>'s die laatste kind zijn en binnen het element met id="menu" staan. Omdat er maar één <ul> binnen #menu
staat, is er maar één serie <li>'s, en kan er dus maar eentje het laatste kind zijn. Inderdaad, de meest rechtse.
border-top-right-radius: 10px;
Rechterbovenhoek afronden. In tegenstelling tot wat de naam van deze eigenschap suggereert, wordt ook de achtergrondkleur afgerond. Omdat maar één waarde is opgegeven, wordt zowel horizontaal als verticaal over 10 px afgerond, waardoor een gelijkmatige ronding ontstaat.
#menu li:hover:before
li:hover
: als je over 'n <li> hovert, of deze aanraakt.
:before
: doe dan iets vóór die <li>.
#menu
: de <li>'s moeten binnen het element met id="menu" zitten.
In gewone mensentaal: doe iets vóór de <li>'s die binnen het menu zitten, als je over 'n <li> hovert of deze aanraakt.
De pseudo-class :hover
wordt hier samen met het pseudo-element :before
gebruikt, maar dat kan gewoon. Je kunt meerdere van dit soort pseudo-gevallen achter elkaar zetten.
text-decoration: underline;
Hierboven zijn met behulp van :before
en content
teksten in de menubalk gezet. Onderstreep deze nu, zodat ze meer op 'n link lijken.
#menu a:focus:after
Doe iets na elke <a> die focus heeft en in het element met id="menu" zit.
De pseudo-class :focus
wordt hier samen met het pseudo-element :after
gebruikt, maar dat kan gewoon. Je kunt meerdere van dit soort pseudo-gevallen achter elkaar zetten.
Een link kan focus krijgen, als de gebruiker er met de Tab-toets of op soortgelijke wijze naar toe is gegaan. Meer over :focus
kun je vinden bij :hover, :focus en :active voor muis, toetsenbord, touchpad en touchscreen.
display: none;
Bij #menu a:after wordt css voor een pop-up gegeven, die geopend wordt bij hoveren over of aanraken van een <li> in de menubalk. Deze pop-up opent dus niet door aanraken van of hoveren over de <a>, maar over de <li>. Omdat de <li> geen focus kan krijgen (niet zonder het 'n stuk ingewikkelder te maken), heeft deze pop-up bij a:focus
geen zin. Maar hij geeft wel problemen, omdat hij in sommige browsers de link iets hoger maakt.
Deze pop-up wordt gegenereerd met behulp van :after
. Door de hele pop-up gewoon te verbergen, verberg je ook de problemen. Hmmm, doet me aan m'n voorlaatste psychiater denken...
#menu #hier:hover
Het element met id="hier", dat binnen het element met id="menu"zit, maar alleen als je over #hier
hovert. Dit is de <a> uit het menu die bij de huidige pagina hoort.
cursor: default;
Omdat dit geen echte link is, moet de cursor niet in 'n handje veranderen. Omdat 'n touchscreen geen cursor heeft, heeft dit geen effect op 'n touchscreen.
#sluitbalk
Voor dit element geldt ook de bij #sluitbalk opgegeven css, voor zover die hier niet wordt veranderd.
Het element met id="sluitbalk". Dit is een div die je niet ziet. Hij zorgt voor het tonen en verbergen van de twee erin zittende sluitkruisjes, die nodig zijn om op iOS de pop-ups te kunnen sluiten.
max-width: 900px;
Bij #menu ul is opgegeven dat de menubalk een maximumbreedte van 900 px heeft. #sluitbalk
moet ervoor zorgen dat de twee sluitkruisjes links‑ en rechtsonder de menubalk komen te staan. Daarom mag #sluitbalk
niet breder worden dan de menubalk.
margin: 0 auto;
Omdat voor links en onder geen waarde is opgegeven, 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 hetzelfde betekent als evenveel. Ongeacht de breedte van het venster van de browser staat #sluitbalk
altijd horizontaal gecentreerd.
Deze manier van horizontaal centreren van een blok-element werkt alleen, als het te centreren blok-element een breedte heeft.
position: relative;
Dit maakt het mogelijk de div te verplaatsen ten opzichte van de positie, waar hij normaal genomen zou komen te staan.
top: 38px;
38 px naar omlaag verplaatsen.
Zonder deze verplaatsing zouden de in #sluitbalk
zittende sluitkruisjes niet zichtbaar zijn, omdat ze worden afgedekt door de menubalk.
Er zijn nog ongeveer 73 andere mogelijkheden om dit op te lossen, maar ik heb voor deze oplossing gekozen. #sluitbalk
is een fatsoenlijke div van goede komaf. 'n rechtstreeks kind van <body>, 'n betere afkomst kun je niet hebben.
(Tja, ik kan 't ook niet helpen, maar bij css is je afkomst nou eenmaal heel belangrijk.)
Goed, #sluitbalk
is dus van uitstekende komaf. Maar helaas gaat hij met de verkeerde vriendjes #menu
en de daarin zittende <ul> en <li>'s om en raakt daardoor aan lager wal. Of in dit geval eigenlijk: aan hoger wal. Normaal genomen zou een div namelijk gewoon onder het element ervoor worden neergezet. Dat is hier nav#menu
, waarin de menubalk staat. Dat zou precies de goede plaats zijn.

Op de afbeelding hiernaast is #sluitbalk
even iets breder gemaakt en heeft 'n rode outline gekregen en 'n hoogte van 1 px, zodat hij zichtbaar wordt. Op deze manier kun je zien dat #sluitbalk
niet onder nav#menu staat, maar op dezelfde hoogte.
De verklaring is wat ingewikkeld.
Een blok-element als nav#menu
krijgt normaal genomen automatisch precies genoeg hoogte, om de inhoud ervan weer te kunnen geven. Die inhoud is hier de <ul>.
Die <ul> is ook een blok-element, en krijgt normaal genomen dus ook genoeg hoogte om de inhoud ervan weer te kunnen geven.
De inhoud van de <ul> bestaat uit 8 <li>'s, die elk een hoogte van 34 px en een padding onderaan van 5 px hebben, samen 39 px. Dus zou de <ul> en vervolgens nav#menu
39 px hoog moeten zijn, waardoor #sluitbalk
hier netjes onder zou komen te staan.
De <li>'s zijn echter bij #menu li gefloat, en dan tellen ze niet meer mee voor de hoogte van de ouder <ul>. Waardoor <ul> dus geen hoogte heeft. En dus nav#menu
ook niet.
#sluitbalk
staat dus wel degelijk onder nav#menu
, maar nav#menu
heeft gewoon geen hoogte.
Door #sluitbalk
38 px omlaag te verplaatsen, komt deze op de goede plaats te staan, en de daarin zittende sluitkruisjes ook. Het menu heeft bij #menu li een hoogte van 34 px en een padding onderaan van 5 px gekregen, samen 39 px. Door 1 px minder naar omlaag te verplaatsen, valt de border van 1 px aan de bovenkant van de sluitkruisjes weg onder de menubalk, wat ik iets mooier vind.
.sluiten
De elementen met class="sluiten". Dit zijn de twee spans, waarin de sluitkruisjes staan die zichtbaar worden bij hoveren over of aanraken van de menubalk. Deze elementen zijn nodig om op iOS de pop-ups te kunnen sluiten.
Het zijn er twee, eentje links‑ en eentje rechtsonder de menubalk. Daardoor is er altijd minstens eentje zichtbaar, ongeacht welke pop-up is geopend.
background: white;
Achtergrond wit.
color: red;
Voorgrondkleur, waaronder de tekstkleur, rood.
width: 0.5em; height: 0.5em;
Hoogte en breedte. Door als eenheid em te nemen, veranderen hoogte en breedte in alle browsers mee met de lettergrootte.
overflow: hidden; font-size: 3em; line-height: 0.35em;
Het sluitkruisje is gewoon een opgeblazen letter 'X'. Deze letter is in sommige browsers iets te groot voor de span, waar hij in staat. Daarom wordt overflow
op hidden
gezet, waardoor wat niet binnen de span is, niet is te zien. Tekst wordt automatisch in het midden van de regelhoogte gezet.
Deze combinatie, samen met de hierboven opgegeven hoogte en breedte, leveren in alle browsers een acceptabel sluitkruisje op.
border: black solid 1px;
Randje rondom het sluitkruisje. Bij #sluitbalk is div#sluitbalk
, waar deze spans in zitten, 38 px omlaag verplaatst. De menubalk is 39 px hoog. Hierdoor valt de border aan de bovenkant weg onder de menubalk, wat ik iets mooier vind.
position: absolute;
Om de sluitkruisjes op de juiste plaats neer te kunnen zetten. Er wordt gepositioneerd ten opzichte van de eerste voorouder die zelf een absolute, fixed of relatieve positie heeft. Dat is hier #sluitbalk
.
Een span is van zichzelf een inline-element. Door de span absoluut te positioneren, verandert deze in een soort blok-element, waardoor je eigenschappen als hoogte en breed kunt gebruiken.
left: 0;

De spans zijn hierboven in een soort blok-element veranderd door ze absoluut te positioneren. Een 'soort' blok-element. Het wordt namelijk nog neergezet alsof het een inline-element is: achter #sluitbalk
. De hoogte is wel goed, want de span staat bovenin #sluitbalk
, en die is bij #sluitbalk op de juiste hoogte gezet.
Met left: 0;
wordt de span helemaal links in #sluitbalk
neergezet.
Er zijn twee spans met 'n sluitkruisje. De tweede wordt hieronder aan de rechterkant neergezet.
.sluiten + .sluiten
Voor dit element geldt ook de bij .sluiten opgegeven css, voor zover die hier niet wordt veranderd.
Een element met class="sluiten" dat gelijk volgt op een ander element met class="sluiten". Er zijn maar twee elementen met class="sluiten": de spans met de sluitkruisjes. Alleen de tweede daarvan voldoet aan deze selector.
left: auto;
Bij .sluiten zijn de spans met left: 0;
aan de linkerkant van #sluitbalk
neergezet. Deze span met sluikruisje moet aan de rechterkant worden neergezet. Om dat mogelijk te maken moet left
terug naar de standaardinstelling auto
.
right: 0;
De span en dus het sluitkruisje helemaal rechts in #sluitbalk
zetten.
#content
Voor dit element geldt ook de bij #content opgegeven css, voor zover die hier niet wordt veranderd.
Het element met id="content". Binnen dit element staat de gewone tekst.
max-width: 900px;
Maximumbreedte.
padding: 70px 0 0;
Omdat voor links geen waarde is ingevuld, krijgt links automatisch dezelfde waarde als rechts. Hier staat dus eigenlijk 70px 0 0 0
in de volgorde boven – rechts – onder – links.
Bovenaan een padding van 70 px voor wat afstand tussen tekst en menubalk.
Bij #content is links en rechts een padding van 5 px opgegeven, die is hier niet nodig.
Onderaan geen padding.
margin: 0 auto;
Omdat voor onder en links geen waarde is opgegeven, 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 hetzelfde betekent als evenveel. Ongeacht de breedte van het browservenster staat #content
en dus alles erin altijd horizontaal gecentreerd.
Deze manier van horizontaal centreren van een blok-element werkt alleen, als het te centreren element een breedte heeft.
.kopje
De elementen met class="kopje". Dit zijn de twee vette kopjes in de tekst. Normaal genomen zou ik hier 'n <h> gebruiken, net als voor de naam van de pagina. In dit geval doe ik het wat simpeler, want om nou <h>'s te gaan gebruiken op 'n pagina met zo weinig inhoud...
(Dat 'simpeler' is voornamelijk omdat het er op de site iets anders uit ziet. Als ik hier <h>'s gebruik, worden dat heel andere <h>'s dan die op de site worden gebruikt, en ik houd de code uit de download het liefst zoveel mogelijk hetzelfde als die op de site.)
font-weight: bold;
Vette letter.
margin-bottom: 0;
Van zichzelf heeft een <p> een marge aan boven- en onderkant. Hier wil ik het kopje gelijk boven de tekst laten staan, dus de marge aan de onderkant wordt verwijderd.
.kopje + p
Een paragraaf die gelijk volgt op een element met class="kopje". Dit zijn de <p>'s die gelijk op het vette kopje in de tekst volgen.
margin-top: 0;
Van zichzelf heeft een <p> een marge aan boven- en onderkant. Hier wil ik het kopje gelijk boven de tekst laten staan, dus de marge aan de bovenkant van de direct op het kopje volgende <p> wordt verwijderd.
Speciaal voor Internet Explorer 8
<!--[if IE 8]>
<style>
@media screen and (min-width: 740px) {
#menu li {width: 12.5%;}
#menu li + li:before {content: "Pagina\0000a01";}
#menu li + li + li:before {content: "Pagina\0000a02";}
#menu li + li + li + li:before {content: "Pagina\0000a03";}
#menu li + li + li + li + li:before {content: "Pagina\0000a04";}
#menu li + li + li + li + li + li:before {content: "Pagina\0000a05";}
#menu li + li + li + li + li + li + li:before {content: "Pagina\0000a06";}
#menu li + li + li + li + li + li + li + li:before {content: "Pagina\0000a07";}
#menu li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 1";}
#menu li + li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 2";}
#menu li + li + li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 3";}
#menu li + li + li + li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 4";}
#menu li + li + li + li + li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 5";}
#menu li + li + li + li + li + li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 6";}
#menu li + li + li + li + li + li + li + li a:after {content: "Ruimte voor informatie over de inhoud van pagina 7";}
#menu:hover + #sluitbalk {display: none;}
}
</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 8, maar je kunt het ook voor andere versies aangeven. Met ingang van versie 10 van Internet Explorer werken conditional comments niet meer.
In plaats van de style kun je ook 'n normale link naar 'n extern css-bestand aanbrengen:
<!--[if IE 8]>
<link rel="stylesheet" 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 8 in. De css voor Internet Explorer 8 komt dan apart in die stylesheet te staan, zodat het de andere browsers niet stoort.
Het is belangrijk dat de spaties in <!--[if IE 8]>
en <![endif]-->
precies zo worden overgenomen, zoals ze hier staan.
De toevoeging type="text/css"
bij <style> of <link> is bij html5 niet meer nodig, omdat dit de standaardinstelling is.
@media screen and (min-width: 740px)
Dit technische pareltje van Microsoft kan niet uit de voeten met een aantal selectors. Daarom krijgt deze browser wat eigen css. Omdat die selectors alleen worden gebruikt in browservensters breder dan 740 px, is die eigen css ook alleen bedoeld voor die vensters.
Daar zorgt deze regel voor. Verdere uitleg bij @media screen and (min-width: 740px).
#menu li
Alle lijst-items binnen het element met id="menu". Dit zijn de <li>'s waarbinnen de links van het menu zitten.
width: 12.5%;
Bij #menu li:nth-child(even) en #menu li:nth-child(odd) hebben de <li>'s afwisselend een breedte van 12 en 13% gekregen, om in een aantal browsers afrondingsfouten door het gebruik van decimalen te voorkomen.
Internet Explorer kent die afrondingsfouten niet, dus de <li>'s kunnen een breedte van 12,5% krijgen. Omdat er acht <li>'s zijn, is dat samen 100%, de volle breedte van de menubalk.
Hiermee wordt gelijk het gebruik van de pseudo-class nth-child()
omzeild. Dat is nodig, omdat Internet Explorer 8 die selector niet kent.
#menu li + li:before
{content: "Pagina\0000a01";}
#menu li + li + li:before
{content: "Pagina\0000a02";}
#menu li + li + li + li:before
{content: "Pagina\0000a03";}
#menu li + li + li + li + li:before
{content: "Pagina\0000a04";}
#menu li + li + li + li + li + li:before
{content: "Pagina\0000a05";}
#menu li + li + li + li + li + li + li:before
{content: "Pagina\0000a06";}
#menu li + li + li + li + li + li + li + li:before
{content: "Pagina\0000a07";}
Bij alle andere browsers wordt bij #menu li:nth-child(2):before t//m #menu li:nth-child(8):before voor de tweede tot en met achtste <li> een tekst opgegeven. Internet Explorer 8 kent nth-child()
niet. Daarom wordt hier in plaats van li:nth-child(2)
(de tweede <li>) li + li gebruikt. Het is Microsoft namelijk wel gelukt om Internet Explorer 1 + 1 op te laten tellen. En niet alleen dat is gelukt, nee, 1 + 1 levert zelfs de juiste uitkomst op: 2. Dit lukt zelfs tot wel 8! In plaats van li:nth-child(2)
, de tweede <li>, wordt hier dus <li> + <li> gebruikt. Wat hetzelfde betekent. Je komt er dus wel, alleen wordt het bij acht <li>'s wat lang...
Voor de rest is dit hetzelfde als bij de algemene css, waar de rest van het verhaal staat.
Er bestaan polyfills om Internet Explorer 8 te laten werken met selectors zoals :nth-child()
, onder andere selectivizir.js, maar die werken niet in combinatie met :before
en :after
.
#menu li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 1";}
#menu li + li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 2";}
#menu li + li + li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 3";}
#menu li + li + li + li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 4";}
#menu li + li + li + li + li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 5";}
#menu li + li + li + li + li + li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 6";}
#menu li + li + li + li + li + li + li + li a:after
{content: "Ruimte voor informatie over de inhoud van pagina 7";}
Dit zijn aanpassingen voor #menu li:nth-child(2) a:after tot en met #menu li:nth-child(8) a:after uit de algemene css. Het verhaal is exact hetzelfde als hier gelijk boven, maar nu met :after
in plaats van :before
.
#menu:hover + sluitbalk
{display: none;}
Bij hoveren over of aanraken van de menubalk moeten de sluitkruisjes worden getoond. De rest van het verhaal staat bij #menu:hover + sluitbalk.
Omdat Internet Explorer 8 het geestig vindt de sluitkruisjes helemaal bovenaan de pagina te zetten, wordt #sluitbalk
en dus de daarin zittende spans met de sluitkruisjes gewoon helemaal niet getoond. Deze sluitkruisjes zijn alleen nodig voor iOS, dus het niet tonen is geen enkel probleem.
Html5-elementen en Internet Explorer 8
Tegen de standaard in kun je in Internet Explorer 8 (en ouder) geen css gebruiken bij onbekende elementen. Volgens de standaard hoort de browser niets te doen met een onbekend element, maar moet je er wel css aan toe kunnen kennen. Microsoft wist dit weer 'ns beter en de gevolgen daarvan zullen nog jaren blijven spelen.
In dit voorbeeld wordt het voor Internet Explorer 8 onbekende html5-element <nav> gebruikt. De css voor dit element zou dus niet werken in Internet Explorer 8.
Maar als je via JavaScript dit element eerst even 'voorstelt' aan de browser, blijkt het plotsklaps wél herkend te worden. En kan dus gewoon css voor dit element worden gebruikt. (In feite wordt het element aan de DOM toegevoegd, een soort inhoudsopgave van onder andere alle html-elementen in een pagina.)
Internet Explorer 9 kent <nav> wel, dus hier speelt dit probleem niet meer. (Internet Explorer 9 herkent trouwens, zoals het hoort, ook onbekende elementen, zodat je daar hoe dan ook css en zo bij kunt gebruiken.)
Anders dan vaak het geval is, moet dit JavaScript in de <head> van de pagina staan. De browser moet het element al kennen, voordat het kan worden weergegeven. Als het element wordt gelezen, voordat het is aangemaakt, wordt het gewoon genegeerd. En kan er dus ook geen css aan worden gegeven.
Het eigenlijke JavaScript is heel kort en simpel. Voor dit voorbeeld kun je in de <head> het volgende neerzetten:
<!--[if IE 8]>
<script>
document.createElement("nav");
</script>
<![endif]-->
Deze code geldt alleen voor Internet Explorer 8. Uitleg zie bij Speciaal voor Internet Explorer 8.
<script>
en </script>
geven gewoon het begin en einde van het JavaScript aan. Bij html5 hoef je geen type meer op te geven, want het staat standaard op JavaScript ingesteld.
Het eigenlijke JavaScript bestaat uit:
document.createElement("nav");
Door het toevoegen van zo'n regel voor een onbekend element, kan dat element nu gewoon worden gebruikt in Internet Explorer 8.
Dit JavaScript is uiterst beperkt: alleen het hier gebruikte html5-element <nav> wordt aangemaakt, en dan alleen nog maar voor weergave op een scherm. Als je meer wilt doen dan alleen dit, is het mogelijk beter om voor Internet Explorer 8 het JavaScript op html5shiv te gebruiken. Dit script herkent veel meer nieuwe html5-elementen dan alleen <nav>. Voordeel van dit uitgebreidere script is ook, dat standaard-instellingen als display: block;
bij bijvoorbeeld <header> (hier niet gebruikt) ook al worden doorgegeven aan Internet Explorer 8, zodat die niet in de css hoeven.
Het gebruik van JavaScript betekent helaas ook dat de css in Internet Explorer 8 niet werkt, als de bezoeker JavaScript uit heeft staan. Maar normaal genomen staat JavaScript alleen uit vanwege de veiligheid. En als je ook maar enigszins met veiligheid bezig bent, dan zul je niet Internet Explorer 8 (of ouder) gebruiken. Dus het aantal mensen waarbij in deze verouderde browsers JavaScript uit zal staan, is waarschijnlijk te verwaarlozen.
Mocht dit wel een bezwaar zijn, dan zul je <nav> en dergelijke door een gewone <div> moeten vervangen.
Een andere mogelijkheid is het gebruik van <noscript>, zoals ik op de site heb gedaan. Meer hierover kun je gelijk hieronder vinden bij Media queries en Internet Explorer 8.
Media queries en Internet Explorer 8
In css3 zijn de @media-regels fors uitgebreid. Met behulp van @media kunnen nu dingen als de breedte en hoogte van het browservenster worden opgevraagd. Afhankelijk van het resultaat kan dan bepaalde css juist wel of juist niet worden gebruikt.
Helaas kan Internet Explorer 8 (en ouder) hier niet mee overweg, en omdat Microsoft bestaande browsers nooit update (op veiligheidsupdates na), zal dit ook niet veranderen. Wat Microsoft kennelijk niet kan, heeft een aantal programmeurs zelf dan maar geprobeerd voor elkaar te krijgen. Met behulp van JavaScript kan ook deze browser gebruik maken van media queries.
Helemaal probleemloos werkt dit bepaald niet. Omdat de code van deze browser geheim is en er bergen afwijkingen en bugs in zitten, werkt dit JavaScript ook niet altijd, of soms zelfs helemaal niet.
Er zijn twee veel gebruikte JavaScripts om media queries te kunnen gebruiken: css3-mediaqueries-js en respond.js. Als de ene niet probleemloos of helemaal niet werkt, wil de andere nog wel 'ns werken. Hieruit blijkt weer dat je de roestbakken die Microsoft abusievelijk browser noemt, uiterst goed moet testen.
In dit voorbeeld wordt css3-mediaqueries.js gebruikt.
In de <head> staat het volgende stukje code:
<!--[if IE 8]>
<script src="012-files-dl/css3-mediaqueries.js"></script>
<![endif]-->
Deze code geldt alleen voor Internet Explorer 8. Uitleg zie bij Speciaal voor Internet Explorer 8.
De toevoeging type="text/javascript"
bij <script> is bij html5 niet meer nodig, omdat dit de standaardinstelling is.
.css3-mediaqueries.js is het in de download bijgesloten JavaScript, dat ervoor zorgt dat Internet Explorer 8 met media queries uit de voeten kan.
Omdat dit soort scripts regelmatig wordt bijgewerkt, is het uitermate belangrijk dat je zelf dit script ophaalt van css3-mediaqueries-js en niet gewoon het script uit de download gebruikt.
Het gebruik van JavaScript betekent helaas ook dat de css in Internet Explorer 8 niet werkt, als de bezoeker JavaScript uit heeft staan. Maar normaal genomen staat JavaScript alleen uit vanwege de veiligheid. En als je ook maar enigszins met veiligheid bezig bent, dan zul je niet Internet Explorer 8 (of ouder) gebruiken. Dus het aantal mensen waarbij in deze verouderde browsers JavaScript uit zal staan, is waarschijnlijk te verwaarlozen.
Een andere mogelijkheid is het gebruik van <noscript>, zoals ik op de site heb gedaan. Dit moet dan alleen voor Internet Explorer 8 worden gebruikt, want andere browsers herkennen de nieuwe elementen en hebben geen JavaScript nodig. In Internet Explorer kan <noscript> alleen css krijgen via een inline-style. Het wordt dan zoiets:
<!--[if IE 8]>
<noscript>
<div style="border: dotted red 10px; padding: 5px; background: white;">
Helaas, deze pagina werkt niet goed met oudere versies van Internet Explorer zonder JavaScript.<br>
Drie mogelijkheden:<br>
* Schakel JavaScript in;<br>
* Installeer Internet Explorer 9;<br>
* Stop met die troep van Microsoft en installeer 'n échte browser zoals Firefox, Google Chrome of Opera.
</div>
</noscript>
<![endif]-->
Los van dat deze browser bij <noscript> alleen css binnen 'n inline-style kan verwerken, moet ook nog 'n extra <div> worden gebruikt. Als je de style met <noscript style="...">
zou aangeven, wordt een deel van de inhoud van <noscript> altijd getoond in Internet Explorer 8, ook al staat JavaScript aan.
De code aanpassen aan je eigen ontwerp
- Als je dit voorbeeld gaat aanpassen voor je eigen site, houdt het dan in eerste instantie zo eenvoudig mogelijk. Ga vooral geen details invullen.
-
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.
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 tweede voer je de charset in. Het beste kun je utf-8 nemen. Als je later van charset verandert, loop je 'n grote kans dat je alle aparte tekens als letters met accenten weer opnieuw moet gaan invoeren.
- Test vanaf het allereerste begin in zoveel mogelijk verschillende browsers in 'n aantal resoluties (schermgroottes). Onder het kopje Getest in kun je in deze uitleg vinden, waar ikzelf op test. Ook van Internet Explorer kun je meerdere versies naast elkaar draaien. Je kunt daarvoor zoeken op internet en op de pagina met links staan onder de kopjes Gereedschap → Meerdere versies van Internet Explorer draaien en Gereedschap → Weergave testen 'n aantal links die daar ook bij kunnen helpen. De compatibiliteitsweergave is niet geschikt om te testen, omdat deze enigszins verschilt van de weergave in échte browsers.
- Voor alle voorbeelden geldt: breng veranderingen stapsgewijs aan. Als je bijvoorbeeld foto's wilt laten weergeven, begin dan met het alleen veranderen van de namen van de foto's, zodat je eigen foto's worden weergegeven. Maakt niet uit als de maten niet kloppen en de teksten fout zijn. Als dat werkt, ga dan bijvoorbeeld de maten aanpassen. Dan de teksten. En controleer steeds, of alles nog goed werkt.
-
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 ongemerkt 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.
- Zolang je in grotere dingen zoals 'n lay-out aan 't wijzigen bent, zou ik je aanraden de verschillende delen een achtergrondkleur te geven. Je ziet dan goed, waar 'n deel precies staat.
- Als je instellingen verandert in de style, verander er dan maar één, hooguit twee tegelijk. Als je er zeventien tegelijk verandert, moet je niet verbaasd zijn, als je niet weet, wat er is gebeurd. En als je 't niet meer terug kunt draaien.
- Marges, padding en border worden bij de hoogte en breedte van de inhoud opgeteld. Hier worden vaak fouten mee gemaakt. Als je bijvoorbeeld in een lay-out 'n border toevoegt aan een van de 'hoofdvakken' (header, footer, kolommen), dan wordt deze er bij opgeteld. Bij 'n border van 2 px rondom de linkerkolom wordt deze dus plotseling 4 px breder (2 aan beide kanten), en 4 px hoger. Zoiets kan je hele lay-out verstoren, omdat iets net te breed of te hoog wordt. Je moet dan elders iets 4 px kleiner maken. Dat zal vaak zo zijn: als je één maat verandert, zul je vaak ook 'n andere moeten aanpassen.
- In plaats van px kun je ook andere maten gebruiken, met name em. Voordeel van em is dat een lettergrootte, regelhoogte, en dergelijke in em ook in Internet Explorer kan worden veranderd (andere browsers hebben meer mogelijkheden op dit gebied). Nadeel is dat het de lay-out sneller kan verstoren dan bijvoorbeeld px. Dit moet je gewoon van geval tot geval bekijken.
-
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.
(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. Valide code garandeert ook dat de weergave in verschillende browsers (vrijwel) hetzelfde is. En valide code is over twintig jaar ook nog te bekijken.
Toegankelijkheid en zoekmachines
Het eerste deel van deze tekst is voor alle voorbeelden hetzelfde. Eventueel specifiek voor dit voorbeeld geldende dingen staan verderop onder het kopje Specifiek voor dit voorbeeld.
Toegankelijkheid (accessibility in het Engels) is belangrijk voor bijvoorbeeld blinden die een screenreader gebruiken, of voor motorisch gehandicapte mensen die moeite hebben met het bedienen van een muis. Een spider van een zoekmachine (dat is het programmaatje dat de site indexeert voor de zoekmachine) is te vergelijken met een blinde. Als je je site goed toegankelijk maakt voor gehandicapten, is dat 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:
-
Gebruik altijd een alt-beschrijving bij een afbeelding. De alt-tekst is wat wordt gebruikt, als afbeeldingen niet kunnen worden gezien (dat geldt dus ook voor zoekmachines). Als je iets wilt laten zien, als je over de afbeelding hovert, gebruik daar dan het title-attribuut voor, niet de alt-beschrijving.
Als een afbeelding alleen maar voor de sier wordt gebruikt, zet je daarbij
alt=""
, om aan te geven dat de afbeelding niet belangrijk is voor het begrijpen van de tekst of zo. - Gebruik bij een link een title, waarin je omschrijft, waar de link naartoe leidt.
-
Accesskeys (sneltoetsen) kun je beter niet gebruiken, deze geven 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.
Op zichzelf zijn accesskeys een heel goed idee. Maar helaas zijn ze ook in html5 volstrekt onvoldoende gedefinieerd.
Er is nog steeds geen standaard voor de meest gebruikelijke accesskeys, zoals Zoek of Home.
Er is nog steeds niet vastgelegd hoe accesskeys zichtbaar gemaakt kunnen worden. Voor de makers van browsers zou dit 'n relatief kleine moeite zijn, voor de makers van 'n site is het bergen extra werk.
Voor mij redenen om accesskeys helemaal niet te gebruiken. Ik kan me wel voorstellen dat ze op sites die gericht zijn op 'n specifieke groep gebruikers nog enig nut kunnen hebben, maar voor algemene sites zou ik zeggen: niet gebruiken.
- Met behulp van de Tab-toets (of op 'n soortgelijke manier) kun je in de meeste browsers door links, invoervelden, en dergelijke lopen. Elke tab brengt je één link, invoerveld, en dergelijke verder, Shift+Tab één plaats terug. Met behulp van
tabindex
kun je de volgorde aangeven waarin de Tab-toets werkt. Zondertabindex
wordt de volgorde van de html aangehouden, maar soms is een andere volgorde logischer. -
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 sterk verbeterd, dat dit niet meer wordt aangeraden. De volgorde in de html kan tegenwoordig beter hetzelfde zijn als die 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 in speciale programma's zoals tekstbrowsers en screenreaders. Die link staat boven menu, header, en dergelijke en linkt naar de inhoud van de pagina, zodat mensen met één toetsaanslag naar de eigenlijke inhoud van de pagina kunnen gaan.
Een skip-link is ook nuttig voor gebruikers van de Tab-toets. Zodra de normaal genomen onzichtbare link door het indrukken van de Tab-toets focus krijgt, kun je hem op het scherm plaatsen, waardoor hij zichtbaar wordt. Bij een volgende tab wordt hij dan weer buiten het scherm geplaatst en is dus niet meer zichtbaar.
-
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. Screenreaders en dergelijke kunnen van kop naar kop 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.
- Een table is fantastisch, maar alleen als die wordt gebruikt om een echte tabel weer te geven, niet als hij voor opmaak wordt misbruikt. In het verleden is dat op grote schaal gebeurd bij gebrek aan andere mogelijkheden. Een tabel is, als je niet heel erg goed oplet, volstrekt ontoegankelijk voor gehandicapten en zoekmachines. Het lezen van een tabel is ongeveer te vergelijken met het lezen van een krant van links naar rechts: niet per kolom, maar per regel. Dat gaat dus alleen maar goed bij een echte tabel zoals een spreadsheet. In alle andere gevallen garandeert 'n tabel 'n lagere plaats in een zoekmachine.
-
Frames zijn 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 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 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.
- Geef de taal van het document aan, en bij woorden en dergelijke die afwijken van die taal de afwijkende taal met behulp van
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. Maar bij enigszins 'normale' teksten hoor je een taalwisseling aan te geven. - Gebruik de tag <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 screenreader 'e.d.' uit gaat spreken als 'Ed', en 'n zoekmachine kan er ook geen chocola van maken. -
De spider van 'n zoekmachine, screenreaders, 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.
Ook kun je in Windows het gratis programma WebbIE installeren. WebbIE laat de pagina zien, zoals een tekstbrowser en dergelijke hem zien. WebbIE is te downloaden vanaf www.webbie.org.uk.
Ten slotte kun je je pagina nog online op toegankelijkheid laten controleren op 'n behoorlijk aantal sites, zoals:
lowvision.support: laat zien hoe een kleurenblinde de site ziet. Engelstalig.
wave.webaim.org: deze laat grafisch zien, hoe de toegankelijkheid is. Engelstalig. Deze tester is ook als extensie in Firefox en Google Chrome te installeren.
Op de pagina met links kun je onder Toegankelijkheid links naar testen e.d. vinden.
Specifiek voor dit voorbeeld
- De extra informatie die in bredere browservensters tevoorschijn komt bij hoveren over of aanraken van de knoppen, wordt geleverd door gebruik van de css-eigenschap
content
. De meeste screenreaders en dergelijke negeren tekst die wordt toegevoegd viacontent
. Je moet dan ook nooit belangrijke informatie alleen met behulp vancontent
weergeven. -
Als de tekst die met
content
wordt gegenereerd wel wordt voorgelezen door de screenreader, wordt de tekst uit de menubalk ('Home', 'Pagina 1', enz.) twee keer voorgelezen. Eén keer omdat dit de tekst uit de link is, en één keer omdat de tekst bijli:nth-child():before
wordt gegenereerd.Om dit te voorkomen, is
speak: none;
toegevoegd bijli:nth-child()
. De meeste browsers herkennen dit nog niet, maar in de toekomst zal dit hopelijk wel zo zijn. (Ooit stondspeak
in een aparte specificatie, maar inmiddels is dit deel van css3.) - Om te voorkomen dat screenreaders en dergelijke overbodige elementen zoals de checkbox voorlezen, zijn deze overbodige elementen voorzien van
aria-hidden="true"
in de html. Meer hierover staat bij Semantische elementen en WAI-ARIA. - Zonder css zie je bovenaan de pagina de checkbox. Daaronder staat een rij links: het menu. Vervolgens zie je nog twee keer de letter 'x' en het woord 'menu'. Er staan dus wel wat extra dingen op de pagina, omdat die niet worden verborgen met behulp van css, maar in principe is alles goed werkbaar en herkenbaar en zo.
- Om de teksten in de pop-up te genereren is
:after
gebruikt. Dit is hier beter dan:before
, omdat screenreaders die gegenereerde tekst lezen nu eerst de link lezen en dan de toelichting daarvan in de pop-up. Wat logischer is dan omgekeerd. Bovendien kun je met screenreaders en dergelijke snel naar de volgende link, dus als je 'n pop-up niet wilt horen, ga je gewoon naar de volgende link.
Getest in
Laatst gecontroleerd op 16 juli 2013.
Onder dit kopje staat alleen maar, hoe en waarin is getest. Eventuele problemen, ook die met betrekking tot zoomen en lettergroottes, staan hieronder bij Bekende problemen. Het is belangrijk dat te lezen, want uit een test kan ook prima blijken dat iets totaal niet werkt!
Eventuele opmerkingen over de toegankelijkheid specifiek voor dit voorbeeld staan onderaan Toegankelijkheid en zoekmachines onder het kopje Specifiek voor dit voorbeeld.
Dit voorbeeld is getest op de volgende systemen:
- Windows XP:
Firefox, Opera en Google Chrome in een resolutie van 1440x900.
Internet Explorer 8 in de resoluties 800x600, 1024x768, 1280x870 en 1440x900. - Windows 7:
Firefox, Opera, Google Chrome en Internet Explorer 9 in de resoluties 800x600, 1024x768 en 1280x1024. - Windows 8:
Firefox, Opera, Google Chrome en Internet Explorer 10 (bureaublad-versie en startscherm-versie) in de resoluties 800x600, 1024x768 en 1366x768. - OS X:
Firefox, Opera, Safari en Google Chrome in de resolutie 1024x768. - Linux:
Firefox, Opera en Google Chrome in de resoluties 800x600, 1024x768 en 1280x1024. - Windows Phone 8 in een resolutie van 800x480 (Nokia Lumia 520):
Internet Explorer (portret en landschap). - iPad met iOS 6.1.3 in een resolutie van 1024x768 (MC979NF):
Safari (portret en landschap).
Opera Mini (portret en landschap). Meer over deze browser hieronder bij Android 2.3.6.
Chrome for IOS (portret en landschap). - Android 4.0.3 in een resolutie van 1024x768 (CRESTA CTP888):
Android browser, Opera, Firefox en Chrome voor mobiel (alles portret en landschap). - Android 2.3.6 in een resolutie van 320x240 (Samsung Galaxy Y GT-S5360):
Android browser (portret en landschap).
Firefox (portret en landschap).
Opera Mobile (portret en landschap).
Opera Mini (éénkolomsstand aan/uit, portret en landschap). Deze browser is een apart geval. De opgevraagde site wordt gedownload via de servers van Opera, waarbij het in zo'n klein venster normaal is dat (het grootste deel van) de lay-out wordt verwijderd. Daarom wordt bij deze browser voornamelijk gekeken, of er geen content (tekst en dergelijke) verloren gaat.
Er is steeds getest met de laatste versie van de browsers op de hierboven genoemde controledatum, 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 resoluties groter dan 800x600 is ook in- en uitzoomen en - voor zover de browser dat kan - een kleinere en grotere letter getest. Er is ingezoomd en vergroot tot zover de browser kan, maar niet verder dan tot 200%.
Er is getest met behulp van muis en toetsenbord, behalve op de iPad en Android, waar een touchscreen is gebruikt. Op Windows 8 is zowel met een touchscreen als met een combinatie van toetsenbord en touchpad getest.
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. (NVDA is getest in combinatie met Firefox.) 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 specifiek voor dit voorbeeld staan onderaan Toegankelijkheid en zoekmachines onder het kopje Specifiek voor dit voorbeeld.
Alleen op de hierboven genoemde systemen en browsers is getest. Er is dus niet getest op bijvoorbeeld 'n Blackberry. De kans is (heel erg) groot dat dit voorbeeld niet (volledig) werkt op niet-geteste systemen en apparaten. Om het wel (volledig) werkend te krijgen, zul je vaak (kleine) wijzigingen en/of (kleine) aanvullingen moeten aanbrengen, bijvoorbeeld met JavaScript.
Er is ook geen enkele garantie dat iets werkt in een andere tablet of smartphone dan hierboven genoemd, omdat fabrikanten in principe de software kunnen veranderen. Dit is anders dan op de desktop, waar browsers altijd (vrijwel) hetzelfde werken, zelfs op verschillende besturingssystemen. Iets wat in Android browser werkt, zal in de regel overal werken in die browser, maar een garantie is er niet. De enige garantie is het daadwerkelijk testen op een fysiek apparaat. En aangezien er duizenden mobiele apparaten zijn, is daar eigenlijk geen beginnen aan.
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!)
Bekende problemen
Waarop en hoe is getest, kun je gelijk hierboven vinden bij Getest in.
Als je hieronder geen oplossing vindt voor een probleem dat met dit voorbeeld te maken heeft, kun je op het forum proberen een oplossing te vinden voor je probleem. Om forumspam te voorkomen, moet je je helaas wel registreren, voordat je op het forum een probleem kunt aankaarten.
Deze lijst is behoorlijk lang, maar dat komt voornamelijk omdat ik hem zo volledig mogelijk probeer te krijgen. De meeste problemen zijn onbelangrijke details.
De css valideert niet
Er worden drie eigenschappen gebruikt die (nog) niet valideren. Omdat precies bekend is, waarom de css niet valideert, lijkt dat me in dit geval geen enkel probleem. Valideren is alleen een hulpmiddel, het zou geen doel op zichzelf moeten zijn.
- Door het gebruik van @-webkit-keyframes valideert de css niet. @keyframes zou wel worden gevalideerd, maar deze regel is alleen nodig voor 'n aantal oudere op webkit gebaseerde browsers, dus het is 'n beetje al te dogmatisch om alleen voor het valideren alle browsers met deze regel op te zadelen.
-
Door het gebruik van
-ms-user-select
valideert de css niet.user-select
wordt door alle browsers herkend, als het juiste bij de browser horende voorvoegsel (zoals-ms-
) wordt gebruikt. Maar het is geen onderdeel van een standaard. Omdat het al door alle browsers wordt herkend, zal het vermoedelijk over niet al te lange tijd wel onderdeel van een of andere css-module zijn.Omdat het hier alleen nodig is voor Internet Explorer 10 op een touchscreen, gebruik, ik alleen de vorm met
-ms-
. - De tekst die in de menubalk staat wordt met behulp van
content
gegenereerd. Diezelfde tekst staat echter ook binnen de links. De meeste screenreaders en dergelijke lezen gegenereerde tekst niet, dus meestal zal het niet dubbel worden voorgelezen. Voor de zekerheid staat bij de gegenereerde tekst in de lijst-itemsspeak: none;
. Dit wordt echter nog niet gevalideerd. De meeste screenreaders en dergelijke herkennen het ook nog niet.
Gebruik van de muis en klikken
De links worden pas bij hoveren over 'n knop binnen de knop geplaatst, met een vertraging van 0,24 seconde. In theorie kun je binnen die 0,24 seconde al klikken, waardoor je niet op een link klikt. Want die staat er nog niet. Bij uitproberen bleek het vrijwel onmogelijk binnen die 0,24 seconde te klikken. Je moet echt in 'n soort jachthouding gaan zitten, het vangen van 'n vlo is makkelijker.
Kiertje rechts van menubalk in sommige browsers in vensters smaller dan 900 px
In browservensters smaller dan 900 px moet de menubalk het hele venster vullen. Door afrondingsverschillen blijft echter rechts van de menubalk een miniem kiertje open in sommige browsers. Dit gebeurt op Android 4.03. in Android browser, Chrome voor mobiel en Opera (maar niet in de nieuwe op Blink gebaseerde versie van Opera); op iOS in Opera, Chrome for iOS en Safari; op linux in Opera; op OSX in Safari; op Windows 7 in Opera; op Windows XP in Opera.
Alle browsers: tekst kopiëren uit pop-up kan niet
In bredere browservensters verschijnt bij hoveren over of aanraken van een knop een pop-up met extra info. Deze tekst wordt getoond met behulp van de css-eigenschap content
. Hierdoor kan deze tekst niet worden gekopieerd. (In 'n enkele browser kán het wel, maar gaat het zo lastig, dat kopiëren alleen geschikt is voor masochisten die met succes de vervolgcursus voor gevorderden hebben gevolgd.)
Safari en Google Chrome bij gebruik van Tab-toets om van link naar link te gaan
Als je de Tab-toets gebruikt om van link naar link te gaan, wordt de link gelijk binnen de knop gezet, zonder vertraging van 0,24 seconde. Zou die vertraging er wel zijn, dan duurt het heel even voor je kunt zien, welke link focus heeft, en dat is wat verwarrend. Zelfs bij zo'n korte vertraging.
Om dit voor elkaar te krijgen wordt bij :focus
voor left
de waarde auto
gebruikt. Volgens de standaard hoort transition
niet te werken bij de waarde auto
, waardoor er geen vertraging is. Safari en Google Chrome vertragen toch, waardoor het in deze browsers even duurt voor je ziet welke link focus heeft (om precies te zijn: 0,24 seconde).
Dit speelt alleen op de desktop, want alleen daar wordt de Tab-toets hiervoor gebruikt. Voor Firefox, Opera en de bureaublad-versie van Internet Explorer 10 op Windows 8 moet left
bij transition
staan, anders vertragen ook deze.
Android browser 4.0.3
Normaal genomen kan ook in deze browser de bestemming van een link worden gekopieerd. Door de link iets langer aan te raken, opent een contextueel menu met onder andere deze mogelijkheid. Door de gebruikte constructie kan in deze browser de link niet worden gekopieerd.
Internet Explorer 8
-
Internet Explorer 8 kent de pseudo-class
:checked
niet. Deze pseudo-class wordt alleen gebruikt in browservensters smaller dan 740 px. Omdat deze versie van Internet Explorer niet of nauwelijks nog op dit soort kleine (mobiele) apparaten voorkomt, heb ik geen polyfill gebruikt.In een 1280 px breed venster speelt dit probleem ook, als je zoomt tot meer dan 150%. De menubalk verdwijnt dan, maar het menu voor smalle vensters werkt niet.
Als je dit wel wilt laten werken, kun je op de pagina met links onder CSS → Bugs en hacks → Dingen mogelijk maken specifiek voor Internet Explorer links naar polyfills hiervoor vinden.
- Bij hoveren over de menubalk wordt de tekst niet onderstreept. Omdat dit niet echt heel belangrijk is en omdat Internet Explorer 8 ook een aflopende zaak is, heb ik dit niet echt geprobeerd op te lossen.
- De pop-ups en de menubalk hebben geen ronde hoeken, omdat Internet Explorer 8
border-radius
niet kent. Als je wel ronde hoeken wilt, kun je op de pagina met links onder CSS → Bugs en hacks → Dingen mogelijk maken specifiek voor Internet Explorer links naar polyfills hiervoor vinden. - Als je de lettergrootte verandert, terwijl de pagina al op het scherm staat, krijgt de tekst die met behulp van
content
wordt gegenereerd pas na herladen van de pagina de nieuwe lettergrootte.
Internet Explorer 8 en 9
- Deze browsers kennen geen gradiënten. Daarom hebben ze, waar gradiënten worden gebruikt, een egale achtergrondkleur. Gradiënten worden overigens alleen in browservensters smaller dan 740 px gebruikt. Als je toch gradiënten wilt gebruiken in deze browsers, kun je met de gradiënt generator op colorzilla.com een zogenaamd filter aanmaken voor deze browsers.
- Pas versie 10 van Internet Explorer kent
transition
. Bewegingen gaan daardoor niet geleidelijk, maar in één keer. Op de pagina met links kun je onder CSS → Bugs en hacks → Dingen mogelijk maken specifiek voor Internet Explorer links naar polyfills hiervoor vinden.
Internet Explorer 8, 9 en 10 (bureaublad-versie)
Bij een grotere letter (niet bij zoomen) is de pop-up iets breder dan de bijbehorende knop. Hierdoor steekt hij aan de rechterkant iets uit.
Opera
In Opera op Android 4.0.3 en in alle versies van Opera op de desktop werkt transition
niet in combinatie met content
. Hierdoor openen de pop-ups in één keer.
Opera is voor de weergave-machine aan het overstappen van Presto naar Blink. Voor Android is de nieuwe versie al klaar. In de nieuwe versie met Blink werkt transition
in combinatie met content
wel. Ik neem aan dat het dus binnenkort in elke versie van Opera werkt.
Opera Mini
In Opera Mini op iOS wordt bij klikken op een link de nieuwe pagina wel geopend, maar deze staat om een of andere duistere reden volledig links buiten het scherm. Hij is door vegen wel op het scherm te zetten, maar je weet helemaal niet dat er iets links buiten het scherm staat. Dit maakt deze constructie feitelijk onbruikbaar in Opera Mini op iOS.
Opera Mini op Android 2.3.6 werkt wel, hoewel gradiënten en dergelijke missen.
Safari op iOS en OSX en Chrome for iOS
transition
in combinatie met content
werkt niet. Hierdoor openen de pop-ups in één keer.
Safari op OSX en Firefox op de desktop bij andere lettergrootte
Alleen in Safari op OSX en Firefox op de desktop kun je de tekst zo sterk verkleinen en vergroten, dat onderstaande problemen zich kunnen voordoen. In andere browsers speelt dit dus niet.
- Als de letters worden verkleind tot minder dan 70%, valt een deel van de pop-up weg achter de menubalk. Dit speelt niet bij zoomen, alleen bij een kleinere lettergrootte. Kleiner dan 70% is érg klein, dus ik vond dit niet de moeite waard om naar 'n oplossing te zoeken.
- Als de letters tot 120% of meer worden vergroot, ontstaat er een kier(tje) tussen menubalk en pop-up. Bij zoomen speelt dit niet.
- Als de letters tot meer dan 170% worden vergroot, past de tekst van de links niet meer binnen de knop. Hierdoor kan het laatste deel van de tekst onder de knop rechts ervan komen te staan, waardoor dit niet meer is te lezen. Bij zoomen speelt dit niet.
Wijzigingen
Alleen grotere wijzigingen worden hier vermeld, geen dingen als een link die is geüpdatet.
:
Nieuw opgenomen.
10 augustus 2008:
Bij Bekende problemen stukje over verdwijnende letters bij vergroten lettergrootte toegevoegd.
4 oktober 2008:
Bij Bekende problemen tekst over Internet Explorer 7 en zoomen toegevoegd.
6 april 2009:
Tekst aangepast aan de nieuw verschenen Internet Explorer 8. De code is hetzelfde gebleven.
16 juli 2013:
De code en de tekst zijn volledig herschreven. Daarom is er geen beginnen aan alle wijzigingen hier te noteren. Een samenvatting:
- Alles voor Internet Explorer 6 en 7 is verwijderd.
- Werkt nu ook op touchscreens.
- Voor browservensters smaller dan 740 px is een compleet nieuw deel toegevoegd. Het menu verschijnt hier pas na klikken op of aanraken van de tekst 'Menu open'. Het sluit weer na klikken op of aanraken van 'Menu dicht'.