Skip links en inhoudsopgave

Uitleg css-imagemap: landkaart met pop-ups van uitsnedes en extra informatie

Laatst aangepast: .

Bij hoveren over een land verschijnt meer informatie

Dit voorbeeld is verouderd

Normaal genomen wordt een voorbeeld vroeger of later geüpdatet. In dit geval kan dat niet, omdat dit voorbeeld stomweg ongeschikt is voor welk touchscreen dan ook. De kern van het voorbeeld is een afbeelding, waarop je heel precies met de muis een land kunt aanraken. Het is onmogelijk om datzelfde met een vinger te doen, omdat de aan te raken plekjes meestal veel te klein zijn. Probeer maar 'ns Monaco of Vaticaanstad te raken met 'n vinger...

In de uitleg wordt nog over code voor oudere versies van Internet Explorer gesproken, maar die code zelf is op de site verwijderd. Het is echter wat zonde van de tijd om elke verwijzing naar die mensenhatende browser uit de tekst te verwijderen, dus her en der zijn die blijven staan.

Omdat het, toen het werd gemaakt, best wel leuk werkte, blijft het gewoon op de site staan. Maar de gebruikte techniek is dus echt volstrekt ongeschikt voor touchscreens, waarop het voorbeeld dan ook niet (goed) zal werken.

Los van de verouderde code kunnen ook de overige teksten in deze uitleg, zoals die over toegankelijkheid, (sterk) verouderd zijn.

Korte omschrijving

De kaart van Europa is (onzichtbaar) in stukjes opgedeeld, die zo goed mogelijk de diverse landen bedekken. Achter elk stukje zit een link naar een aparte pagina over dat land, vandaar de naam 'css-imagemap'.

Zodra je met de cursor boven de kaart komt, opent rechts een grotere kaart van het land waar je boven hangt. Onder de kaart opent een venstertje met de vlag en nog wat andere informatie over het land.

Als je met de Tab-toets van link naar link gaat, geeft een blauwe ster aan in welk land je staat.

BELANGRIJK

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.

Als je deze handleiding graag uitprint (zonde van het bos), gebruik dan de pdf in de download. Deze pagina is niet geoptimaliseerd voor printen, de pdf kan wel makkelijk worden geprint.

Alles op deze site kan vrij worden gebruikt, met drie 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.

* Het kan zijn dat materiaal is gebruikt dat van anderen afkomstig is. Dat materiaal kan onder een bepaalde licentie vallen, waardoor het mogelijk niet onbeperkt gebruikt mag worden. Als dat zo is, wordt dat vermeld onder Inhoud van de download en licenties.

Een link naar www.css-voorbeelden.nl wordt trouwens altijd op prijs gesteld.

Alle code is geschreven in een afwijkende lettersoort en -kleur. De code die te maken heeft met de basis van dit voorbeeld (essentiële code), is in de hele uitleg onderstippeld blauw. Alle niet-essentiële code is bruin. (In de inhoudsopgave staat alles vanwege de leesbaarheid in een gewone letter.)

Opmerkingen

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

Dit voorbeeld is gemaakt op een systeem met Linux (Kubuntu). Daarbij is vooral gebruik gemaakt van Visual Studio Code, GIMP en Firefox met extensies. De pdf-bestanden zijn gemaakt met LibreOffice.

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

Achterliggend idee

Bij een 'gewone' imagemap zitten de links onder een daarvoor gevoelig stukje van een afbeelding. Dat stukje kan ook onregelmatig van vorm zijn. Je kunt er dus heel precies bijvoorbeeld 'n land mee afperken. Maar het is niet mogelijk om pop-ups weer te geven bij hoveren en dergelijke, in ieder geval niet zonder JavaScript.

Door gebruik van css kun je wel pop-ups gebruiken, maar je kunt er geen onregelmatige vormen mee afgrenzen. Of eigenlijk: in theorie is dat wel mogelijk, in de praktijk zou dat 'n waanzinnige hoeveelheid code opleveren. In theorie kun je per pixel aangeven wat er moet gebeuren. Maar 'n thumbnail van 200 x 200 px levert al 40.000 pixel op. Zelfs als 'n groot deel daarvan te combineren is, levert dat nog duizenden aparte stukjes op, die elk hun eigen code moeten hebben.

Bij deze landkaart heb ik voor 'n soort tussenoplossing gekozen. Met behulp van css worden (kleine) rechthoekjes afgegrensd. Veel landen blijken dan met één rechthoek al redelijk afgedekt te zijn. Sommige landen (Italië is 'n ramp) hebben meer rechthoekjes nodig.

De grenzen van de landen worden niet precies gevolgd, maar het lijkt alsof dat wel zo is. Ik vermoed dat hier, zoals zo vaak, meespeelt dat het menselijk oog makkelijk te foppen is.

Als je op de site zelf aan de linkerkant van de kaart van Europa gaat hangen met je cursor, zie je de voor hoveren gevoelige plekken verschijnen (in het gedownloade voorbeeld heb ik dat weggelaten, de code is al ingewikkeld genoeg voor veel mensen, denk ik). Je kunt dan zien dat Italië door in totaal zes stukken wordt afgedekt. Als je over een van die stukken hovert, openen twee pop-ups: eentje met de landkaart van Italië, en eentje met wat informatie zoals de vlag en de hoofdstad.

Om de rechthoekjes te krijgen verander ik het inline-element <a> in een blok-element en positioneer het op de juiste plaats met de juiste hoogte en breedte. In de <a> zit een span. Bij hoveren krijgt die als achtergrond-afbeelding de landkaart van het betreffende land. Omdat het een achtergrond-afbeelding is wordt die pas geladen als hij wordt getoond. Dat is wel handig, want alle landkaarten bij elkaar zijn ruim 2,5 MB, en daar maak je je niet populair mee bij mensen met 'n beperkte bandbreedte of 'n trage verbinding.

Binnen deze span zitten nog twee 'sub-'spans: eentje met de naam van het land, en eentje met de extra info als vlag en hoofdstad. De naam van het land is gewoon tekst. De extra info is een gewone afbeelding met de vlag van het land en verder gewone tekst. Die vlaggen worden gelijk geladen als de pagina wordt geladen, omdat het gewone afbeeldingen zijn, maar dat is geen probleem omdat ze heel klein zijn.

De spans met de extra info gebruiken 'n gewone <br> om alle onderdelen op 'n nieuwe regel te zetten. Aan het eind van de laatste regel staat ook 'n <br>. Dat is omdat tekstbrowsers anders de laatste regel samenvoegen met de eerste regel van het volgende venster, en dat ziet er tamelijk onleesbaar uit.

Tijdens het maken van dit voorbeeld bleek zich 'n aantal aparte problemen voor te doen.

Door met al deze dingen rekening te houden is de volgorde van de links ogenschijnlijk nogal onlogisch geworden. Dat is dus niet zo: de volgorde wordt bepaald door wat hierboven staat.

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

Dit deel van de uitleg is pas later toegevoegd. Deze toevoeging dwingt gelijk ook om nog 'ns kritisch te kijken naar hoe ik dit tot nu toe heb gedaan.

Als ik dit voorbeeld nu zou maken, zou ik ook :focus en :active gebruiken. Mede omdat ik inmiddels heb gezien dat Safari de naam van de pagina onder de link niet laat zien in de statusbalk. Dat heb ik dus in eerste instantie gemist, waardoor ik nu levenslang gebukt ga onder diepe schuldgevoelens.

Ik laat het zoals het is, omdat het relatief makkelijk is om zelf :focus en :active toe te voegen en eventueel het sterretje te verwijderen. Bovendien vind ik het sterretje wel grappig, en het gaat uiteindelijk om 'n voorbeeld, niet om iets wat je zonder enige wijziging daadwerkelijk moet gaan gebruiken.

Bij Dan is er ook nog 'n groep mensen... staat nog wat meer over sterretje, :hover, :focus en :active.

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. Anders dan bij de meeste voorbeelden is de code van het gedownloade voorbeeld nogal afwijkend van het voorbeeld op de site. De twee grote witte navigatieknoppen hadden nogal 'n forse ruzie met de rest van de pagina en moesten hardhandig op hun plaats worden gezet. Omdat die navigatieknoppen niet in de download zitten, zijn de aanpassingen ervoor dus ook niet nodig.

In het voorbeeld op de site worden de hotspots zichtbaar als je de cursor links van de kaart van Europa plaatst. Ook dat is weggelaten uit de download, dus ook de code daarvoor ontbreekt.

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.html.

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

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

<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" />

Deze regel 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).

Deze regel 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.

<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 dat 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 p {
            margin-left: 16px;
            height: 120px;
            text-align: center;
        }

body

margin: 0; border: 0;

Slim om te doen, is soms wat afwijkend in verschillende browsers.

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

Lettersoort. Als er geen Arial is, wordt gezocht naar Helvetica. Als dat er ook niet is in ieder geval 'n lettersoort zonder schreef (dwarsstreepjes).

font-size: 110%;

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

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

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

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

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

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

color: black;

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

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

background: #ff9;

Kleurtje aan de achtergrond geven.

div#wrapper

De div met id="wrapper": de div waarbinnen de hele handel staat, behalve de losse tekst rechts van de landkaart van Europa.

position: relative;

Om te kunnen positioneren ten opzichte van deze div, moet deze div zelf 'n positie hebben, zelfs als ik daar verder niets invul. Nu kan ik de pop-ups positioneren ten opzichte van deze div. Ook kan ik nu z-index gebruiken, dat kan alleen bij 'n element dat 'n positie heeft.

z-index: 5;

In de html komt de tekst die naast de kaart van Europa staat helemaal onderaan. Omdat die tekst als laatste in de html staat, zou die altijd zichtbaar blijven, ook door 'n pop-up heen. Door deze div 'n hogere z-index te geven dan die tekst voorkom ik dat.

margin: 10px;

Kleine afstand tussen inhoud van de div en venster van de browser.

a

Alle links.

position: absolute;

Elke link moet 'n stukje van de kaart beslaan. Daarvoor moet ik ze op de juiste plaats kunnen positioneren. Het eerste ouder-element met 'n positie is div#wrapper, dus er wordt gepositioneerd ten opzichte van die div.

Van zichzelf is 'n <a> 'n inline-element. Door het absoluut te positioneren verandert het in 'n blok-element en kan ik attributen als hoogte en breedte gebruiken.

top: 0;

De bovenste rij links, die de bovenste landen moeten bestrijken, staan helemaal bovenaan. Door dit hier op te geven, hoef ik bij de afzonderlijke links geen top op te geven. Bij links die lager komen te staan moet ik later gewoon alsnog 'n andere top opgeven, maar dit spaart toch 'n aantal keren dit attribuut uit.

text-decoration: none; color: black;

De spans met de naam van het land en de extra informatie staan binnen deze link. Die zouden dus onderstreept worden, zoals gebruikelijk is bij 'n link. Maar dat wil ik hier niet. En ik wil ook niet de afwijkende kleur die bij 'n link hoort.

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

Dit is een heel kleine doorzichtige afbeelding. Zonder deze achtergrond-afbeelding werkt hoveren niet in Opera en Internet Explorer 6, 7 en 8.

(Opmerking 12 december 2010: inmiddels heeft Opera dit niet meer nodig.)

a span.img

De spans met class="img" die binnen 'n link liggen. Dit zijn de spans die de achtergrond-afbeelding met de landkaart van het betreffende land bevatten. Tevens zitten hier nog twee 'sub-'spans binnen: eentje met de naam van het land, en eentje met extra informatie zoals de vlag en de naam van de hoofdstad.

position: absolute;

Om de span op de juiste plaats neer te kunnen zetten.

top: -1400px;

De spans ver boven het scherm parkeren.

De sub-spans met de naam van het land en met de extra-informatie bevatten gewone normale tekst en 'n afbeelding. Die zouden gewoon zichtbaar zijn. Daarom parkeer ik de hele handel ver boven het scherm: onzichtbaar. Bij hoveren zet ik het deel wat zichtbaar moet worden dan gewoon terug op het scherm.

Er is nog 'n andere reden om buiten het scherm te parkeren. In sommige browsers krijg je vreemde problemen als 'n ogenschijnlijk overbodige scrollbar. Die kan verschijnen als je over de - onzichtbare - span hovert. Maar als hij buiten 't scherm staat, kun je er gewoon niet over hoveren: opgelost.

border: black solid 1px;

Randje rondom de kaart van het land.

a span.img-header

De spans met class="img-header" die binnen 'n link liggen. Dit zijn de spans waarbinnen de naam van het land staat, die boven de landkaart wordt getoond.

display: block;

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

height: 34px;

Hoogte. In dit geval neem ik een vaste hoogte, omdat ik niet wil dat bij 'n andere lettergrootte de witte achtergrond van de kop over de landkaart komt te staan.

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.

text-align: center;

Naam van het land centreren.

font-size: 20pt;

Ik gebruik hier geen em, zoals meestal, omdat in ieder geval in Internet Explorer nu de lettergrootte niet kan worden veranderd, en deze lettergrootte is groot zat. In andere browsers kan de lettergrootte nog steeds worden veranderd. Bij 'n zeer grote lettergrootte komt daardoor de naam van het land over de landkaart te staan. Een van de zeer weinige keren dat de beperkingen van Internet Explorer 'n voordeel blijken te hebben.

span.venster

De spans met class="venster". Dit zijn de spans waar de pop-up met de extra informatie, zoals vlag en hoofdstad, in staat.

position: absolute;

Om de pop-up op de goede plaats te kunnen zetten. Het eerste ouder-element met 'n positie is span.img, dus er wordt gepositioneerd ten opzichte van deze span.

Door het gebruik van 'n absolute positie verandert de span, die van zichzelf 'n inline-element is, in 'n blok-element, waardoor ik ook attributen als breedte kan gebruiken.

Deze span staat binnen span.img. Ik had hem waarschijnlijk ook helemaal zelfstandig kunnen neerzetten, rechtstreeks als kind van div#wrapper. Maar dit is afkomstig uit een eerdere constructie en het werkt goed, dus laat ik het lekker zo.

left: -308px; top: 350px;

Omdat span.img steeds op precies dezelfde plaats naast de kaart van Europa wordt neergezet, kan ik span.venster steeds dezelfde afstand naar links worden verplaatst. Hij komt dan op precies dezelfde breedte als de kaart van Europa te staan.

Voor de verticale positie geldt hetzelfde: met 350 px komt de extra informatie onder de kaart van Europa te staan.

width: 292px;

Breedte van de span en dus van de pop-up met informatie.

padding: 3px;

Kleine afstand tussen rand van de pop-up en inhoud.

border: black solid 1px;

Randje om de pop-up.

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: #bbb;

Achtergrondkleur van de span en dus van de pop-up met informatie.

.rechts

Het zusje van .links hierboven: de elementen met class="rechts".

float: right;

In de elementen met deze class staat de info over Montenegro. Hierboven worden de elementen met de info over Servië naar links gefloat. Nu staat Servië dus links en Montenegro rechts.

Clearen zoals hierboven bij .links mag niet, want deze info over Montenegro moet juist op dezelfde regel komen te staan als de gelijksoortige info over Servië.

.onderschrift

Elementen met class="onderschrift". In dit voorbeeld alleen de kleine uitleg onder de info over Servië en Montenegro.

clear: both;

Op 'n nieuwe regel zetten. Zonder deze opdracht zou de inhoud hiervan zoveel mogelijk tussen de gefloate elementen .links en .rechts van hierboven komen te staan.

display: block;

Van zichzelf is 'n span (.onderschrift is 'n span) 'n inline-element. Door het te veranderen in een blok-element kan ik attributen zoals clear gebruiken.

border-top: black dashed 1px;

Stippellijntje aan de bovenkant.

font-size: 0.7em;

Kleinere letter dan de rest. Ik gebruik em als eenheid, zodat ook gebruikers van Internet Explorer de lettergrootte kunnen veranderen.

a:hover

Als ik over 'n link hover. In dit voorbeeld bestrijkt elke link 'n stukje van de kaart van Europa.

cursor: pointer;

Zonder deze opdracht werkt het hoveren niet in Internet Explorer 6, en het zit de andere browsers niet dwars, dus...

a:active, a:focus

Als de link actief is of focus heeft. Actief is als je de muis ingedrukt houdt boven de link, focus als..., tja, als de link focus heeft: als je op Enter drukt, wordt de link gevolgd. Meestal aangegeven door 'n kadertje rondom de link. Ik moet beide gebruiken omdat Internet Explorer 6 en 7foutief active gebruiken alsof het focus is.

Dit is 'n extra voorziening voor mensen die met de Tab-toets (of op 'n soortgelijke manier via het toetsenbord) van link naar link gaan. Het normale kadertje rondom de link dat aangeeft waar je bent, werkt hier niet. Het wordt door alle browsers op 'n andere manier weergegeven, alleen Safari geeft het op 'n bruikbare manier weer. Kennelijk is door de gebruikte code onduidelijk voor de browser waar de grens van de link nou precies is. Maar daardoor komt het kadertje dus meestal volkomen foutief te staan. Dus moet ik zelf iets maken om aan te geven welke link focus heeft/actief is.

background: url(046-pics/ster.gif) no-repeat 50% 50%;

Kleine blauwe ster als achtergrondplaatje weergeven. Deze niet herhalen en in het midden van de link neerzetten. Dat kan omdat de links zijn veranderd in blok-elementen en hoogte en breedte hebben. Niet herhalen omdat 'n grote link anders verandert in 'n prachtige hemel vol sterren.

Toevallig komt het vrijwel overal goed uit als de ster in het midden staat. Bij de heel kleine links, zoals Vaticaanstad, is niet de hele ster zichtbaar, maar volgens mij kan het zo wel. In één geval staat de ster niet goed, dat corrigeer ik hieronder.

Los van de ster staat in de statusbalk naar welke pagina je gaat. Als je daar duidelijke namen voor gebruikt, zoals frankrijk.html en niet abracadabra als xg78eee.html, zouden ster en statusbalk 'n redelijke indicatie moeten zijn wat er gaat gebeuren als je de link volgt.

Je kunt ook :focus en :active toevoegen aan de :hover bij alle links, dan worden gewoon de landkaart en de extra info zichtbaar. Maar ik vond dit voor de afwisseling leuker.

Ook zou je, met iets meer moeite, bij elke link de naam van het land tevoorschijn kunnen laten komen als 'n soort tooltip.

a#ser-mon:active, a#ser-mon:focus

Als de link met id="ser-mon" actief is of focus heeft.

Het verhaal hier is precies hetzelfde als bij a:active, a:focus, maar dit geldt alleen voor de link bij Servië-Montenegro.

background: url(046-pics/ster.gif) no-repeat 50% 0;

De ster staat bij deze link niet op de goede plaats, dus verander ik de tweede 50% van hierboven in 0.

a#denemarken

De link met id="denemarken". Je zult 't niet geloven, maar dit is de link die hoort bij Denemarken! Weer 'n prachtig voorbeeld van mijn geniale gave om creatieve namen te bedenken!

De algemene instellingen voor alle links, waaronder deze, zijn hierboven al opgegeven bij a. Deze gelden dus ook voor deze link.

left: 67px;

Dit is ongeveer waar Denemarken begint. Ik hoef geen top op te geven, want die heb ik voor de bovenste rij al bij de algemene instellingen opgegeven: 0.

width: 45px; height: 45px;

Dit bestrijkt ruwweg Denemarken op de kaart van Europa. Ik heb nu dus 'n blok boven Denemarken waarbij ik bij hoveren iets kan laten gebeuren. (Oeps, als dit wordt gelezen door 'n AIVD'er die niets van css en html weet, heb ik 'n probleem...)

a#denemarken:hover span.img

Als ik hover boven de link met id="denemarken", doe dan het volgende met de span met id="img". Dat is de span waarbinnen de kaart van Denemarken, de naam die boven de kaart staat en de extra info zoals vlag en hoofdstad staan.

De naam boven de kaart staat in 'n eigen span binnen span.img, die wordt verder afgehandeld bij a span.img-header. Hetzelfde geldt voor de extra info, zie daarvoor bij span.venster. Hier wordt alleen de kaart van Denemarken afgehandeld.

left: 240px;

De span, en dus de achtergrond-afbeelding met de kaart van Denemarken, naast de kaart van Europa zetten. Het eerste ouder-element met 'n positie is div#wrapper, dus er wordt gepositioneerd ten opzichte van die div.

top: 0;

Deze hele span was bij de algemene instellingen 1400 px boven het scherm geparkeerd om problemen te voorkomen. Nu moet hij op het scherm worden gezet, anders is hij niet zichtbaar.

width: 715px; height: 575px;

Breedte en hoogte zijn afhankelijk van de maat van de betreffende kaart.

background: url(046-pics/denemarken.jpg);

De kaart van Denemarken als achtergrond-afbeelding weergeven. Omdat het 'n achtergrond-afbeelding is, wordt deze pas geladen als hij wordt weergegeven. Met in totaal meer dan 2,5 MB aan kaarten is dat niet onbelangrijk, anders zou alles worden geladen als de pagina wordt geopend, ongeacht of je het bekijkt of niet.

a#zweden

{left: 112px; width: 50px; height: 40px;} a#zweden:hover span.img {left: 195px; top: 0; width: 448px; height: 600px; background: url(046-pics/zweden.jpg) 0 40px;} a#wit-rusland {left: 238px; width: 65px; height: 82px;} a#wit-rusland:hover span.img {left: 69px; top: 0; width: 468px; height: 590px; background: url(046-pics/wit-rusland.jpg) 0 35px;} a#litouwen {left: 205px; width: 60px; height: 38px;}

a#litouwen:hover span.img

{left: 102px; top: 0; width: 508px; height: 597px; background: url(046-pics/litouwen.jpg) 0 35px;}

Allemaal precies hetzelfde als a#denemarken en a#denemarken:hover span.img met alleen andere maten bij left, breedte en hoogte, en 'n andere achtergrond-afbeelding. Ook moet bij de achtergrond-afbeelding de positie wat worden aangepast af en toe, omdat niet alle kaarten dezelfde rand rondom hebben.

a#rusland

{top: 31px; left: 200px; width: 30px; height: 13px; z-index: 40;}

Grotendeels hetzelfde als a#denemarken. Ik behandel hier alleen de verschillen. Dit hoort bij het kleine gele land rechtsboven op de kaart van Europa. (En voor je denkt dat jij of ik gek bent: Rusland heeft daar gewoon echt 'n klein stuk land in bezit. Dat was in ieder geval voor mij nieuw, ik had 't eerst per ongeluk Estland genoemd...)

top: 31px;

Omdat dit land lager ligt, moet de link ook lager op de kaart komen te staan. Alleen bij de bovenste rij landen is geen top nodig, omdat bij de algemene instellingen voor de links 0 is opgegeven. Maar 0 is hier niet meer de juiste afstand tot de bovenkant.

z-index: 40;

Omdat de code voor Rusland na de code voor Litouwen komt in de html, 'wint' Rusland van Litouwen bij hoveren. Maar nog later in de html komt de code voor Polen. (Waarom die volgorde zo is staat bij Tijdens het maken van dit voorbeeld..., hier volsta ik met te zeggen dat er redenen zijn voor die volgorde.)

Dat betekent dat de link van Polen bij hoveren 'wint' van Rusland ('t lijkt verdorie wel of ik hier de Derde Wereldoorlog aan 't verslaan ben...). Daardoor wordt de link van Rusland veel te klein. Door er 'n hogere z-index aan te geven, 'wint' deze link toch weer van Polen en blijft hij groot genoeg om (vrijwel) het hele stuk van Rusland te bedekken.

a#rusland:hover span.img

{left: 107px; top: -31px; width: 634px; height: 357px; background: url(046-pics/rusland.gif) 0 35px;}

Uitleg zie bij a#denemarken:hover span.img.

a#belgie

{top: 110px; left: 0; width: 40px; height: 17px;} a#belgie:hover span.img {left: 307px; top: -110px; width: 512px; height: 600px; background: url(046-pics/belgie.jpg) 0 35px;}

tot en met

a#macedonie {top: 272px; left: 242px; width: 37px; height: 25px;}

a#macedonie:hover span.img

{left: 65px; top: -272px; width: 495px; height: 599px; background: url(046-pics/macedonie.jpg) 0 35px;}

Uitleg zie bij a#denemarken en a#denemarken:hover span.img, met twee aanvullingen:

de uitleg van top en - voor zover dat voorkomt - z-index in de eerste regel van de twee bij elkaar horende regels staat bij a#rusland.

a#belgie-2

{top: 125px; left: 20px; width: 24px; height: 15px;} a#belgie-2:hover span.img {left: 287px; top: -125px; width: 512px; height: 600px; background: url(046-pics/belgie.jpg) 0 35px;}

tot en met

a#ser-mon-2 {top: 223px; left: 231px; width: 36px; height: 48px;}

a#ser-mon-2:hover span.img

{left: 76px; top: -223px; width: 444px; height: 607px; background: url(046-pics/ser-mon.jpg) 0 35px;}

Dit zijn de links voor de landen die aan één link niet genoeg hebben, omdat ze zo onregelmatig zijn gevormd. Met css kun je alleen maar rechthoeken en vierkanten maken, dus nogal wat landen die onregelmatig gevormd zijn hebben meerdere links nodig.

Waarom ik deze allemaal onderaan in de html heb gezet kun je lezen bij Tijdens het maken van dit voorbeeld..., hier volsta ik met te zeggen dat daar redenen voor zijn.

Afgezien van dat het hier om 'n tweede link gaat, is verder alles precies hetzelfde als bij a#belgie.

div#tekst

De div met id="tekst". De div waar de tekst in staat die rechts van de kaart van Europa staat.

position: absolute;

Om de tekst neer te kunnen zetten en z-index te kunnen gebruiken. Omdat er geen ouder-element met 'n positie is, wordt gepositioneerd ten opzichte van het venster van de browser.

top: 10px;

Bovenaan het venster van de browser zetten. Zonder deze opdracht wordt deze div gewoon onder div#wrapper neergezet. Omdat de inhoud van deze div met 'n <p> begint, die van zichzelf ook 'n marge aan boven- en onderkant heeft, geeft dit genoeg ruimte tussen de bovenkant van het venster van de browser en de tekst binnen deze div.

left: 330px;

Rechts van de kaart van Europa neerzetten.

width: 300px;

Door de div met de tekst wat smal te maken valt hij weg onder de pop-up met de landkaart, wat ik wat netter vind.

z-index: 1;

div#wrapper, de div met de kaarten en de extra info, heeft 'n z-index van 5. Daardoor komen de kaarten bij hoveren boven deze div met tekst te staan. Zonder dit attribuut zou de tekst gewoon door de kaart heen zichtbaar zijn, omdat deze div in de html na div#wrapper staat en dus zou 'winnen' bij hoveren.

De code aanpassen aan je eigen ontwerp

Toegankelijkheid en zoekmachines

Eventuele opmerkingen specifiek voor dit voorbeeld staan bij Opmerkingen.

Toegankelijkheid (accessibility in het Engels) is belangrijk voor bijvoorbeeld blinden die een schermlezer 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 14 november 2011.

(Internet Explorer 6 is voor het laatst gecontroleerd op 10 december 2009. Op deze browser test ik niet meer. Maar omdat de code nauwelijks is veranderd, neem ik aan dat dit voorbeeld ook nog werkt in Internet Explorer 6.)

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

Eventuele problemen met betrekking tot zoomen en lettergrootte staan bij Bekende problemen.

Naast deze 'gewone' browsers is 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 schermlezer, zoals die door blinden wordt gebruikt. Fangs Screen Reader Emulator is een extensie bij Firefox die de pagina laat zien zoals een schermlezer 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.

Dit voorbeeld is niet getest op geschiktheid voor mobiele apparaten (hier worden geen laptop/notebook/netbook en dergelijke mee bedoeld, want die gedragen zich als een gewone desktopcomputer). Er wordt in veel voorbeelden css en/of html gebruikt, waar niet elk mobiel apparaat mee uit de voeten zal kunnen. En lang niet alles is geschikt voor schermen met een breedte van minder dan 800 px.

Dingen die problemen zouden kunnen opleveren, zijn onder andere een te grote breedte, het gebruik van (te veel) afbeeldingen en/of css en html die niet (volledig) wordt ondersteund, zoals :hover, float en position.

Onder Opmerkingen staat mogelijk nog wat meer over de geschiktheid van dit voorbeeld voor mobiele apparaten.

(Terzijde: de site zelf is zeker niet geschikt voor kleine mobieltjes. Dat gaat ook niet veranderen. Ik kan me namelijk niet voorstellen dat iemand zo masochistisch is 'n uitleg van tientallen schermen op 'n klein mobieltje te gaan lezen. Voor de site zelf is een minimale breedte van 800 px vereist.)

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, enzovoort in wel geteste browsers: graag!)

Wijzigingen

Alleen grotere wijzigingen worden hier vermeld, geen dingen als een link die is geüpdatet.

:

Nieuw opgenomen.

19 februari 2009:

Aantal kleine correcties aangebracht in de uitleg, zoals dat Safari de naam van de pagina onder de link met focus niet weergeeft in de statusbalk.

23 maart 2009:

10 december 2009:

12 december 2010:

14 november 2011:

Bij Opmerkingen stukje over Page Speed toegevoegd.

13 november 2020:

Bekende problemen

Alle browsers

Internet Explorer 6

Op de site worden de hotspots getoond als de cursor links van de landkaart hangt. Dit werkt niet in Internet Explorer 6. In de download zit dit niet, dus dit speelt alleen maar in het voorbeeld op de site zelf.

Inhoud van de download en licenties

De inhoud van deze download kan vrij worden gebruikt, met drie beperkingen:

* Sommige onderdelen die van 'n andere site of zo afkomstig zijn, vallen mogelijk onder een of andere licentie. Dat is hieronder bij het betreffende onderdeel te vinden.

* Je gebruikt het materiaal uit deze download volledig op eigen risico. Het kan prima zijn dat er fouten in de hier verstrekte code en dergelijke zitten. Voor eventuele schade die door gebruik van materiaal uit deze download ontstaat, in welke vorm dan ook, zijn www.css-voorbeelden.nl en medewerkers daarvan op geen enkele manier verantwoordelijk.

* Dit voorbeeld (en de bijbehorende uitleg en dergelijke) wordt regelmatig bijgewerkt. Het is daarom niet toegestaan dit voorbeeld (en de bijbehorende uitleg en dergelijke) op welke manier dan ook te verspreiden, zonder daarbij duidelijk te vermelden dat voorbeeld, uitleg, en dergelijke afkomstig zijn 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.

afbeelding-046-dl.html: de pagina met het voorbeeld.

afbeelding-046.pdf: deze uitleg (aangepast aan de inhoud van de download).

afbeelding-046-inhoud-download-en-licenties.txt: een kopie van de tekst onder dit kopje (Inhoud van de download en licenties).

046-files-dl:

31 hulppagina's, voor elke link één.

046-pics:

europa.jpg: de grote landkaart.

31 kleine landkaarten met 32 bijbehorende vlaggen.

1 ster.

De vlaggen zijn afkomstig van www.cia.gov/the-world-factbook/references/flagsoftheworld en zijn publiek domein.

De landkaarten zijn afkomstig van maps.lib.utexas.edu en zijn publiek domein.

De herkomst van de ster is onduidelijk, maar het lijkt niet erg waarschijnlijk dat iemand die gaat claimen.