Skip links en inhoudsopgave

Uitleg slideshow met thumbnail en foto's van verschillende grootte. Gebruikt weinig bandbreedte

Slideshow met thumbnail en foto's van verschillende grootte. Gebruikt weinig bandbreedte

Korte omschrijving

Bij hoveren over de thumbnail opent de bijbehorende grote foto. Je kunt van foto naar foto gaan door te scrollen, door te klikken of met de Tab-toets. Alleen de getoonde grote foto's worden gedownload, dus er wordt zo weinig mogelijk bandbreedte gebruikt.

Alles op deze site kan vrij worden gebruikt. Je gebruikt het wel op eigen risico: als er ergens fouten in zitten, ben ik daar niet verantwoordelijk voor en ook niet voor eventueel daardoor aangerichte schade in welke vorm dan ook. Een link naar http://www.css-voorbeelden.nl is niet verplicht, maar wordt wel gewaardeerd.

Opmerkingen

De gebruikte afbeeldingen zijn afkomstig van Public Domain Pictures.net.

Voor dit soort effecten wordt meestal JavaScript gebruikt, maar het kan vaak ook uitstekend met alleen (x)html en css. Voordelen zijn dat dit ook werkt als JavaScript uit staat en dat het meestal veel simpeler is.

Net als met andere methoden waar thumbnails bij worden gebruikt, heb je kleine afbeeldingen (thumbnails) nodig en grote. De thumbnails worden snel geladen omdat ze klein zijn. Pas als de bijbehorende grote foto wordt getoond, wordt deze gedownload, dus er wordt zo weinig mogelijk bandbreedte gebruikt.

Er wordt geen nieuwe pagina geladen of 'n nieuw venster geopend of zoiets: alles gebeurt in dezelfde pagina in hetzelfde venster.

Hoewel dat niet absoluut nodig is, is het wel heel handig als de afbeeldingen dezelfde maat hebben. Of twee maten eigenlijk: één voor liggende en één voor staande afbeeldingen. Je kunt de foto's dan desgewenst centreren, er 'n kadertje om zetten, 'n onderschrift eronder zetten, enz. Bij dit voorbeeld hebben de foto's verschillende afmetingen, ze staan dan ook niet gecentreerd en dergelijke.

Voor het weergeven van de grote afbeelding wordt gebruik gemaakt van position: fixed. In kleinere vensters zou dat tot gevolg kunnen hebben dat de grote afbeelding gedeeltelijk buiten het venster komt te staan, terwijl geen scrollbalk verschijnt. Waardoor het deel dat buiten het venster staat op geen enkele manier is te bekijken. Door background-size: contain; te gebruiken, wordt dit voorkomen: de maat van de foto wordt aangepast aan de maat van het venster. Omdat Internet Explorer 7 en 8 dit niet kennen, verdwijnt bij die browsers wel het deel dat niet in het venster past.

Dit voorbeeld is niet geschikt voor spraakbrowsers en dergelijke. Afhankelijk van het gebruikte programma en de instellingen daarvan worden alleen de titels en/of de alt-beschrijving van de thumbnail voorgelezen. Als het belangrijk is dat een beschrijving van de afbeelding wordt gegeven, moet daarvoor een andere oplossing worden bedacht.

Als er nog meer tekst op de pagina staat, kan het handig zijn om een zogenaamde skip-link aan te brengen aan het begin van de hele handel. Mensen die de Tab-toets gebruiken om van link naar link te gaan, kunnen dan desgewenst in één keer alle thumbs passeren.

Zonder css zie je de grote afbeeldingen niet. Maar behalve bij tekstbrowsers zie ik dit niet zo snel gebeuren. En tekstbrowsers tonen nooit afbeeldingen, gebruikers daarvan kiezen daarvoor.

Alles op deze site is gemaakt op een systeem met Linux. Daarbij is vooral gebruik gemaakt van Quanta Plus, GIMP en Firefox met extensies. De pdf-bestanden zijn gemaakt met LibreOffice.

Links in deze uitleg, vooral links naar andere sites, kunnen verouderd zijn. Op de pagina met links vind je steeds de meest recente links.

Vragen of opmerkingen? Fout gevonden? Ga naar het forum.

Iets gevonden waar je wat aan hebt? Mooi. Als je je waardering wilt uiten, maak dan een donatie over aan War Child Nederland, een organisatie die kinderen uit oorlogsgebieden helpt hun trauma's te verwerken. Of - nog beter - wordt donateur:
War Child Nederland

Achterliggend idee

Dit voorbeeld valt in twee grote delen uiteen: de thumbnails en de grote foto's. Daarnaast is er nog het hulpvenstertje en 'n vakje met de titel en zo, maar die zijn niet wezenlijk van belang voor dit voorbeeld.

Bij het openen van de pagina worden alle thumbs gedownload. Omdat het thumbs zijn, gaat dat relatief snel. De grote foto's worden nog niet gedownload.

Als ul#titel ook een border heeft

In feite staat er aan de linkerkant 'n hele rij thumbs, maar die rij wordt verstopt. Er is er maar één thumb tegelijk zichtbaar of, bij scrollen, twee gedeeltelijk. Dit wordt bereikt door als het ware 'n kijkgaatje (div#content) over de rij thumbs te zetten. div#content is even hoog als één thumb. Daarbij staat overflow op auto, waardoor een scrollbalk ontstaat.

Elke thumb zit in een link, en die link zit weer in een span, die als blok-element wordt weergegeven. Aan het begin van elk van die spans zit een anker.

Elke link met thumb linkt naar het anker van de volgende span. Bij klikken op een thumb verschuift hierdoor de hele rij precies één thumb in verticale richting. De onderste link linkt weer naar de bovenste span, zodat je weer bovenaan begint als je onderaan bent aangekomen.

In elk van de hierboven genoemde spans zitten, naast de thumb, nog twee links: eentje met het pijltje naar links en eentje met het pijltje naar rechts. Deze linken naar de vorige en de volgende span. Bij klikken op het pijltje wordt dus één thumb terug- of vooruitgegaan. Het eerste pijltje terug verwijst naar de laatste span, het laatste pijltje vooruit naar de eerste span. Hierdoor ga je bij klikken op de pijltjes bij klikken op het laatste pijltje terug naar het begin, en omgekeerd.

De grote foto's zijn background-images. Deze staan in een span, die als blok-element wordt weergegeven. Omdat de foto's in dit voorbeeld ongelijk van grootte zijn, zijn de foto's verder niet gecentreerd of zo, maar in principe zou dat ook nog kunnen.

Deze span met de grote foto staat binnen dezelfde link, waarin ook de thumb staat. Bij hoveren over die link wordt de span - en dus de grote foto - zichtbaar. Zolang je niet boven de link komt met de cursor, wordt de grote foto niet geopend, ook niet als je klikt op de pijltjes bovenaan de thumb of als je klikt op de scrollbalk.

Omdat de links even groot zijn als de thumbs, ziet het eruit alsof je over de thumb moet hoveren om de grote afbeelding te openen. Dat je in feite over 'n link hovert, is nergens aan te zien. En dat is ook precies de bedoeling.

Met behulp van de Tab-toets kun je van link naar link gaan. Als je op die manier bij 'n link aankomt, heeft die link focus. Door het gebruik van :active en :focus opent de bijbehorende grote foto als 'n link focus heeft. Omdat de links even groot zijn als de thumbnails, lijkt het alsof je van thumb naar thumb gaat.

De span waarbinnen de grote foto wordt weergegeven, heeft een fixed positie. Hierdoor zou de span bij een kleiner venster zo klein kunnen worden, dat een (groot) deel van de afbeelding er niet meer in past en buiten het venster valt. Zonder dat een scrollbalk verschijnt. Dat deel van de afbeelding zou dan op geen enkele manier te zien zijn.

Om dat te voorkomen is de css3-eigenschap background-size: contain; gebruikt. Met behulp daarvan wordt de grote foto zo groot mogelijk weergegeven, maar niet groter dan in de span past. Bij een kleinere span wordt de afbeelding verkleind, waarbij de verhouding tussen breedte en hoogte hetzelfde blijft. Internet Explorer 7 en 8 kennen dit niet, dus daar kan in een kleiner venster inderdaad een deel van de afbeelding gewoon verdwijnen.

De span met de achtergrond-afbeelding vult in principe het hele venster van de browser. In een groot venster kan de span dan ook érg groot worden. En door het gebruik van background-size: contain; zou de achtergrond-afbeelding dan ook erg groot worden. Vergroten van een afbeelding op deze manier levert zelden mooie resultaten op: browsers zijn daar niet zo goed in. Daarom is een maximumbreedte en -hoogte aan de span gegeven, die even breed en hoog is als de breedste en hoogste foto. Hierdoor worden foto's hoogstens 'n klein stukje vergroot, en dat gaat prima.

De links met de thumbs hebben een tabindex, omdat anders in Opera de Tab-toets niet werkt. De links met de pijltjes hebben een negatieve tabindex, zodat bij gebruik van de Tab-toets deze worden overgeslagen. Anders zou iemand die de Tab-toets gebruik na het zien van de laatste foto eerst 28 keer moeten tabben om de pijltjes te passeren, voordat de eerste thumb weer wordt bereikt.

Normaal genomen zouden alle afbeeldingen gelijk bij het openen van de pagina worden gedownload, ook de grote. Dat is hier geen goed idee, omdat dat nogal lang kan gaan duren met de veertien afbeeldingen uit dit voorbeeld. Laat staan bij 'n echt grote serie foto's, of bij echt grote afbeeldingen.

De thumbs worden wel vrij snel gedownload, omdat ze veel kleiner zijn. De thumbs moeten trouwens hoe dan ook worden gedownload, want anders kun je ze niet zien. Maar dat geldt niet voor de grote foto's. Die hoeven pas te worden gedownload, als je er eentje wilt zien.

Elke grote foto heeft 'n eigen span. De grote foto is 'n background-image binnen die span. Door bij elke span expliciet te zeggen dat die background-image pas wordt geopend bij :hover, :focus of :active, wordt de grote foto pas gedownload als over de thumb wordt gehoverd, als op de thumb wordt geklikt of als via de Tab-toets de thumb focus heeft gekregen. Op die manier worden alleen de grote foto's die daadwerkelijk worden bekeken gedownload.

Zonder deze expliciete opdracht downloaden sommige browsers álle grote foto's gelijk bij het openen van de pagina, en daar word je niet echt gelukkig van, hoe mooi de foto's ook zijn.

Dan zijn er nog wat kleine dingetjes, zoals het blokkeren van het grootste deel van het scherm tegen hoveren, het hulpschermpje, en nog zo het een en ander, maar die komen aan de orde bij de beschrijving van de code.

Alleen :hover of :hover, :focus en :active?

Het eerste deel van deze tekst is voor alle voorbeelden met links en dergelijke hetzelfde, het laatste deel (onder het kopje Speciaal bij dit voorbeeld) is speciaal voor dit voorbeeld.

De meeste mensen openen 'n link door erop te klikken. Er is echter 'n tweede manier: met behulp van de Tab-toets (sommige browsers gebruiken andere toetsen, maar het principe is hetzelfde). Met behulp van de Tab-toets kun je van link naar link 'springen'. Op welke link je staat, wordt door alle browsers aangegeven met een of ander kadertje rondom de link.

De link met het kadertje eromheen heeft focus. Dat wil zeggen dat je die link volgt als je op de Enter-toets drukt. In principe werkt dit precies hetzelfde als gewoon klikken op de link.

Als iemand geen muis wil of kan gebruiken, bijvoorbeeld door 'n handicap, is deze manier om 'n link te openen erg handig. Als de volgorde van de links in de code niet logisch is, kun je eventueel met behulp van tabindex 'n afwijkende volgorde van de links opgeven. De Tab-toets volgt dan die afwijkende volgorde.

Tot zover is er nauwelijks verschil tussen het gebruik van de Tab-toets of van de muis.

Als je echter extra dingen onder de link hebt gestopt, die pas gaan werken als je over de link hovert, is er wel 'n verschil. Je geeft dat aan met :hover: als je over de link hovert. Met de Tab-toets alleen kun je niet over 'n link hoveren. Dus als er bijvoorbeeld 'n pop-up wordt geopend, zul je die niet zien als je de Tab-toets gebruik om naar 'n link te gaan.

Om dit op te lossen kun je op dezelfde manier als je :hover gebruikt :focus gebruiken: als de link focus heeft. Dat is dus als er 'n kadertje rondom de link staat en de link wordt gevolgd bij het indrukken van Enter.

Door dus a:hover, a:focus {...} te gebruiken, opent bijvoorbeeld 'n pop-up ook als je de Tab-toets gebruikt. Maar er zitten 'n paar adders onder het gras.

* Naast :hover en :focus is er nog :active. Deze laatste zou horen te werken als de muis wordt ingedrukt op de link. Dat werkt ook zo in alle browsers, behalve in Internet Explorer vóór versie 8. In haar onmetelijke wijsheid heeft Microsoft besloten af te wijken van de standaard: :active werkt in oudere versies zoals :focus hoort te werken, en :focus werkt gewoon helemaal niet vóór versie 8. In alle andere browsers werken :focus en :active dus wel volgens de standaard, en met ingang van versie 8 van Internet Explorer houdt Microsoft zich ook eindelijk aan de standaard.

Dit betekent dat je niet kunt volstaan met a:hover, a:focus {...}, maar dat je a:hover, a:focus, a:active {...} moet gebruiken, want anders werkt het niet in oudere versies van Internet Explorer. Het zal nog jaren duren voor deze oude versies niet meer worden gebruikt, maar omdat Microsoft zich nu eindelijk ook aan de standaard houdt op dit punt, wordt :active nu ook langzaamaan bruikbaar voor waar het voor is bedoeld.

* Belangrijke informatie moet je niet geven via :focus of active, omdat dit niet werkt als css uit staat.

* Ten slotte kan 'n pop-up of zoiets gruwelijk in de weg komen te staan, bijvoorbeeld door de rest van de pagina af te dekken. Iemand die gewoon de muis kan gebruiken, verplaatst deze even en de pagina is weer zichtbaar. Iemand die moeite heeft met het gebruik van de muis, heeft deze mogelijkheid niet of minder. Als je buiten de link en de daarbij horende pop-up en dergelijke klikt, sluit deze weliswaar, maar dat is nu juist het probleem: mensen die de muis niet goed kunnen gebruiken, hebben nou net daar problemen mee.

Als je via de terug-toets teruggaat naar de vorige pagina, heeft de link waar je vandaan kwam nog steeds focus, en dus staan pop-up en dergelijke ook nog open. Wat ook heel storend kan zijn als andere delen van de pagina daardoor niet te zien zijn. Op het moment dat ik dit schreef, werkte de terug-toets bij alle browsers zo, met uitzondering van Google Chrome. Maar 't kan best zijn dat Google Chrome het inmiddels ook doet, of 'n andere juist weer niet, want dit schijnt nogal te veranderen.

Om al deze redenen is het goed je even af te vragen of de voordelen van 'n pop-up en dergelijke wel opwegen tegen de nadelen. Ik zet zelf mijn eigen overwegingen bij elk voorbeeld steeds even erbij. Wat natuurlijk niet wil zeggen dat je daar geen andere mening over zou kunnen hebben.

Speciaal bij dit voorbeeld

Ik gebruik hier :hover, :focus en :active alle drie. Als je via de Tab-toets door de afbeeldingen loopt, blijft de afbeelding geopend. Maar dat lijkt me hier geen probleem, want het gaat juist om de afbeeldingen. En bij de volgende tab verschijnt de volgende afbeelding gewoon. In dit geval lijken :focus en :active me een aanwinst.

Beschrijving van code en css

De code die te maken heeft met de basis van dit voorbeeld is rood gekleurd. Alle voor dit voorbeeld niet-essentiële code is bruin.

Deze uitleg hoort bij het voorbeeld dat in de download zit. Het voorbeeld uit de download verschilt iets van het voorbeeld hier op de site. In de download ontbreken bijvoorbeeld de witte vlakken met de links. Ook in de kopregels zit vaak wat verschil. Daarnaast kunnen er nog andere (meestal kleine) verschillen zijn.

Als je deze uitleg leest naast de broncode van het voorbeeld op de site, kan het dus bijvoorbeeld zijn dat 'n h1 uit de css bij 'n <h2> uit de html hoort. Maar het gaat niet om hele grote, fundamentele afwijkingen.

Als je dit lastig vindt, downloadt dan de hele handel (ga terug naar het voorbeeld en kies daar voor downloaden). In de download zit 'n voorbeeld dat wel naadloos aansluit op de uitleg in de download.

<!DOCTYPE html> <html lang="nl">

Een document moet met een doctype beginnen om weergaveverschillen tussen browsers te voorkomen. Zonder doctype is de kans op verschillende (en soms volkomen verkeerde) weergave tussen verschillende browsers heel erg groot.

Geldige doctypes vind je op www.w3.org/QA/2002/04/valid-dtd-list.

Gebruik het volledige doctype, inclusief de eventuele url, anders werkt het niet goed.

Het hier gebruikte doctype is dat van html 5. Dit kan al veilig worden gebruikt.

<meta charset="utf-8">

Zorgt dat de browser letters met accenten en dergelijke goed kan weergeven.

utf-8 is de beste charset (tekenset), omdat deze alle talen van de wereld (en nog heel veel andere extra tekens) bestrijkt, maar toch niet meer ruimte inneemt voor de code, dan nodig is. Als je utf-8 gebruikt, hoef je veel minder entiteiten (&auml; en dergelijke) te gebruiken, maar kun je bijvoorbeeld gewoon ä gebruiken.

Deze regel moet zo hoog mogelijk komen te staan, als eerste regel binnen de head, omdat hij anders door sommige browsers niet wordt gelezen.

<link rel="stylesheet" type="text/css" href="../../css/naam-van-stylesheet.css"> <!--Instellingen voor Internet Explorer --> <!--[if IE]> <link rel="stylesheet" type="text/css" href="../../css/naam-van-ie-stylesheet.css"> <![endif]-->

Dit stukje code heeft in dit voorbeeldbestand geen enkel nut. Normaal genomen is het een verwijzing naar een extern stylesheet, waarin de style staat. In dit voorbeeld verwijst de href naar een niet bestaand bestand.

De bedoeling is dat je bovenstaande regels aanpast voor je eigen bestand. De hele style, die onder deze regels in de <head> staat, wordt dan in het externe bestand geplaatst waar de href naar verwijst. In dat bestand komt de style precies zo te staan zoals die nu in de <head> staat. Het bestand moet eindigen op .css.

Voordeel van een externe stylesheet is onder andere, dat deze geldig is voor alle pagina's waaraan deze is gelinkt. 'n Verandering in de lay-out hoef je dan maar op één enkele centrale plek te aan te brengen.

In die externe stylesheet zet je alles wat in dit voorbeeld tussen <style type="text/css"> en </style> staat (zonder deze begin- en eindregel).

De bovenste regel is voor de algemene stylesheet, geldig voor alle browsers. Dit is gewoon 'n link die naar 'n bestand elders verwijst, waar de css in staat. Op de plaats van "../../css/naam-van-stylesheet.css" moet je pad naar en naam van jouw stylesheet invullen.

Het eigenaardige stukje code daaronder heet een 'conditional comment' en wordt door alle browsers gezien als commentaar, omdat het tussen <!-- en --> staat. Maar Internet Explorer herkent het, door de extra toevoegingen, als speciaal voor Internet Explorer bedoeld en zal het dus uitvoeren. Het is veiliger dan een zogenaamde 'hack', waarbij vaak gebruik wordt gemaakt van 'n fout (bug) in de browser. Dit is opzettelijk aangebracht door Microsoft en zal dus blijven bestaan, terwijl 'n bug gerepareerd kan worden. Op deze manier kun je 'n stylesheet alleen voor Internet Explorer opnemen.

Dit stukje geldt voor alle versies van Internet Explorer, maar je kunt het ook per versie aangeven.

De link verwijst naar een aparte stylesheet voor Internet Explorer, waarin je css speciaal voor die browser zet. Op de plaats van "../../css-naam-van-ie-stylesheet.css" moet je pad naar en naam van je stylesheet voor Internet Explorer invullen.

De link naar het aparte stylesheet voor Internet Explorer moet ná de link naar het algemene stylesheet komen, omdat de opdrachten voor Internet Explorer dan over die uit het algemene stylesheet heen gaan.

<style type="text/css">

Voor de duidelijkheid staat de style hier in het bestand zelf, maar het is beter deze in een apart stylesheet te zetten, zoals hierboven beschreven. In die stylesheet komt alles wat tussen bovenstaande regel en </style> staat.

Technisch gezien is er geen enkel bezwaar om het in die stylesheet te zetten met dezelfde vreselijke lay-out als die ik in dit voorbeeld gebruik. Maar als je dat doet, garandeer ik je hele grote problemen omdat het volstrekt onoverzichtelijk is. Ik gebruik alleen deze lay-out omdat het anders veel te veel regels worden.

Voorbeeld van 'n goede lay-out in je css:


	div#header-buiten
	{
	    position: absolute;
	    right: 16px;
	    width: 100%;
	    height: 120px;
	    background: yellow;
	}

	div#header-binnen
	{
	    margin-left: 16px;
	    height: 120px;
	    text-align: center;
	}
body margin: 0; padding: 0;

Slim om te doen vanwege kleine verschillen tussen browsers.

font-family: Arial, Helvetica, sans-serif;

Er wordt eerst gekeken of Arial aanwezig is op de computer van de bezoekers. Als dat er niet is, wordt gezocht naar Helvetica. Als dat ook niet wordt gevonden, wordt in ieder geval een letter zonder schreven (dwarsstreepjes) genomen.

font-size: 110%;

Iets groter dan standaard. 't Zal de leeftijd zijn, maar ik vind de standaardgrootte wat te klein.

Ik gebruik hier % als eenheid, en voor alle andere lettergroottes gebruik ik em. Dat komt door Internet Explorer. Als ik als maateenheid iets als px neem, kunnen gebruikers van Internet Explorer de lettergrootte niet veranderen.

Maar als ik overal em neem als maateenheid, wat dan voor de hand zou liggen, kom ik in de problemen met versies van Internet Explorer ouder dan versie 8. De stappen van de verkleining of vergroting zijn in die browsers zo groot, dat 't gelijk onleesbaar klein of absurd groot is.

Als je nou echter bij body geen em gebruikt (font-size: 1.1em; zou hetzelfde moeten zijn als font-size: 110%;), dan is de lettergrootte in Internet Explorer te veranderen, en in oudere versies dan versie 8 zijn de tussenstappen teruggebracht tot normale grootte.

Dit werkt ook als je als lettergrootte 100% invult. Dat heeft geen enkele invloed op de lettergrootte, behalve dus dat de tussenstappen in oudere versies nu normaal werken.

In Internet Explorer 8 is deze bug eindelijk gerepareerd. Aangezien we waarschijnlijk nog vele jaren met oudere versies dan Internet Explorer 8 zitten opgescheept, zal deze truc ook nog jaren moeten worden toegepast.

Hoewel in dit voorbeeld verder geen em voor lettergrootte wordt gebruikt, laat ik dit toch staan, omdat em heel vaak wel zal worden gebruikt. Het staat er standaard in bij mij en je kunt nu niet vergeten het later toe te voegen, mocht dat nodig zijn.

color: black;

Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hieronder geef ik een achtergrondkleur op. Sommige mensen hebben zelf de kleur en/of achtergrondkleur veranderd, bijvoorbeeld omdat ze slecht kleuren kunnen onderscheiden. Als ik nu de achtergrondkleur verander, maar niet de tekstkleur, loop ik het risico dat tekstkleur en achtergrondkleur te veel op elkaar gaan lijken.

Door beide op te geven, weet ik redelijk zeker dat achtergrond- en tekstkleur genoeg van elkaar blijven verschillen. Als de gebruiker !important heeft gebruikt, is er nog niets aan de hand, want dan veranderen achtergrond- en tekstkleur geen van beide.

In dit voorbeeld staat er verder nauwelijks tekst op de pagina, maar vaak zal dat wel het geval zijn, dus ik geef het toch op. Dan kan ik het later niet vergeten, als er toch meer tekst zou komen te staan.

background: #ff9;

Achtergrondkleurtje.

#content

Het element met id="content". Dit is de div, waar alle thumbs en dergelijke in staan.

width: 156px;

Een blok-element zoals een div krijgt normaal genomen automatisch dezelfde breedte als zijn ouder. Dat is hier het venster van de browser, dus dat zou veel te breed zijn.

De maximale breedte van de thumbs is 134 px. Je zou dus mogelijk denken dat deze div met 156 px veel te breed is. Maar binnen die 156 px komt nog een scrollbalk te staan, en die moet van de breedte worden afgetrokken. Vervolgens blijft er nog wat ruimte links en rechts over voor 'n kleine marge.

height: 100px;

De links met de thumbs staan in 'n lange rij onder elkaar. Door de hoogte van deze div te beperken tot 100 px, zie je maar één thumb.

overflow: auto;

overflow regelt het al dan niet verschijnen van een scrollbalk. De standaardwaarde is visible: ook als de inhoud er niet in past, toch laten zien. Dat zou in dit geval betekenen dat je de hele rij thumbs toch nog zou zien.

De waarde auto zorgt ervoor dat er een scrollbalk verschijnt, maar alleen als dat nodig is. En hier is het nodig, want de rij met veertien links en de daarin zittende thumbs is veel hoger dan 100 px.

margin-top: 3px;

Kleine ruimte tussen bovenkant van de div, en dus ook de daarin zittende thumbs, en de bovenkant van het venster van de browser.

.wrap

De elementen met class="wrap". Dit zijn de veertien spans, waarin alles is onderverdeeld. Voor elke link met de daarin zitten de thumb en de bijbehorende span met grote foto, het pijltje terug en het pijltje vooruit is er zo'n span.

display: block;

Van zichzelf is een span een inline-element. Door er een blok-element van te maken, kan ik eigenschappen als hoogte gebruiken.

position: relative;

Om kinderen van deze span te kunnen positioneren ten opzichte van deze span, moet de span zelf een relatieve, fixed of absolute positie hebben. Omdat ik hier verder niets bij invul, heeft het voor de span zelf geen enkele invloed.

height: 100px;

De thumbs zijn 100 px hoog. Althans: ze worden op deze hoogte getoond, ook als ze eventueel hoger of lager zijn. Door de spans even hoog te maken, komen de thumbs tegen elkaar aan te staan.

Eigenlijk zou dit niet nodig moeten zijn, want een blok-element wordt automatisch precies hoog genoeg om de erin zittende elementen weer te geven. Als ik dit echter niet opgeef, reageert Opera niet alleen op de thumb zelf bij hoveren, maar ook over de volle hoogte van het venster onder de thumb. Bovendien toont Internet Explorer 7 álle pijltjes. Netjes verdeeld over de volle hoogte van het venster.

Door ook voor deze span een hoogte op te geven, in combinatie met de regel gelijk hieronder, wordt dit voorkomen.

overflow: hidden;

De inhoud van deze spans is 100 px hoog, en hierboven is dezelfde hoogte al voor de spans opgegeven. Toch is voor Opera en Internet Explorer 7 ook nog deze regel nodig. In combinatie met de regel gelijk hierboven voorkomt dit de daar beschreven problemen.

text-align: center;

Een blok-element krijgt normaal genomen automatisch dezelfde breedte als zijn ouder. Dat is hier div#content, die een breedte van 156 px heeft. Daar gaat de scrollbalk van div#content nog vanaf. Deze span wordt dus 156 px minus een scrollbalk breed, dat is ongeveer 140 px.

Bij .thumb wordt een maximale breedte van 134 px opgegeven voor de thumbnails. De span is 140 px breed, dus ik houd 6 px over. Door de inline-elementen van de span horizontaal te centreren, wordt die 6 px links en rechts hetzelfde, waardoor links en rechts van de thumbs over dezelfde breedte de achtergrondkleur van de pagina zichtbaar is.

(De thumbnails zijn gewone images. In tegenstelling tot wat veel mensen denken, is een <img> een inline-element. Weliswaar met wat bijzondere eigenschappen, maar het blijft een inline-element. Het kan dus op dezelfde manier worden gecentreerd als andere inline-elementen, zoals tekst.)

.vorige, .volgende

De elementen met class="vorige" en class="volgende". Dit zijn de links, waarbinnen de pijltjes terug en vooruit staan. De meeste instellingen zijn voor beide links hetzelfde, dus die kan ik hier combineren. Verderop geef ik voor .volgende een paar afwijkende instellingen op.

position: absolute;

Om de links op de goede plaats neer te kunnen zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die een relatieve, absolute of fixed positie heeft. Dat is hier span.wrap.

Een link is van zichzelf een inline-element. Door de link absoluut te positioneren, verandert ze in een soort blok-element. Daardoor kun je eigenschappen als hoogte en breedte gebruiken.

left: 1px; Pijltjes terug en vooruit

Op 1 px vanaf de linkerkant van span.wrap zetten.

Op de afbeelding hiernaast heb ik de achtergrond van de pijltjes even zwart gemaakt, zodat ze wat duidelijker te zien zijn.

Rechts van het rechterpijltje zit een kier van ongeveer 1 px breed. Door die kier zie je de achtergrondkleur van de pagina. Die kier is niet goed weg te krijgen, dat heeft kennelijk met de scrollbalk te maken. Voor de symmetrie heb ik daarom links een even grote kier gemaakt. Je moet trouwens wel héél goed kijken om die kier te zien, maar goed, je moet iets over hebben voor het in stand houden van je diploma Rijksgediplomeerd Senior Mierenneuker.

z-index: 1;

Dit zou overbodig moeten zijn. Maar om een of andere wonderlijke reden werkt de Tab-toets in Opera niet, als je dit hier niet neerzet.

Pardon??? Die Tab-toets heeft hier toch niets mee te maken? Nee. Daarom noem ik het ook 'n 'wonderlijke' reden. Mogelijk zouden allerlei andere dingen ook werken, maar dat heb ik verder niet uitgezocht. De Tab-toets is niet bepaald Opera's sterkste punt...

Een z-index werkt alleen als het element een fixed, absolute of relatieve positie heeft, zoals hier het geval is.

width: 1.4em; height: 1.4em;

Breedte en hoogte. Door de maat in em te nemen en niet in px, verandert de link en dus de daarin zittende achtergrond mee met de lettergrootte.

border-radius: 0 0 10px;

Omdat voor linksonder geen waarde is ingevuld, krijgt die automatisch dezelfde waarde als rechtsboven. Hier staat dus eigenlijk 0 0 10px 0 in de volgorde linksboven - rechtsboven - rechtsonder - linksonder. Alleen rechtsonder een ronde hoek.

Oudere browsers zoals Internet Explorer 7 en 8 kennen dit niet, dus die negeren dit en houden gewoon rechte hoeken.

color: black;

Tekst binnen een link krijgt normaal genomen een afwijkende kleur. Dat wil ik hier niet.

background-color: white; background-color: rgba(255, 255, 255, 0.7);

Het gebruik van rgba() kan bij iets oudere browsers grote problemen geven, tot en met het volledig onleesbaar worden van tekst. Deze browsers kennen wel css en veranderen dus bijvoorbeeld wel de kleur van de tekst, maar kennen geen rgba(), waardoor de kleur van de achtergrond niet wordt veranderd. Met 'n beetje pech levert dat 'n tekstkleur op, die niet of nauwelijks is te onderscheiden van de achtergrond. In dit geval zouden op een wat donkerder thumb de pijltjes vrijwel volledig onzichtbaar worden.

Daarom staat er twee keer een achtergrondkleur. De eerste wordt door alle browsers gelezen, ook door oudere. De tweede achtergrondkleur met rgba() wordt genegeerd door de oudere browsers, omdat ze dit niet kennen. Die oudere browsers, zoals Internet Explorer 7 en 8, krijgen dus gewoon een massief witte achtergrond.

(Zo zou het volgens de standaard horen te werken. Maar Internet Explorer 7 trekt zich daar niets van aan. Voor die browser volgt eigen css.)

Meestal wordt voor 'n kleur de hexadecimale notatie gebruikt, iets als color: #33ab01;. Daarbij worden niet alleen cijfers, maar ook letters gebruikt. 0 t/m 9 werken precies hetzelfde als altijd, maar na de 9 komen nog A, B, C, D, E en F.

Als je telt, is 't dus: 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12, enz. Daarbij is A gelijk aan het tientallige 10, B aan 11, enz. Op deze manier kun je met twee cijfers en/of letters 256 mogelijkheden aangeven: van 00 t/m FF.

De eerste drie getallen bij rgba() geven de kleur aan. Deze lopen van 0 t/m 255, dus ook hiermee kun je 256 mogelijkheden aangeven. En omdat er drie getallen zijn levert dat 256 x 256 x 256 = 16.777.216 mogelijke kleuren op, net iets meer dan het aantal kleurpotloden in de gemiddelde kleurdoos van 'n kind.

De notatie bij rgba() geeft dus precies evenveel mogelijkheden als de hexadecimale.

Het eerste getal staat voor rood, het tweede voor groen en het derde voor blauw (feitelijk de Engelse namen, maar de eerste letter is toevallig in het Nederlands hetzelfde). Uit deze drie kleuren zijn alle kleuren op een monitor opgebouwd.

255 wil zeggen volledig aanwezig, 0 wil zeggen helemaal ontbrekend.

255, 255, 255 levert wit op, 0 , 0 , 0 zwart.

In plaats van getallen mag je ook percentages gebruiken, bijvoorbeeld: rgba(10%, 20%, 100%, 0.3)

Omdat in dit voorbeeld drie keer 255 is opgegeven, levert dit een witte kleur op.

Het vierde getal staat voor het alfa-kanaal. Hiermee wordt de doorzichtigheid aangegeven. Dit getal loopt van 0 naar 1. Volledig doorzichtig is 0, volledig ondoorzichtig is 1.

Het getal voor het alfa-kanaal wordt als decimale breuk aangegeven, dus bijvoorbeeld 0.5 wil zeggen halfdoorzichtig. Let erop dat je 'n punt gebruikt, de Amerikaanse manier om breuken aan te geven. Als je 'n komma gebruikt, denkt de browser dat er twee verschillende getallen staan.

In dit voorbeeld is deze achtergrondkleur behoorlijk ondoorzichtig: 0.7. Hierdoor zie je de thumbs nog enigszins door de achtergrond heen, maar zijn de zwarte pijltjes toch altijd goed zichtbaar, ook op donkere thumbs.

text-decoration: none;

Tekst binnen een link wordt normaal genomen onderstreept, dat wil ik hier niet.

.volgende

De elementen met class="volgende". Dit zijn de links waarbinnen het pijltje naar rechts staat. Voor deze elementen geldt ook de css die is opgegeven bij .vorige, .volgende.

left: auto; right: 0;

Bij .vorige, .volgende is deze link op 1 px vanaf de linkerkant van span.wrap neergezet. Maar het pijltje naar rechts moet juist vanaf de rechterkant worden neergezet. Als ik het vanaf de linkerkant neerzet op bijvoorbeeld 126 px, staat het in eerste instantie prima. Maar het gaat grandioos mis, als de lettergrootte wordt verkleind of vergroot.

Op bovenstaande afbeelding zijn de letters - en dus ook de pijltjes, want dat zijn gewone leestekens - fors verkleind en vergroot. De grootte van de achtergrond van de pijltjes verandert mee. Maar de linkerkant van het rechterpijltje is op 126 px vanaf links neergezet. En die afstand verandert niet mee, waardoor het rechterpijltje en de bijbehorende achtergrond wreed worden losgerukt van de scrollbalk of juist op achterbakse wijze onder de scrollbalk worden weggemoffeld.

Daarom wordt het rechterpijltje ten opzichte van de rechterkant van span.wrap neergezet. Als nu de lettergrootte en dus de grootte van de achtergrond wordt veranderd, gebeurt dat vanaf rechts: de rechterkant blijft netjes rechts staan, en achtergrond en pijltje vergroten of verkleinen naar links toe, zoals op de afbeelding is te zien.

Bij .vorige, .volgende zijn de pijltjes met left: 1px; met 'n kiertje van 1 px neergezet. Het linkerpijltje blijft daar gewoon staan, het rechterpijltje zet ik hier helemaal rechts neer met right: 0;. 0 is hier prima, omdat er hoe dan ook 'n kiertje van ongeveer 1 px tussen de scrollbalk en span.wrap zit. Het resultaat is dus hetzelfde als bij het pijltje links met left: 1px;.

Om right te kunnen gebruiken, moet ik echter de opgegeven left: 1px; uitschakelen, anders werkt right: 0; niet. auto is de standaard-instelling voor left, door die op te geven, neutraliseer ik de bij .vorige, .volgende opgegeven left: 1px;.

border-radius: 0 0 0 10px;

Bij .vorige, .volgende is een ronde hoek rechtsonder opgeven. De pijltjes naar rechts moeten een ronde hoek aan de linksonder krijgen, en dat regel ik hier.

.thumb

De elementen met class="thumb". Dit zijn de thumbnails, de <img>'s.

max-width: 134px;

De thumbs mogen maximaal 134 px breed zijn. Hierdoor kan ik ze netjes centreren. Deze manier van weergeven leidt, in combinatie met de hieronder opgegeven hoogte, tot (een beetje) vervorming bij thumbs die breder zijn dan 134 px. Meer daarover gelijk hieronder bij hoogte.

In de html is bij sommige thumbs een grotere breedte opgegeven, omdat die breder zijn. Maar de in de css opgegeven breedte wint altijd van de breedte die in de html staat.

height: 100px;

Alle thumbs worden op deze hoogte weergegeven. Daarom is in de html geen hoogte opgegeven, het is hier efficiënter om dat in de css te doen. Zou je eventueel ook in de html een hoogte opgeven, dan heeft die geen enkel effect, omdat een hoogte in de css altijd wint van een hoogte in de html.

In combinatie met de hierboven opgegeven maximale breedte van 134 px leidt deze hoogte bij thumbs die breder zijn dan 134 px tot (enige) vervorming.

Het venstertje waarin de thumbs verschijnen, heeft een vaste breedte en hoogte. Maar de thumbs zijn niet allemaal even breed en hoog. Dit kun je op 'n aantal manieren oplossen, die allemaal hun eigen voor- en nadelen hebben. Ze hebben gemeenschappelijk dat ze geen van allen de perfecte oplossing zijn.

Het best is het te zien bij de laatste thumb, want die is nogal breed. Hiernaast staat de thumb, zoals hij in werkelijkheid is, met de juiste verhoudingen.

Ik heb gekozen voor een vaste hoogte en een maximumbreedte. Daardoor zie je wel de hele thumb, maar vervormd. Of dit kan, zal ook sterk afhangen van de afbeelding. Ik kan me voorstellen dat een bioloog zal gruwen van deze vervorming, terwijl ik het hier geen enkel probleem vind. De Mona Lisa zou ik weer niet zo willen vervormen, en de Toren van Pisa valt spontaan om.

Kortom: een ideale oplossing is dit niet.

Als je geen breedte of hoogte geeft, wordt de hele thumb getoond in de juiste verhoudingen. Maar het wordt dan wel heel klein bij een brede thumb.

Een andere mogelijkheid is nog om alleen de hoogte op te geven en geen breedte. De verhoudingen zijn dan juist en het is lekker groot, maar het arme beestje is wel de rechterhelft van z'n lichaam kwijtgeraakt.

outline: solid transparent 0;

Opera zet een brede knalblauwe outline rondom een afbeelding in een link, als de link focus heeft. Vuurtorens worden niet meer gebouwd en ik vermoed dat de ontwerper van vuurtorens nu bij Opera werkt, want qua intensiteit is deze outline alleen te vergelijken met de voormalige Scheveningse vuurtoren.

Hoe dan ook, Opera is kennelijk zo trots op deze outline dat hij alleen met deze regel is uit te schakelen. Een simpel outline: 0; werkt niet.

(Zie je wel: ik mopper echt niet alleen op Internet Explorer.)

border: 0;

Ooit kreeg in alle browsers een image binnen een link standaard een blauwe border, die overduidelijk bedacht was door het kleine nichtje van voornoemde vuurtoren-ontwerper: even foeilelijk, maar iets minder 'n knalkleur en iets minder breed.

Inmiddels doet alleen Internet Explorer dit nog. Hiermee wordt de lelijke rand rondom de thumbnail weggehaald.

.foto

De elementen met class="foto". Dit zijn de spans waarbinnen de grote foto's als achtergrond-afbeelding worden getoond.

display: none;

Standaard moeten deze spans, en dus de erin zittende achtergrond-afbeelding, niet worden getoond.

position: fixed;

Zet de span neer ten opzichte van het venster van de browser. Dit wil zeggen dat de span verder helemaal nergens rekening mee houdt.

Als ik position: absolute; zou gebruiken, zou hij worden gepositioneerd ten opzichte van de eerste ouder met een relatieve, fixed of absolute positie. Dat is hier span.wrap, waarvan de overflow op hidden staat. Daardoor zou je alleen zien wat binnen span.wrap past, en dat is maar heel weinig.

(Om even heel precies te zijn: van span.foto past helemaal niets binnen span.wrap, dus je zou helemaal niet van de grote afbeelding zien.)

Áls ik position: absolute; al zou kunnen gebruiken, dan zou dat hartstikke ingewikkeld worden. Daarom kies ik voor een fixed positie: helemaal geen problemen met ouders, grootouders of andere lastige familieleden, gewoon rechtstreeks positioneren ten opzichte van het venster van de browser.

Nadeel is dat in een klein venster de span kleiner kan worden dan de erin zittende achtergrond-afbeelding. Daardoor verdwijnt het deel van de afbeelding dat niet in de span past, zonder dat er een scrollbalk verschijnt. In nieuwere browsers kun je de grootte van de afbeelding aanpassen met behulp van background-size: contain;, wat ik verderop doe. Maar in Internet Explorer 7 en 8, die die eigenschap niet kennen, verdwijnt inderdaad het deel van de grote afbeelding dat niet binnen het venster van de browser past.

Van zichzelf is een span een inline-element. Door het een fixed positie te geven, verandert het in een soort blok-element, waardoor ik eigenschappen als breedte en hoogte kan gebruiken.

top: 3px; right: 0; bottom: 0; left: 165px;

De grote afbeeldingen worden als achtergrond-afbeelding getoond. Een achtergrond-afbeelding heeft geen afmeting, hij vult alleen maar de achtergrond van het element, waar hij in staat. Ik moet dat element, hier de span, dus een afmeting geven die zo groot is, dat de hele achtergrond-afbeelding erin past.

top: 3px; vanaf de bovenkant van het venster van de browser: op dezelfde hoogte als de thumbnails.

right: 0; tot aan de rechterkant van het venster.

bottom: 0; tot aan de onderkant van het venster.

left: 165px; links staan de thumbnails, dus rechts daarvan neerzetten.

max-width: 615px; max-height: 615px;

De span loopt helemaal tot aan de rechter- en onderkant van het venster van de browser. Door het gebruik van background-size: contain; verderop wordt de erin zittende achtergrond-afbeelding vergroot tot hij de span volledig vult. Op grotere schermen kan daardoor de grote afbeelding enorm worden vergroot. En browsers zijn niet echt heel goed in het op 'n mooie manier vergroten van afbeeldingen, dat gaat veel beter in gespecialiseerde grafische programma's.

Daarom beperk ik de breedte en hoogte van de span tot maximaal 615 px. Geen enkele afbeelding is breder of hoger dan 615 px. Eventuele kleinere afbeeldingen worden nu wel wat vergroot, maar niet zoveel.

a:focus

Als een link focus heeft. Een link heeft focus, als je op Enter drukt en de link wordt gevolgd.

outline: 0;

Normaal genomen krijgt een link die focus heeft een of ander kadertje, zodat je kunt zien welke link wordt gevolgd als je op Enter drukt (of iets soortgelijks doet). Normaal genomen is dat heel belangrijk, omdat je anders heel snel de weg kwijt kunt raken, zeker als je geen muis kunt of wilt gebruiken.

Maar hier heeft dit geen enkel nut en is alleen maar lelijk, dus haal ik hem weg.

#blokkeer

Het element met id="blokkeer". Dit is een div, die verder helemaal leeg is. Hij wordt alleen gebruikt om delen van het scherm ongevoelig te maken voor hoveren.

Wat is het probleem? span.foto, waarin de de grote afbeelding wordt getoond, is onderdeel van a.link. Daardoor reageert ook span.foto op hoveren. Oftewel: als ik met de cursor boven span.foto hang, dan blijft de dan geopende grote foto zichtbaar. Omdat dit hetzelfde is, als wanneer ik over a.link hover: span.foto is gewoon een uitbreiding van a.link

Stel dat ik met de cursor boven span.foto hang. Als ik nu met de Tab-toets naar de volgende link ga en die daardoor focus geef, verschijnt de thumb wel, maar de bijbehorende grote foto niet. Omdat ik nog steeds hover over de span die bij de vorige link hoort, blijft de bij de vorige thumb horende foto gewoon geopend.

Dit kan nog verwarrender worden, omdat span.foto groter is dan de zichtbare achtergrond-afbeelding. Als je buiten de grote afbeelding, maar binnen span.foto hovert, zul je niet snel op het idee komen dat dit met hoveren over de grote afbeelding te maken heeft. Daarom wordt een extra div aangebracht, die span.foto afschermt, zodat de span niet meer gevoelig is voor hoveren.

Deze methode heeft wel 'n nadeel. Als er meer op de pagina staat dan alleen dit voorbeeld, zullen de extra elementen op de pagina gewoon te zien zijn, omdat de div geen achtergrond heeft. Maar klikken op de extra elementen, selecteren van tekst, invoeren, en dergelijke hoeven niet zonder meer te werken, omdat deze div de extra elementen af kan dekken.

Dit is vrij simpel op te lossen. div#blokkeer heeft een absolute positie, en daardoor krijgt hij automatisch een z-index. Elementen zonder relatieve, fixed of absolute positie hebben geen z-index: ze staan altijd onder elementen die wel een z-index hebben, ook al komen ze later in de html. Door de extra elementen een relatieve positie te geven, krijgen ze een z-index en komen boven div#blokkeer te staan. Nu zijn ze niet alleen meer zichtbaar, maar zijn ze ook gewoon normaal benaderbaar.

Als je verder niets invult bij die relatieve positie, heeft dit geen invloed op de extra elementen. Alleen de buitenste elementen hoeven een relatieve positie te krijgen. Als je een div een relatieve positie geeft, krijgt die een z-index. Van die z-index profiteren ook alle kinderen van die div.

Omdat Internet Explorer 7 zich op dit gebied niet aan de standaard houdt, is dit grappig genoeg de enige browser voor wie die hele div#blokkeer niet nodig is. Een van de zeldzame keren dat een bug of afwijking voordelig is. Dat komt goed uit trouwens, want de oplossing hierboven werkt namelijk ook niet voor deze browser. Als er problemen zijn in deze browser, kun je de hele div#blokkeer met display: none; verbergen voor Internet Explorer 7.

position: absolute;

Om de div op de juiste plaats neer te kunnen zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die zelf een fixed, relatieve of absolute positie heeft. Als die er niet is, zoals hier, wordt gepositioneerd ten opzichte van het venster van de browser.

top: 0; right: 0; bottom: 0; left: 156px;

Het hele venster vullen, behalve een strook aan de linkerkant. Binnen die strook zitten de thumbs, en die moeten wel reageren op hoveren. span.foto, die moet worden afgeschermd door deze div, staat sowieso niet boven die strook, dus het hele probleem met hoveren speelt daar toch niet.

#titel

Het element met id="titel". Dit is de paragraaf waarin 'Foto's van mijn huisdieren' staat.

position: absolute;

Om op de juiste plaats op het scherm te zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die zelf een relatieve, fixed of absolute positie heeft. Als die er niet is, zoals hier het geval is, wordt gepositioneerd ten opzichte van het venster van de browser.

left: 3px;

Linkerkant gelijk zetten met de linkerkant van de thumbnails.

top: 100px;

Iets onder de thumbnails zetten.

width: 151px;

Met deze breedte komt de rechterkant gelijk te staan met de rechterkant van de scrollbalk naast de thumbnails.

border: black solid 1px;

Zwart randje rondom de paragraaf.

color: black;

Tekstkleur zwart.

Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hieronder geef ik een achtergrondkleur op. Sommige mensen hebben zelf de kleur en/of achtergrondkleur veranderd, bijvoorbeeld omdat ze slecht kleuren kunnen onderscheiden. Als ik nu de achtergrondkleur verander, maar niet de tekstkleur, loop ik het risico dat tekstkleur en achtergrondkleur te veel op elkaar gaan lijken.

Door beide op te geven, weet ik redelijk zeker dat achtergrond- en tekstkleur genoeg van elkaar blijven verschillen. Als de gebruiker !important heeft gebruikt, is er nog niets aan de hand, want dan veranderen achtergrond- en tekstkleur geen van beide.

Ik heb dit ook al bij de body opgegeven, maar sommige mensen hebben bij álle elementen de kleuren veranderd. Het heeft immers weinig zin als ze dat alleen bij de body doen, terwijl de sitebouwer de kleuren ook bij bijvoorbeeld de paragrafen heeft aangepast.

background: #ffd;

Achtergrondkleurtje.

text-align: center;

Tekst horizontaal in het midden zetten.

#wrapper-help

Het element met id="wrapper-help". Dit is de paragraaf waarbinnen het hele hulpschermpje staat.

position: absolute;

Om op de juiste plaats op het scherm te zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die zelf een relatieve, fixed of absolute positie heeft. Als die er niet is, zoals hier het geval is, wordt gepositioneerd ten opzichte van het venster van de browser.

top: 230px;

Eind onder de titel zetten, zodat ook bij een grotere letter de titel niet over het plaatje met het vraagteken komt te staan.

left: 64px;

Door de linkerkant hier neer te zetten, komt het plaatje met het vraagteken precies midden onder de titel te staan.

margin: 0;

Een paragraaf heeft van zichzelf marges aan boven- en onderkant. Dat komt hier niet goed uit.

#help

Het element met id="help". Dit is de span waarbinnen de tekst voor het hulpschermpje staat.

display: none;

Onzichtbaar maken.

position: absolute;

Om het op de goede plaats neer te kunnen zetten. Er wordt gepositioneerd ten opzichte van de eerste ouder die zelf een fixed, absolute of relatieve positie heeft. Dat is hier p#wrapper-help.

Van zichzelf is een span een inline-element. Door hem absoluut te positioneren, wordt hij een soort blok-element en kan ik eigenschappen als breedte en hoogte gebruiken.

top: -220px;

220 px naar boven neerzetten. Hierdoor komt het hulpschermpje vrij hoog te staan, zodat het ook in kleinere vensters nog is te lezen.

width: 550px;

Breedte.

max-height: 440px;

Maximale hoogte. In kleinere vensters is de tekst hierdoor ook bij een grotere letter volledig te lezen.

overflow: auto;

Als het nodig is een scrollbalk openen. Hierboven is de maximale hoogte op 440 px gezet. Als de tekst daar niet meer in past, verschijnt een verticale scrollbalk.

Een scrollbalk is niet echt ideaal, maar je mag aannemen dat niemand deze tekst vanwege de hoogstaande literaire kwaliteiten 37 keer achter elkaar gaat lezen. En dat dan ook nog in een heel klein venster met een grote letter.

Oftewel: hier lijkt me die scrollbalk geen probleem. Je kunt dit ook veel ingewikkelder oplossen, zodat alleen als het echt nodig is een scrollbalk verschijnt, maar dat vind ik hier de moeite niet waard.

border: black solid 2px;

Zwart randje rondom de tekst.

(Wat heb ik toch met zwarte randjes? Vast 'n jeugdtrauma: op school werd elke week gekeken of je nagels geen zwarte randjes hadden. En als ze dat wel hadden, kreeg je klappen. Dat is die goede oude tijd, waar veel ouderen het over hebben. Toen je nog 'n knal voor je kop kreeg, alleen omdat je zwarte nagels had. Ja, dat was echt 'n heerlijke tijd voor kinderen, die goeie ouwe tijd...)

padding: 3px;

Kleine afstand tussen tekst en randje.

color: black;

Tekstkleur zwart.

Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hieronder geef ik een achtergrondkleur op. Sommige mensen hebben zelf de kleur en/of achtergrondkleur veranderd, bijvoorbeeld omdat ze slecht kleuren kunnen onderscheiden. Als ik nu de achtergrondkleur verander, maar niet de tekstkleur, loop ik het risico dat tekstkleur en achtergrondkleur te veel op elkaar gaan lijken.

Door beide op te geven, weet ik redelijk zeker dat achtergrond- en tekstkleur genoeg van elkaar blijven verschillen. Als de gebruiker !important heeft gebruikt, is er nog niets aan de hand, want dan veranderen achtergrond- en tekstkleur geen van beide.

Ik heb dit ook al bij de body opgegeven, maar sommige mensen hebben bij álle elementen de kleuren veranderd. Het heeft immers weinig zin als ze dat alleen bij de body doen, terwijl de sitebouwer de kleuren ook bij bijvoorbeeld de paragrafen heeft aangepast.

background: white;

Witte achtergrond.

.kopje

De elementen met class="kopje". Dit zijn spans waarin de iets vettere tekst binnen het hulpschermpje staat. Ik kan geen <h2> of zo gebruiken - los van of dat überhaupt wel 'n goed idee zou zijn -, omdat <h>'s blok-elementen zijn, en een blok-element mag niet binnen een inline-element staan. (In html5 mogen blok-elementen wel binnen een <a> staan.)

display: block;

Van zichzelf is een span een inline-element. Door er een blok-element van te maken, kan ik eigenschappen als margin-top gebruiken.

Hè? En hier gelijk boven zeg je dat 'n blok-element niet binnen 'n inline-element mag staan.

Ja, dat klopt. Een <h> is 'van nature' een blok-element. Een span, zoals de hier gebruikte span, is 'van nature' een inline-element. En ook als een inline-element in een blok-element wordt veranderd, mag het nog steeds binnen een ander inline-element worden neergezet. Wat dat betreft blijft het gewoon een inline-element.

margin-top: 4px;

Kleine afstand tussen kopje en tekst erboven.

font-weight: bold;

Vette tekst.

#wrapper-help:hover #help

Als ik over het element met id="wrapper-help" hover, doe dan iets met het daarin zittende element met id="help".

#wrapper-help is een paragraaf, een blok-element. Normaal genomen wordt een blok-element even breed als zijn ouder. Dat is hier het venster van de browser, dus veel te breed, want hoveren zou ook werken over die breedte. Maar bij #wrapper-help is de paragraaf absoluut gepositioneerd. En een absoluut gepositioneerd blok-element wordt niet breder dan nodig is om de inhoud weer te geven. Dat is hier alleen het plaatje met het vraagteken. Dus hoveren werkt ook alleen maar over de breedte van het plaatje.

Zonder die absolute positie had ik een breedte moeten opgeven aan #wrapper-help om te voorkomen dat hoveren rechts van het plaatje het hulpschermpje zou openen.

De paragraaf wordt automatisch even hoog als het plaatje, want een blok-element wordt automatisch precies hoog genoeg om de inhoud weer te kunnen geven.

Dit hele verhaal heeft tot resultaat dat het hulpschermpje alleen bij hoveren over het plaatje met het vraagteken wordt geopend.

In #help zit de tekst voor het hulpschermpje. De opmaak daarvan is al volledig opgegeven bij #help, ik hoef het hier alleen nog maar zichtbaar te maken.

display: block;

Zichtbaar maken.

Speciaal voor Internet Explorer 7

<!--[if IE 7]> <style type="text/css"> html {overflow: hidden;} #content {position: absolute; background: url(011-pics/space-1x1.gif);} .vorige, .volgende {background: white;} .link {display: inline-block; height: 100px;} #titel {top: 120px; z-index: -1;} #help {left: 0;} </style> <![endif]-->

Dit eigenaardige stukje code heet een 'conditional comment' en wordt door alle browsers gezien als commentaar, omdat het tussen <!-- en --> staat. Maar Internet Explorer herkent het, door de extra toevoegingen, als speciaal voor Internet Explorer bedoeld en zal het dus uitvoeren. Het is veiliger dan een zogenaamde 'hack', waarbij vaak gebruik wordt gemaakt van 'n fout (bug) in de browser. Dit is opzettelijk aangebracht door Microsoft en zal dus blijven bestaan, terwijl 'n bug gerepareerd kan worden.

De style voor Internet Explorer moet ná de normale komen, omdat de opdrachten voor Internet Explorer die uit de algemene stylesheet dan in principe overrulen.

Dit stukje geldt voor Internet Explorer 7, maar je kunt het ook voor andere versies aangeven.

In plaats van de style kun je ook 'n normale link naar 'n extern css-bestand aanbrengen:

<!--[if IE 7]> <link rel="stylesheet" type="text/css" href="../../css/naam-van-ie-stylesheet.css"> <![endif]-->

Op de plaats van "../../css/naam-van-ie-stylesheet.css" vul je pad naar en naam van jouw stylesheet voor Internet Explorer 7 in. De css voor Internet Explorer 7 komt dan apart in die stylesheet te staan, zodat het de andere browsers niet stoort.

Het is belangrijk dat de spaties in <!--[if IE 7]> en <![endif]--> precies zo worden overgenomen, zoals ze hier staan.

html {overflow: hidden;}

Als je 'n externe stylesheet gebruikt, loop je tegen 'n apart probleem aan bij html. Als je zonder meer html {overflow: hidden;} in je stylesheet zet, geldt dit voor élke pagina van je site. Terwijl het vrijwel zeker is dat er ook pagina's zullen zijn, waar deze instelling niet moet worden gebruikt.

Normaal genomen is dit geen probleem, omdat je bijvoorbeeld de body 'n id kunt geven. Maar <html valt buiten de body. Om dit op te lossen, kun je op de pagina's waar html {overflow: hidden;} moet worden gebruikt de html 'n id geven, bijvoorbeeld "ie-overflow-hidden". In je html wordt de regel dan iets als <html id="ie-overflow-hidden" lang="nl">. De precieze regel hangt af van het doctype wat je gebruikt.

In de stylesheet gebruik je dan gewoon html#ie-overflow-hidden {...}. Nu is dit alleen geldig voor de pagina's die bij html de juiste id hebben staan.

De overflow: hidden; zorgt voor het verdwijnen van de lelijke, volstrekt overbodige scrollbalk aan de linkerkant van het venster van deze browser.

#content

Het element met id="content". Dit is de div waarbinnen alle thumbs en dergelijke staan.

position: absolute;

Gelukkig is het inmiddels niet meer echt belangrijk om de oorzaak van alle grappen en grollen van dit kreng te kennen, omdat het gebruik heel snel afneemt. Dit is weer zo'n kuur van in de categorie 'Ome-Piet-had-weer-'ns-te-veel-gedronken-en-dacht-leuk-te-zijn'.

Zonder deze toevoeging toont Internet Explorer 7 alle thumbs. Netjes onder elkaar, dat wel. Door dit toe te voegen, is alleen één thumb zichtbaar, zoals de bedoeling is.

background: url(011-pics/space-1x1.gif);

Dit is een hele kleine doorzichtige gif. Echt heel klein: 1 x 1 px.

In de algemene css is opgegeven dat de thumbnails 100 px hoog moeten zijn met een maximale breedte van 134 px. Internet Explorer 7 negeert dat. Als de thumb breder is, toont hij toch de volle breedte. Daarbij wordt de hoogte verkleind.

Hierdoor ontstaat er soms een kier tussen de thumbnails. Als je precies boven die kier gaat hangen met de cursor, werkt het scrollwieltje niet. Deze gif zorgt ervoor dat het scrollwieltje ook boven die kier tussen de thumbs werkt.

.vorige, .volgende

De elementen met class="vorige" en class="volgende". Dit zijn de links waarbinnen de pijltjes staan.

background: white;

In de algemene css is een gewone witte achtergrondkleur opgegeven, maar daarna komt nog een achtergrondkleur, waarbij rgba() wordt gebruikt. Internet Explorer 7 kent dit niet, dus zou hij dit horen te negeren en de gewone achtergrondkleur moeten gebruiken. Maar in plaats daarvan negeert hij de achtergrondkleur volledig, ook de gewone. Als ik hem hier nog 'ns herhaal, snapt de ziel het wel.

.link

De elementen met class="link". Dit zijn de links waarbinnen de thumbs en de spans met de grote afbeeldingen zitten.

display: inline-block;

Van zichzelf is een link een inline-element. Door er een inline-blok van te maken, blijft het zich gedragen als een inline-element, terwijl ik toch eigenschappen als hoogte kan gebruiken.

height: 100px;

Om onduidelijke redenen worden lagere thumbs soms aan boven- of onderkant 'opgevuld' met de thumbs ervoor of erna. Dit gebeurt niet altijd. Ik heb verder niet uitgebreid gezocht naar de oorzaak, want het gewoon simpel 100 px hoog maken van de links waar de thumbs in staan, lost het op.

#titel Titel staat foutief boven afbeelding

Het element met id="titel". Dit is de paragraaf waarbinnen 'Foto's van mijn huisdieren' staat.

top: 120px;

Om redenen die waarschijnlijk alleen Microsoft écht begrijpt, komt de tekst met de titel iets te hoog te staan in deze wereldbrowser. Dus iets lager neerzetten.

z-index: -1;

De zoomfunctie in Internet Explorer 7 is hopeloos slecht (in Internet Explorer 8 en later werkt hij wel goed). Zonder de css voor #titel is het ontroerend slechte resultaat bij inzoomen (vergroten) te bewonderen op bovenstaande afbeelding: de grote afbeelding wordt niet groter en blijft op dezelfde plaats staan, maar de thumbs worden wel groter. Hierdoor komen de thumbnails ónder de grote afbeelding te staan.

Ook de titel komt ónder de grote afbeelding te staan. Althans: dat zou mooi zijn, maar de werkelijkheid is vaak niet zo mooi als de droom. De titel komt pontificaal óver de grote afbeelding te staan. Door een negatieve z-index te geven, komt de titel helemaal onderaan te staan.

Dan nog blijft het resultaat belabberd, maar in ieder geval is de grote afbeelding in z'n geheel te zien.

#help

Het element met id=”help”. Dit is de span waar de tekst van het hulpschermpje in staat.

left: 0;

Het hulpschermpje wordt in deze browser te ver naar links gezet. Bij een grotere letter levert dat problemen op, omdat er dan een scrollbalk in het hulpschermpje verschijnt. Maar scrollen kan niet, want er zit een opening tussen het plaatje met het vraagteken en het hulpschermpje. Het hulpschermpje sluit daardoor al voordat je het hebt bereikt. Deze regel lost dat op: nu staat het ook in Internet Explorer 7 op de juiste plaats.

De code aanpassen aan je eigen ontwerp

Toegankelijkheid en zoekmachines

Toegankelijkheid (accessibility in het Engels) is belangrijk voor bijvoorbeeld blinden die een spraakbrowser gebruiken, of voor motorisch gehandicapte mensen die moeite hebben met het bedienen van een muis. Een spider van een zoekmachine (dat is het programmaatje wat de site indexeert voor de zoekmachine) is te vergelijken met een blinde. Als je je site goed toegankelijk maakt voor gehandicapten, is dat dus gelijk goed voor een hogere plaats in een zoekmachine. Dus als je 't niet uit sociale motieven wilt doen, kun je 't uit egoïstische motieven doen.

(Op die plaats in de zoekmachine heb je maar beperkt invloed. De toegankelijkheid van je site is maar één van de factoren, maar zeker niet onbelangrijk.)

Als je bij het maken van je site al rekening houdt met toegankelijkheid, is dat nauwelijks extra werk. 't Is ongeveer te vergelijken met inbraakbescherming: doe dat bij 'n nieuw huis en 't is nauwelijks extra werk, doe 't bij 'n bestaand huis en 't is al snel 'n enorme klus.

Enkele tips die helpen bij toegankelijkheid:

Getest in

Laatst gecontroleerd op 20 juli 2011.

Dit voorbeeld is getest in Firefox, Opera, Safari, Google Chrome, Internet Explorer 7, 8 en 9 in de resoluties 800x600, 1024x768 en 1280x1024. Steeds met de laatste versie van die browsers, omdat ik geen zin heb om rekening te houden met mensen die met zwaar verouderde browsers surfen. Dat is trouwens vragen om ellende, want updates van browsers hebben heel vaak met beveiligingsproblemen te maken. In de resoluties 1024x768 en 1280x1024 is ook in- en uitzoomen en een kleinere en grotere letter getest. Er is ingezoomd en vergroot tot zover de browser kan, maar niet verder dan tot 200%. Eventuele problemen staan bij Bekende problemen.

Naast deze 'gewone' browsers is alles ook getest in Lynx, WebbIE, Jaws en Fangs Screen Reader Emulator. Lynx is een browser die alleen tekst laat zien en geen css gebruikt. WebbIE is een browser die gericht is op mensen met een handicap. Jaws is een screenreader, zoals die door blinden wordt gebruikt. Fangs Screen Reader Emulator is een extensie bij Firefox die de pagina laat zien zoals een screenreader hem ziet.

Als het voorbeeld in deze vier programma's toegankelijk is, zou het in principe toegankelijk moeten zijn in alle aangepaste browsers en dergelijke. En dus ook voor zoekmachines, want een zoekmachine is redelijk vergelijkbaar met een blinde. Eventuele opmerkingen over de toegankelijkheid van dit voorbeeld staan bij Opmerkingen.

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!)

Wijzigingen

7 september 2008:

Nieuw opgenomen.

12 september 2008:

Bij het maken van het voorbeeld hierna, ook 'n slideshow, heb ik enkele oplossingen gevonden voor kleine probleempjes die hier nog in zaten. Ook is 'n enkele verbetering aangebracht.

15 januari 2009:

Omdat de pijltjes 'n hoge z-index hadden, waren die in sommige browsers zichtbaar door het hulpschermpje heen. Door bij p#wrapper-help a:hover span#help 'n hogere z-index op te nemen is dat verholpen.

23 maart 2009:

Tekst aangepast voor de nieuw verschenen Internet Explorer 8. De code hoefde niet te worden gewijzigd.

11 april 2009:

Er was toch 'n aanpassing nodig voor Internet Explorer 8. Door een bug daarin bleven - alleen in de download, niet op de site - alle afbeeldingen openstaan als je de Tab-toets gebruikte.

4 augustus 2009:

Alleen het voorbeeld op de site is gewijzigd en wijkt nu enigszins af van het voorbeeld in de download.

5 oktober 2009:

Download is nu hetzelfde als het voorbeeld op de site, beide hebben nu hetzelfde doctype en dezelfde tabindex.

24 mei 2010:

Breedte en hoogte toegevoegd aan de thumbnails. Foei tegen mezelf gezegd omdat ik dat was vergeten.

20 juli 2011:

28 augustus 2011:

Volledig herschreven. Omdat geen rekening meer is gehouden met Internet Explorer 6 en door het gebruik van enkele nieuwe css3-eigenschappen, kon de werking sterk worden verbeterd, terwijl toch minder html en css is gebruikt. Hieronder staan alleen maar de belangrijkste wijzigingen.

Bekende problemen

Internet Explorer 7 en 8

Internet Explorer 7

Safari, Opera en Google Chrome

Er zit verschil in hoe browsers met :focus omgaan. Welke browser het bij het goede eind heeft, is onduidelijk, want de specificatie is nogal vaag op dit punt. Dit was ook een van de redenen waardoor de thumbs in een vorige versie soms wat versprongen. Nu Internet Explorer 6 niet meer meedoet, kon dit verspringen worden gerepareerd. Maar niet alle problemen met :focus zijn goed op te lossen.

Als je op 'n thumb klikt, krijgt in Internet Explorer en Firefox geen enkele thumb focus. In Safari, Google Chrome en Opera krijgt de thumb waarop je klikt focus. Maar de link waarin die thumb zit, linkt naar de volgende span, dus naar de volgende thumb. Oftewel: niet de link die focus heeft, maar de daarop volgende link met de daarin zittende thumb is zichtbaar.

Zolang je met de cursor boven de thumb hangt, merk je daar niets van. Want dan hover je over de thumb, en dus opent de bij die thumb horende grote foto. Maar tegelijk is de grote foto van de thumb die focus heeft geopend, alleen zie je dat niet.

Zodra je echter niet meer over de thumb hovert, wordt de grote foto van de thumb die focus heeft zichtbaar. En dat is een andere foto, dan de thumb die zichtbaar is.

Dit speelt alleen maar bij klikken op de thumbs en dan nog alleen maar op het moment dat je de cursor van de thumb afhaalt. Er is weinig aan te doen, en omdat dit niet tegen de specificatie in lijkt te gaan, zit het er niet in dat dit snel gaat veranderen.

Mogelijk zou je met JavaScript iets kunnen doen, maar daar vind ik het niet ernstig genoeg voor, want tabben enz. werkt allemaal gewoon zoals het is bedoeld. Het speelt echt alleen maar op het moment dat je na klikken de cursor van de thumb afhaalt.

Opera

Als je op 'n thumb klikt, moet je de cursor even 'n tikje bewegen voor de bijbehorende grote foto opent. 'n probleem dat vaker speelt in Opera, dus ik neem aan dat gebruikers van Opera dat wel weten.

Alle browsers