Uitleg video zonder plug-in in (bijna) elke browser
Laatst aangepast: .
Korte omschrijving
Video afspelen zonder plug-in of JavaScript in (vrijwel) elke browser.
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 min of meer 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
- De gebruikte video toont de eerste minuut van Big Buck Bunny.
-
Ook het <video>-element kan worden aangestuurd met behulp van een JavaScript API. Een Nederlandstalige handleiding heb ik niet kunnen vinden. Engelstalige handleidingen zijn er in overvloed. Het beste kun je zoeken naar iets als 'video element api'. Met 'n beetje geluk is er inmiddels ook een Nederlandstalige handleiding.
Op deze pagina is de API niet gebruikt. Het <video>-element draait in z'n meest simpele vorm, zoals dit door de maker van de browser is geïmplementeerd.
- In browservensters smaller dan 640 px ziet deze pagina er anders uit dan in bredere vensters. Je kunt dat zelf simuleren door het venster van de browser smaller te maken.
- Omdat ik in zalige onwetendheid verkeer, als het om de kwaliteit van video gaat, heb ik daar geen enkele rekening mee gehouden. Ik ben enigszins kleurenzwak en zie pas verschil tussen video's na het nuttigen van enige pillen of iets soortgelijks, dus het lijkt me niet handig de lezer daar verder lastig mee te vallen. Wat ik maar bedoel: je kunt zoveel formaten aanbieden als je wilt met <video>, dus ook het aanbieden van (zeer) hoge kwaliteit is mogelijk. Alleen weet ik daar verder nauwelijks iets vanaf.
- Voor de weergave worden twee video's gebruikt: eentje in het MP4-formaat en eentje in het WebM-formaat. Op dit moment is het gebruik van MP4 en WebM gratis, maar dat zou kunnen veranderen, zeker wat betreft MP4.
- Er worden slechts twee video-formaten gebruikt: WebM en MP4. In een eerdere versie werd ook ogg gebruikt. Alleen tamelijk oude versies van Opera en Firefox hebben dat nog nodig. Beide browsers hebben een uitstekend update-mechanisme. Daarom lijkt het 'n beetje overbodig om .ogg nog te gebruiken. Maar mocht je dat wel willen, dan kun je probleemloos een derde video toevoegen in het <video>-element. En desnoods nóg twintig andere formaten.
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 (KDE neon). 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
Tot voor kort moest de browser voor het afspelen van video's op internet gebruik maken van een hulpprogramma, een plug-in. Historische redenen, patentkwesties en de pogingen van Apple en Microsoft een monopolie te creëren, hebben geleid tot een wirwar aan verschillende video-formaten. (Er zijn ook nog wat technische redenen voor verschillende formaten. Maar de centen zijn, zoals zo vaak, toch de belangrijkste reden van het ontstane oerwoud.)
Apple en Microsoft zelf beweren natuurlijk dat ze een en ander geheel belangeloos voor het Heil Der Mensheid doen, maar ik neem de vrijheid daar toch 'n tikkeltje anders over te denken.
Naast Apple en Microsoft heb je clubs als Mozilla (Firefox) en Opera, die meer bezig zijn met het maken van goede browsers en het gebruik maken van de mogelijkheden die internet biedt.
Als laatste grote speler is er nog Google, die er alleen belang bij heeft dat er zoveel mogelijk video's worden bekeken, zodat ze aan de reclame kunnen verdienen.
Omdat video's in nogal wat verschillende formaten werden gemaakt, had je nogal wat plug-ins nodig als je alles wilde kunnen afspelen. Plug-ins zijn eigenlijk ondingen. Ze werken meestal veel trager dan de browser zelf en ze vormen een extra ingang voor allerlei vormen van malware.
Daarom zou het veel beter zijn, als de browser zelf video's zou kunnen afspelen, zonder gebruik van een plug-in. Met html5 is die mogelijkheid er gekomen. Het <video>-element laat de browser zelf een video afspelen, zonder gebruik van externe hulpmiddelen.
Alle iets nieuwere versies van alle browsers hebben <video> geïmplementeerd. Internet Explorer met ingang van versie 9, alle andere browsers al veel langer.
Helaas is met het implementeren van <video> het probleem met de verschillende formaten niet opgelost, omdat Apple en Microsoft dwars lagen. Beide bedrijven wilden niet meewerken aan een standaardformaat. Opera en Firefox (uiteraard) wel, en Google deed ook niet moeilijk, want die gaat het er alleen om dat je video's bekijkt, niet om het formaat waarin je dat doet. 'n Advertentie in MP4 ziet er hetzelfde uit als een advertentie in Ogg.
De problemen met de diverse formaten en de snelle veranderingen daardoor waren feitelijk niet meer bij te houden. Daarom heb ik een eerder voorbeeld op deze site vervangen door links naar sites die meer thuis waren in video's. Inmiddels is de situatie iets rustiger en ga ik ervan uit dat de hier gebruikte methode over twee maanden ook nog werkt.
In principe werkt <video> heel simpel. Je zet tussen <video> en </video> de bron van een video, en de browser zorgt voor de weergave en het bedieningspaneel.
Nog niet zo lang geleden moest je elke video in minimaal drie en liever nog in vier formaten opgeven, dankzij het gedonder met de patenten en zo. Gelukkig is dat inmiddels teruggebracht tot twee formaten.
MP4: de commerciële variant. Op het ogenblik mag dat gratis worden gebruikt, maar het is de vraag, of dat zo blijft. Deze wordt gebruikt door Safari en Internet Explorer. Ook iOS gebruikt dit.
WebM: het bedrijf hierachter is Google, dat heeft beloofd dat dit altijd gratis blijft. Het kan worden gebruikt onder de BSD-licentie, een van de open source-licenties. WebM wordt gebruikt door Opera, Firefox en Android browser.
Voor oudere versies van Opera en Firefox was vroeger Ogg nodig, ook open source, maar beide werken nu ook met WebM, dat technisch beter schijnt te zijn. Overigens kun je in <video> net zoveel formaten opgeven als je wilt, dus ook Ogg kan gewoon gebruikt worden, als je dat zou willen.
Google Chrome heeft al geruime tijd geleden aangekondigd te stoppen met MP4. Op dit moment wordt dit echter nog ondersteund. Als deze ondersteuning stopt, wordt gewoon WebM afgespeeld in plaats van MP4, want dit wordt ook ondersteund door Google Chrome. Dat Google in dit voorbeeld MP4 gebruikt, komt alleen omdat in de volgorde van de <source>'s MP4 voor WebM komt. Google Chrome op iOS zal, naar ik aanneem, gewoon MP4 blijven gebruiken, want Apple schijnt 'n zeldzame vorm van allergie te hebben voor WebM.
Met een video in WebM en MP4-formaat worden dus alle belangrijke browsers bestreken, ook de mobiele.
Voor het geval er helemaal niets werkt, staan onder de video twee links, waarmee de video kan worden gedownload en vervolgens afgespeeld. En als dat ook niet werkt? Dan heb ik nog maar één advies: ga hardlopen, kijk star onder een hoek van negentig graden naar links of rechts en geniet van het bewegende beeld. Ja zeg, er zijn grenzen...
<video> heeft 'n aantal voordelen boven plug-ins:
- Er zijn minder beveiligingsproblemen.
- Plug-ins komen vaak boven de andere delen van de pagina te staan, waardoor bijvoorbeeld een uitklapmenu achter de plug-in verdwijnt. <video> gedraagt zich gewoon zoals elk ander welopgevoed html-element.
- Plug-ins hebben vaak problemen met zoomen. <video> kan probleemloos worden vergroot en verkleind. Wel kan natuurlijk de kwaliteit van de video bij vergroten verminderen.
- Een ingebouwde speler belast de computer (veel) minder dan een externe plug-in.
- <video> kan met behulp van JavaScript en css worden voorzien van een eigen uiterlijk.
- Sommige plug-ins stelen de focus. Als je bijvoorbeeld iets in flash afspeelt, moet je eerst buiten de video klikken om weer iets te kunnen doen.
Hogeresolutieschermen
Vaak wordt dit soort schermen Retina-schermen genoemd, maar Retina is gewoon de merknaam van Apple voor een hogeresolutiescherm.
Er komen steeds meer apparaten met een hogere resolutie, dan op de desktop gebruikelijk is: meer dpi, dots per inch. Van oudsher wordt helaas 'inch' gebruikt als eenheid. Een nieuwere eenheid is dpcm: dots per centimeter. De beste eenheid voor het meten van de resolutie van een computerscherm is dppx: dots per px unit, maar deze wordt nog lang niet overal ondersteund. 1 dppx is even groot als 96 dpi, de standaardresolutie van een gewone desktop monitor (Apple had een iets andere dpi).
Als je meer pixels in een inch stopt, waardoor de pixels dichter op elkaar staan, krijg je fijnere afbeeldingen. Vooral bij ronde lijnen en dergelijke is dit goed te merken. Een ronde lijn die wordt weergegeven met 72 px per inch is grover, dan diezelfde lijn die met 300 px per inch wordt weergegeven.
Een lijn die op een normale desktopmonitor 4 px breed is, zou op zo'n hogeresolutiescherm van 300 dpi maar 1 px breed zijn. Superduidelijk, dat wel, maar zonder vergrootglas niet te zien. Omdat de pixels vier keer zo dicht op elkaar staan. Bestaande sites die vier (of meer) keer zo klein worden weergegeven, als waar ze voor bedoeld zijn, maken alleen opticiens vrolijk.
Althans: je zou die kleinere weergave op een hogeresolutiescherm verwachten. Maar gelukkig wordt dat voorkomen. Apparaten met een hogeresolutiescherm geven een 'valse' resolutie op. Een iPad met een hogeresolutiescherm geeft niet het aantal 'schermpixels' op, maar het aantal 'css-pixels'. En dat is hetzelfde als bij een 'normale' desktopmonitor. Hierdoor ziet een site er op een iPad hetzelfde uit als op een desktopmonitor.
Niet alleen de iPad heeft dit handigheidje, alle hogeresolutieschermen doen dit. Anders zouden ze volstrekt onbruikbaar zijn voor vrijwel alle sites.
Met behulp van media query's kun je testen op resolutiedichtheid. Maar de ondersteuning hiervan is is nog sterk in ontwikkeling, daarom test ik hier (nog) niet op.
Er zijn nogal wat sites die alleen rekening houden met de iPad/iPhone en Safari. Door dat te doen, werk je mee aan de kans op net zo'n monopolie, als Internet Explorer ooit had. Dat heeft ons jarenlang grote ellende opgeleverd. Het lijkt me niet handig om dat nog eens te gaan herhalen met Apple, temeer niet omdat Apple zich steeds meer als een gediplomeerd patenttrol begint te gedragen en veelbelovende pogingen doet Microsoft van de troon te stoten als meest onsympathiek bedrijf in de ICT.
Persoonlijk zou ik gewoon wachten, tot dit in een standaard is opgenomen en voldoende wordt ondersteund door de diverse browsers. Mocht je het toch willen gebruiken, dan zou je in ieder geval álle vormen moeten gebruiken, en niet alleen die met -webkit-
.
Op de pagina met links kun je onder CSS → Media Query's en Responsive Web Design links over dit onderwerp vinden.
Het <source>-element van <video> had tot voor kort een uiterst handig media
-attribuut. Hiermee kon je onder andere testen op de resolutie van een scherm, de grootte, enz. Aan de hand daarvan werd dan bepaald, welke video moest worden gebruikt. Hiermee kon je op een heel eenvoudige manier voorkomen dat bijvoorbeeld een smartphone een video voor een breedbeeld-tv zou downloaden.
Tijdens het ontwikkelen van dit voorbeeld vond w3c – de club die de standaard voor html, css, en dergelijke vaststelt – het wel geestig om het media
-attribuut te verwijderen uit het <source>-element. Terwijl dit al in alle browsers was ingebouwd en prima werkte. In plaats van deze perfect werkende simpele oplossing is nu een ingewikkelde JavaScript-oplossing of iets soortgelijks nodig, die ook nog 'ns veel slechter werkt. Voor elke extra test moet je namelijk weer 'n extra stuk JavaScript inbouwen.
Dit is des te krankzinniger, omdat vrijwel tegelijkertijd bij <picture> een soort media
-attribuut is toegevoegd. Niet alleen de wegen des Heeren blijken ondoorgrondelijk te zijn.
De enige mogelijkheid om hogeresolutievideo's af te spelen is op dit ogenblik het gebruik van iets als JavaScript. Wat nog eens extra ingewikkeld zou worden, omdat het testen op resolutie niet overal op dezelfde manier gebeurt (Apple ligt weer 'ns dwars en Microsoft loopt achter).
Op dit moment is eigenlijk de enige reële mogelijkheid om iedereen een hogeresolutievideo te sturen. Persoonlijk kies ik er dan voor om iedereen een eenvoudiger video te sturen, want je zadelt anders mensen met een simpel draadloos toestel ook op met een onwijs grote download.
Hopelijk komt er ooit een soortgelijke oplossing als voor afbeeldingen met <srcset> is gevonden.
De code aanpassen aan je eigen ontwerp
- Als je dit voorbeeld gaat aanpassen voor je eigen site, houdt het dan in eerste instantie zo eenvoudig mogelijk. Ga vooral geen details invullen.
-
Gebruik vooral geen FrontPage, Publisher of Word (alle drie van Microsoft). Deze programma's maken niet-standaard code die alleen goed te bekijken is in Internet Explorer. In alle andere browsers zie je grotendeels bagger, áls je al iets ziet.
Publisher en Word zijn niet bedoeld om websites mee te maken. FrontPage is zwaar verouderd en wordt niet meer onderhouden door Microsoft. Als je beslist iets van Microsoft wilt gebruiken, schaf dan (voor 'n fikse prijs) een nieuwer programma aan, dat zich wel aan de standaarden houdt.
Ook LibreOffice levert een uiterst beroerd soort html af. Tekstverwerkers met al hun toeters en bellen zijn gewoon niet geschikt om websites mee te bouwen.
Je kunt natuurlijk ook een goed gratis programma gebruiken. Links naar dat soort programma's vind je op de pagina met links onder Gereedschap → wysiwyg-editor.
Maar het allerbeste is om gewoon zelf html, css, enz. te leren, omdat zelfs het allerbeste programma het nog steeds zwaar verliest van 'n op de juiste manier met de hand gemaakte pagina.
-
Ik maak zelf het liefst een site in Firefox. Als je 'n site maakt in Firefox, Opera, Safari, Google Chrome of Internet Explorer 10 of later, is er 'n hele grote kans dat hij in alle browsers werkt. Ik geef de voorkeur aan Firefox, omdat er zoveel extensies (uitbreidingen) voor bestaan. Verder is Firefox de enige grote browser die niet bij een bedrijf hoort dat vooral op je centen of data uit is.
Google Chrome wordt ook door veel mensen gebruikt, maar ik heb wat moeite met hoe Google je hele surfgedrag, schoenmaat en kleur van je onderbroek vastlegt, daarom gebruik ik zelf Google Chrome alleen om te testen.
-
Het allereerste dat je moet invoeren, is het doctype, vóór welke andere code dan ook. Een lay-out met een missend of onvolledig doctype ziet er totaal anders uit dan een lay-out met een geldig doctype. Wát er anders is, verschilt ook nog 'ns tussen de diverse browsers. Als je klaar bent en dan nog 'ns 'n doctype gaat invoeren, weet je vrijwel zeker dat je van voren af aan kunt beginnen met de lay-out.
Geldige doctypes vind je op www.w3.org/QA/2002/04/valid-dtd-list.
Gebruik het volledige doctype, inclusief de url, anders werkt het niet goed.
-
Gebruik een 'strict' doctype of (beter!) het doctype voor html5. Deze zijn bedoeld voor nieuwe sites. Het transitional doctype is bedoeld voor al bestaande sites, niet voor nieuwe. Het doctype voor html5 is uiterst simpel:
<!doctype html>
.Het transitional doctype staat talloze tags toe, die in html5 zijn verboden. Deze tags worden al zo'n tien jaar afgeraden. Het transitional doctype is echt alleen bedoeld om de puinhoop van vroeger, toen niet volgens standaarden werd gewerkt, enigszins te herstellen.
Het strict doctype staat verouderde tags niet toe. Daardoor kan met 'n strict doctype, of het nu html of xhtml is, probleemloos worden overgestapt naar html5. Met een transitional doctype en het gebruik van afgekeurde tags kun je niet overstappen naar html5. Je moet dan eerst alle verouderde tags verwijderen, wat echt ontzettend veel werk kan zijn.
- Als tweede voer je de charset in. Het beste kun je utf-8 nemen. Als je later van charset verandert, loop je 'n grote kans dat je alle aparte tekens als letters met accenten weer opnieuw moet gaan invoeren. In html5 is het simpele
<meta charset="utf-8">
voldoende. - Test vanaf het allereerste begin in zoveel mogelijk verschillende browsers in 'n aantal resoluties (schermgroottes). Onder het kopje Getest in kun je in deze uitleg vinden, waar ikzelf op test. Ook van Internet Explorer kun je meerdere versies naast elkaar draaien. Je kunt daarvoor zoeken op internet en op de pagina met links staan onder de kopjes Gereedschap → Meerdere versies van Internet Explorer draaien en Gereedschap → Weergave testen 'n aantal links die daar ook bij kunnen helpen. De compatibiliteitsweergave is niet geschikt om te testen, omdat deze enigszins verschilt van de weergave in échte browsers.
- Voor alle voorbeelden geldt: breng veranderingen stapsgewijs aan. Als je bijvoorbeeld foto's wilt laten weergeven, begin dan met het alleen veranderen van de namen van de foto's, zodat je eigen foto's worden weergegeven. Maakt niet uit als de maten niet kloppen en de teksten fout zijn. Als dat werkt, ga dan bijvoorbeeld de maten aanpassen. Dan de teksten. En controleer steeds, of alles nog goed werkt.
-
Als het om een lay-out of iets dergelijks gaat: zorg eerst dat header, kolommen, footer, menu, en dergelijke staan en bewegen, zoals je wilt, en ga dan pas details binnen die blokken invullen. In eerste instantie gebruik je dus bijvoorbeeld 'n leeg blok op de plaats, waar uiteindelijk het menu komt te staan.
Als je begint met allerlei details, is er 'n heel grote kans dat die de werking van de blokken gaan verstoren. Bouw eerst het huis, en ga dan pas de kamers inrichten. Zorg eerst dat de blokken werken, zoals je wilt. Dan zul je het daarna gelijk merken, als 'n toegevoegd detail als tekst of 'n afbeelding iets gaat storen. Daarvoor moet je natuurlijk wel regelmatig controleren in verschillende browsers, of alles nog wel goed werkt.
Je kunt de blokken tijdens het aanpassen opvullen met bijvoorbeeld <br>1<br>2<br>3 enz., tot ze de juiste hoogte hebben. Het is handig om aan het einde even iets toe te voegen als 'laatste', zodat je zeker weet dat er niet ongemerkt drie regels onderaan naar 't virtuele walhalla zijn verhuisd.
Om de breedte te vullen, kun je het best 'n kort woord als 'huis' duizend keer of zo herhalen. Ook hier is het handig, om aan 't einde (en hier ook aan 't begin) 'n herkenningsteken te maken, zodat je zeker weet dat je de hele tekst ziet.
- Zolang je in grotere dingen zoals 'n lay-out aan 't wijzigen bent, zou ik je aanraden de verschillende delen een achtergrondkleur te geven. Je ziet dan goed, waar 'n deel precies staat. Een achtergrondkleur heeft – anders dan bijvoorbeeld een border – verder geen invloed op de lay-out, dus die is hier heel geschikt voor.
- Als je instellingen verandert in de stijl, verander er dan maar één, hooguit twee tegelijk. Als je er zeventien tegelijk verandert, moet je niet verbaasd zijn, als je niet weet, wat er is gebeurd. En als je 't niet meer terug kunt draaien.
-
Marges, padding en border worden bij de hoogte en breedte van de inhoud opgeteld. Hier worden vaak fouten mee gemaakt. Als je bijvoorbeeld in een lay-out 'n border toevoegt aan een van de 'hoofdvakken' (header, header, footer, kolommen), dan wordt deze er bij opgeteld. Bij 'n border van 2 px rondom de linkerkolom wordt deze dus plotseling 4 px breder (2 aan beide kanten), en 4 px hoger. Zoiets kan je hele lay-out verstoren, omdat iets net te breed of te hoog wordt. Je moet dan elders iets 4 px kleiner maken. Dat zal vaak zo zijn: als je één maat verandert, zul je vaak ook 'n andere moeten aanpassen.
css geeft de mogelijkheid om marge, padding en border bínnen de breedte en hoogte van de inhoud te zetten met behulp van
box-sizing
, als je dat handiger vindt. -
In plaats van px kun je ook andere maten gebruiken, met name em. Voordeel van em is dat een lettergrootte, regelhoogte, en dergelijke in em ook in Internet Explorer kan worden veranderd (andere browsers hebben meer mogelijkheden op dit gebied). Nadeel is dat het de lay-out sneller kan verstoren dan bijvoorbeeld px. Dit moet je gewoon van geval tot geval bekijken. Voor weergave in mobiele apparaten zijn relatieve eenheden als em vrijwel altijd beter dan vaste eenheden als px.
Zoomen kan trouwens altijd, ongeacht welke eenheid je gebruikt.
-
Valideren, valideren, valideren en dan voor 't slapen gaan nog 'ns valideren.
Valiwie???
Valideren is het controleren van je html en css op 'n hele serie fouten. Computers zijn daar vaak veel beter in dan mensen. Als je 300 keer <h2> hebt gebruikt en 299 keer </h2> vindt 'n computer die ene missende </h2> zonder enig probleem. Jij ook wel, maar daarna ben je misschien wel aan vakantie toe.
Je kunt je css en html zowel valideren, als 't online staat, als wanneer 't nog in je computer staat.
html kun je valideren op: validator.w3.org/nu.
css kun je valideren op: jigsaw.w3.org/css-validator.
Valideren kan helpen om gekmakende fouten te vinden. Valide code garandeert ook dat de weergave in verschillende browsers (vrijwel) hetzelfde is. En valide code is over twintig jaar ook nog te bekijken.
Valideren moet trouwens ook niet worden overdreven. Het is een hulpmiddel om echte fouten te vinden, meer niet. Het gaat erom dat je site goed werkt, niet dat je het braafste kind uit de klas bent. Als de code niet valideert, maar daar is een goede reden voor, is daar niets op tegen.
Op deze site is alle css en html gevalideerd. Als de code niet helemaal valide is (wat regelmatig voorkomt), staat daar onder Bekende problemen (en oplossingen) de reden van.
Toegankelijkheid en zoekmachines
Het eerste deel van deze tekst is voor alle voorbeelden hetzelfde. Eventueel specifiek voor dit voorbeeld geldende dingen staan verderop onder het kopje Specifiek voor dit voorbeeld.
Toegankelijkheid (accessibility in het Engels) is belangrijk voor bijvoorbeeld blinden die een 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 dat de site indexeert voor de zoekmachine) is te vergelijken met een blinde. Als je je site goed toegankelijk maakt voor gehandicapten, is dat gelijk goed voor een hogere plaats in een zoekmachine. Dus als je 't niet uit sociale motieven wilt doen, kun je 't uit egoïstische motieven doen.
(Op die plaats in de zoekmachine heb je maar beperkt invloed. De toegankelijkheid van je site is maar één van de factoren, maar zeker niet onbelangrijk.)
Als je bij het maken van je site al rekening houdt met toegankelijkheid, is dat nauwelijks extra werk. 't Is ongeveer te vergelijken met inbraakbescherming: doe dat bij 'n nieuw huis en 't is nauwelijks extra werk, doe 't bij 'n bestaand huis en 't is al snel 'n enorme klus.
Enkele tips die helpen bij toegankelijkheid:
-
Gebruik altijd een alt-beschrijving bij een afbeelding. De alt-tekst wordt gebruikt, als afbeeldingen niet kunnen worden getoond of gezien (dat geldt dus ook voor zoekmachines). Als je iets wilt laten zien, als je over de afbeelding hovert, gebruik daar dan het title-attribuut voor, niet de alt-beschrijving.
Als een afbeelding alleen maar voor de sier wordt gebruikt, zet je daarbij
alt=""
, om aan te geven dat de afbeelding niet belangrijk is voor het begrijpen van de tekst of zo. - Als uit de tekst bij een link niet duidelijk blijkt, waar de link naartoe leidt, gebruik dan een title bij de link. Een tekst als 'pagina met externe links' is waarschijnlijk duidelijk genoeg, een tekst als alleen 'links' mogelijk niet. Een duidelijke zwart-witregel is niet te geven, omdat dit ook van tekst en dergelijke in de omgeving van de link afhangt.
-
Accesskeys (sneltoetsen) kun je beter niet gebruiken, deze geven te veel problemen omdat ze vaak dubbelop zijn met sneltoetsen voor de browser of andere al gebruikte sneltoetsen. Bovendien is voor de gebruiker meestal niet duidelijk, welke toetsen het zijn.
Op zichzelf zijn accesskeys een heel goed idee. Maar helaas zijn ze ook in html5 volstrekt onvoldoende gedefinieerd. Er is nog steeds geen standaard voor de meest gebruikelijke accesskeys, zoals Zoek of Home.
Er is nog steeds niet vastgelegd, hoe accesskeys zichtbaar gemaakt kunnen worden. Voor de makers van browsers zou dit 'n relatief kleine moeite zijn, voor de makers van 'n site is het bergen extra werk.
Voor mij redenen om accesskeys (vrijwel) niet te gebruiken. Ik kan me wel voorstellen dat ze op sites die gericht zijn op 'n specifieke groep gebruikers nog enig nut kunnen hebben, maar voor algemene sites zou ik zeggen: niet gebruiken.
-
Met behulp van de Tab-toets (of op 'n soortgelijke manier) kun je in de meeste browsers door links, invoervelden, en dergelijke lopen. Elke tab brengt je één link, invoerveld, en dergelijke verder, Shift+Tab één plaats terug. Met behulp van tabindex kun je de volgorde aangeven waarin de Tab-toets werkt. Zonder tabindex wordt de volgorde van de html aangehouden bij gebruik van de Tab-toets, maar soms is een andere volgorde logischer.
In principe is het beter als tabindex niet nodig is, maar gewoon de volgorde van de html wordt aangehouden. Bij verkeerd gebruik kan tabindex heel verwarrend zijn. Het is niet bedoeld om van de pagina een hindernisbaan voor kangoeroes te maken, waarop van beneden via links over rechts naar boven wordt gesprongen.
-
In het verleden werd vaak aangeraden de volgorde van de code aan te passen. Een menu bijvoorbeeld kon in de html onderaan worden gezet, terwijl het op het scherm met behulp van css bovenaan werd gezet. Inmiddels zijn schermlezers en dergelijke zo sterk verbeterd, dat dit niet meer wordt aangeraden. De volgorde in de html kan tegenwoordig beter hetzelfde zijn als die op het scherm, omdat het anders juist verwarrend kan werken.
Een andere mogelijkheid is een zogenaamde skip-link: een link die je buiten het scherm parkeert met behulp van css, zodat hij normaal genomen niet te zien is. Zo'n link is wel zichtbaar in speciale programma's zoals tekstbrowsers en schermlezers, want die kijken gewoon naar wat er in de broncode staat.
Zo'n link staat boven menu, header, en dergelijke en linkt naar de eigenlijke inhoud van de pagina, zodat mensen met één toetsaanslag naar de eigenlijke inhoud van de pagina kunnen gaan.
Een skip-link is ook nuttig voor gebruikers van de Tab-toets. Zodra de normaal genomen onzichtbare link door het indrukken van de Tab-toets focus krijgt, kun je hem op het scherm plaatsen, waardoor hij zichtbaar wordt. Bij een volgende tab wordt hij dan weer buiten het scherm geplaatst en is dus niet meer zichtbaar, zodat de lay-out niet wordt verstoord.
-
Van oorsprong is html een taal om wetenschappelijke documenten weer te geven, pas later is hij gebruikt voor lay-out. Maar daar is hij dus eigenlijk nooit voor bedoeld geweest. Het gebruiken van html voor lay-out leidt tot enorme problemen voor gehandicapten en tot een lage plaats in zoekmachines.
De html hoort alleen inhoud te bevatten, lay-out doe je met behulp van css. Die css moet in een extern stijlbestand staan of, als hij alleen voor één bepaalde pagina van toepassing is, in de head van die pagina. Zoekmachines zijn ook niet dol op een oerwoud van inline-stijlen (dat zijn stijlen in de tag zelf:
<div style="...">
.) -
Breng een logische structuur aan in je document. Gebruik een <h1> voor de belangrijkste kop, een <h2> voor een subkop, enz. Schermlezers en dergelijke kunnen van kop naar kop springen. En een zoekmachine gaat ervan uit dat <h1> belangrijke tekst bevat.
Dit geldt voor al dit soort structuurbepalende tags.
Als een <h1> te grote letters geeft, maak daar dan met behulp van je css 'n kleinere letter van, maar blijf die <h1> gewoon gebruiken. Op dezelfde manier kun je al dit soort dingen oplossen.
<table>
is fantastisch, maar alleen als die wordt gebruikt om een echte tabel weer te geven, niet als hij voor opmaak wordt misbruikt. In het verleden is dat op grote schaal gebeurd bij gebrek aan andere mogelijkheden. Een tabel is, als je niet heel erg goed oplet, volstrekt ontoegankelijk voor gehandicapten en zoekmachines. Het lezen van een tabel is ongeveer te vergelijken met het lezen van een krant van links naar rechts: niet per kolom, maar per regel. Dat gaat dus alleen maar goed bij een echte tabel zoals een spreadsheet. In alle andere gevallen garandeert 'n tabel 'n lagere plaats in een zoekmachine.-
Frames zijn een volstrekt verouderde techniek, die heel veel nadelen met zich meebrengt. <iframe>'s hebben voor een deel dezelfde nadelen. Eén van die nadelen is dat de verschillende frames voor zoekmachines, schermlezers, en dergelijke als los zand aan elkaar hangen, omdat ze los van elkaar worden weergegeven. Ze staan wel naast elkaar op het scherm, maar er zit geen verband tussen.
Als je 'n stuk code vaker wilt gebruiken, zoals 'n menu dat op elke pagina hetzelfde is, voeg dat dan in met PHP of SSI. Dan wordt de pagina niet in de browser, maar al op de server samengesteld. Hierdoor zien zoekmachines, schermlezers, en dergelijke één pagina, net zoals wanneer je maar één pagina met html zou hebben geschreven.
- Geef de taal van het document aan, en bij woorden en dergelijke die afwijken van die taal de afwijkende taal met behulp van
lang=".."
. Ik doe dat op mijn eigen site maar af en toe, omdat de tekst (en vooral de code) een mengsel is van Engels, Nederlands en eigengemaakte namen. Dit soort teksten is gewoon niet goed in te delen in een taal. Maar bij enigszins 'normale' teksten hoor je een taalwisseling aan te geven. - Gebruik de tag <abbr> bij afkortingen. Doe dat de eerste keer op een pagina samen met de title-eigenschap:
<abbr title="ten opzichte van">t.o.v.</abbr>
. Daarna kun je op dezelfde pagina volstaan met<abbr>t.o.v.</abbr>
. Doe je dit niet, dan is er 'n grote kans dat 'n schermlezer 't.o.v.' uit gaat spreken als 'tof', en 'n zoekmachine kan er ook geen chocola van maken. -
De spider van 'n zoekmachine, schermlezers, en dergelijke kunnen geen plaatjes 'lezen'. Het is soms verbazingwekkend om te zien hoe veel, of eigenlijk: hoe weinig tekst er overblijft op een pagina, als de plaatjes worden weggehaald.
Op Linux kun je met Lynx kijken, hoe je pagina eruitziet zonder plaatjes en dergelijke, als echt alleen de tekst overblijft. Een installatie-programma voor Lynx op Windows is te vinden op invisible-island.net/lynx.
Ook kun je in Windows het gratis programma WebbIE installeren. WebbIE laat de pagina zien, zoals een tekstbrowser en dergelijke hem ziet. WebbIE is te downloaden vanaf www.webbie.org.uk.
Ten slotte kun je je pagina nog online op toegankelijkheid laten controleren op 'n behoorlijk aantal sites, zoals:
lowvision.support: laat zien hoe een kleurenblinde de site ziet. Engelstalig.
wave.webaim.org: deze laat grafisch zien, hoe de toegankelijkheid is. Engelstalig. Deze tester is ook als extensie in Firefox en Google Chrome te installeren.
Op de pagina met links kun je onder Toegankelijkheid links naar meer tests en dergelijke vinden.
Specifiek voor dit voorbeeld
Het gebruik van <video> heeft geen invloed op toegankelijkheid. Ondertitels, geluid, en dergelijke kunnen wel of niet worden toegevoegd, los van de techniek die wordt gebruikt om de video weer te geven.
Zonder JavaScript en/of css wordt de video in het algemeen gewoon afgespeeld. Alleen Safari op iOS en OS X speelt de video niet af, als JavaScript uitstaat. Maar dat zal bekend zijn bij de mensen die JavaScript uit hebben staan.
Getest in
Laatst gecontroleerd op 28 april 2015.
Onder dit kopje staat alleen maar, hoe en waarin is getest. Eventuele problemen, ook die met betrekking tot zoomen en lettergroottes, staan hieronder bij Bekende problemen (en oplossingen). Het is belangrijk dat te lezen, want uit een test kan ook prima blijken dat iets totaal niet werkt!
Eventuele opmerkingen over de toegankelijkheid specifiek voor dit voorbeeld staan onderaan Toegankelijkheid en zoekmachines onder het kopje Specifiek voor dit voorbeeld.
Dit voorbeeld is getest op de volgende systemen:
- Windows 7:
Firefox, UC Browser, Google Chrome, Internet Explorer 9 en 10 in de resoluties 800x600, 1024x768 en 1280x1024. - Windows 8:
Bureaublad-versie: Firefox, UC Browser, Google Chrome en Internet Explorer 11 in de resoluties 800x600, 1024x768 en 1366x768.
Startscherm-versie: Internet Explorer 11 (heette ooit Metro-versie).
Windows-8-modus: Google Chrome (heette ooit Metro-versie). - OS X:
Firefox, Safari en Google Chrome in een resolutie van 1680x1050 en kleiner.
Kleiner is wat vaag: het browservenster is traploos verkleind van 1680x1050 tot ongeveer 1000x600. Waarbij alle tussenliggende groottes dus ook zijn getest. - Linux:
Firefox en Google Chrome in de resoluties 800x600, 1024x768 en 1280x1024. - Windows Phone 8.1 in een resolutie van 800x480 (Nokia Lumia 520):
Internet Explorer (portret en landschap).
UC Browser (portret en landschap). - iPad met iOS 8.3 in een resolutie van 1024x768 (MC979NF):
Safari (portret en landschap).
Opera Mini (portret en landschap). Meer over deze browser hieronder bij Android 4.4.2.
Chrome for IOS (portret en landschap).
UC Browser (portret en landschap). - Android 4.0.3 in een resolutie van 1024x768 (CRESTA CTP888):
Android browser (portret en landschap). - Android 4.1 in een resolutie van 800x480 (Samsung Galaxy Core i8620):
Chrome, Android browser, UC Browser en Firefox (alle portret en landschap).
Opera Mini (éénkolomsstand aan/uit, portret en landschap). Meer over deze browser hieronder bij Android 4.4.2. - Android 4.4.2 in een resolutie van 1280x800 (Samsung Tab 3):
Android browser, UC Browser, Firefox en Chrome (alle portret en landschap).(
Opera Mini (éénkolomsstand aan/uit, portret en landschap). Deze browser is een apart geval. De opgevraagde site wordt gedownload via de servers van Opera, waarbij het in zo'n klein venster normaal is dat (een groot deel van) de lay-out wordt verwijderd. Daarom wordt bij deze browser voornamelijk gekeken, of er geen content (tekst en dergelijke) verloren gaat.
Er is steeds getest met de laatste versie van de browsers op de aan het begin van dit hoofdstukje genoemde controledatum, omdat ik geen zin heb om rekening te houden met mensen die met zwaar verouderde browsers surfen. Dat is trouwens vragen om ellende, want updates van browsers hebben heel vaak met beveiligingsproblemen te maken.
Ook op Windows XP kunnen mensen surfen met Firefox, Opera of Google Chrome, dus ook daar zijn mensen niet afhankelijk van Internet Explorer 8. Ik maak één uitzondering: Android browser op Android 4.0.3. Omdat Android vaak niet geüpdatet kan worden, test ik ook nog in Android browser 4.0.3.
In resoluties groter dan 800x600 is ook in- en uitzoomen en – voor zover de browser dat kan – een kleinere en grotere letter getest. Er is ingezoomd en vergroot tot zover de browser kan, maar niet verder dan tot 200%.
Er is getest met behulp van muis en toetsenbord, behalve op de iPad, Android en Windows Phone, waar een touchscreen is gebruikt. Op Windows 8 is getest met een touchscreen, met een combinatie van toetsenbord en touchpad, en met een combinatie van toetsenbord en muis.
Op de desktop is ook getest, als JavaScript uitstaat. Eventuele problemen staan onderaan Toegankelijkheid en zoekmachines onder het kopje Specifiek voor dit voorbeeld. (Op iOS, Android en Windows Phone is niet getest zonder JavaScript, omdat je JavaScript in een toenemend aantal mobiele browsers niet uit kunt zetten. Bovendien is een mobiel apparaat zonder JavaScript niet veel meer dan een duur en groot uitgevallen horloge.)
Naast deze 'gewone' browsers is ook getest in Lynx, WebbIE, NVDA, TalkBack op Android en VoiceOver op iOS en OS X. Lynx is een browser die alleen tekst laat zien en geen css gebruikt. WebbIE is een browser die gericht is op mensen met een handicap. NVDA is een schermlezer, zoals die door blinden wordt gebruikt. (NVDA is getest in combinatie met Firefox op Windows 7.) TalkBack is een in Android ingebouwde schermlezer (TalkBack is getest in combinatie met Chrome). VoiceOver is een in iOS en OS X ingebouwde schermlezer (VoiceOver is getest in combinatie met Safari).
Als het voorbeeld in deze programma's toegankelijk is, zou het in principe toegankelijk moeten zijn in alle aangepaste browsers en dergelijke. En dus ook voor zoekmachines, want een zoekmachine is redelijk vergelijkbaar met een blinde. Eventuele opmerkingen over de toegankelijkheid specifiek voor dit voorbeeld staan onderaan Toegankelijkheid en zoekmachines onder het kopje Specifiek voor dit voorbeeld.
Alleen op de hierboven genoemde systemen en browsers is getest. Er is dus niet getest op bijvoorbeeld 'n Blackberry. De kans is (heel erg) groot dat dit voorbeeld niet (volledig) werkt op niet-geteste systemen en apparaten. Om het wel (volledig) werkend te krijgen, zul je vaak (kleine) wijzigingen en/of (kleine) aanvullingen moeten aanbrengen, bijvoorbeeld met JavaScript.
Er is ook geen enkele garantie dat iets werkt in een andere tablet of smartphone dan hierboven genoemd, omdat fabrikanten in principe de software kunnen veranderen. Dit is anders dan op de desktop, waar browsers altijd (vrijwel) hetzelfde werken, zelfs op verschillende besturingssystemen. Iets wat in Android browser werkt, zal in de regel overal werken in die browser, maar een garantie is er niet. De enige garantie is het daadwerkelijk testen op een fysiek apparaat. En aangezien er duizenden mobiele apparaten zijn, is daar eigenlijk geen beginnen aan.
De html is gevalideerd met de validator van w3c, de css ook. Als om een of andere reden niet volledig gevalideerd kon worden, wordt dat bij Bekende problemen (en oplossingen) vermeld.
Nieuwe browsers test ik pas, als ze uit het bèta-stadium zijn, omdat er anders 'n redelijke kans is dat ik 'n bug zit te omzeilen, die voor de uiteindelijke versie nog gerepareerd wordt. Dit voorbeeld is alleen getest in de hierboven met name genoemde browsers. Vragen over niet-geteste browsers kan ik niet beantwoorden, en het melden van fouten in niet-geteste browsers heeft ook geen enkel nut. (Melden van fouten, problemen, enz. in wel geteste browsers: graag!)
Bekende problemen (en oplossingen)
Waarop en hoe is getest, kun je gelijk hierboven vinden bij Getest in.
Als je hieronder geen oplossing vindt voor een probleem dat met dit voorbeeld te maken heeft, kun je op het forum proberen een oplossing te vinden voor je probleem. Om forumspam te voorkomen, moet je je helaas wel registreren, voordat je op het forum een probleem kunt aankaarten.
De video speelt niet af
Een browser moet het zogenaamde MIME-type van een bestand weten, om het als een video te herkennen. De ene browser is daar wat kritischer in dan de andere.
Het MIME-type moet op de server worden geconfigureerd. Als dit niet goed is gedaan, kan het zijn dat de video aan de browser wordt gemeld als een gewoon tekstbestand. Firefox bijvoorbeeld speelt in dit geval WebM niet af, en Internet Explorer 9 doet niets met MP4.
Als je alles hebt geïnstalleerd en zo en het werkt niet, kun je controleren of de MIME-types wel goed zijn ingesteld. Hieronder beschrijf ik, hoe je dat in Firefox en Internet Explorer doet, omdat ik toevallig die twee heb gebruikt. Maar ook Opera, Safari en Google Chrome hebben dit soort hulpmiddelen.
WebM kon je in Firefox controleren met behulp van de extensie Firebug. Helaas bestaat deze extensie niet meer, dus je zult nu zelf even moeten zoeken hoe je het laden van WebM kunt controleren.
MP4 kun je in Internet Explorer controleren. Open de pagina met de video. Druk op F12 om het ontwikkelgereedschap te openen. Klik in de tweede balk van boven op 'Netwerk'. Klik in de nieuwe balk op 'Vastleggen starten'. Herlaadt de pagina. In de linkerkolom verschijnen de namen van de bestanden die zijn gedownload.
Start de video. Nu verschijnt ook de naam van de video. In de vierde kolom, onder 'Type', moet staan 'video/mp4'. Als er iets anders staat, zoals 'text/plain', klopt het MIME-type niet.
Op Apache, de meest gebruikte server voor websites, kan dit worden ingesteld in een zogenaamd .htaccess-bestand. Ik heb er geen flauw idee van, hoe het op een Windows server moet. Mijn hartelijke deelneming en veel sterkte gewenst dus als je met 'n Windows-server zit opgescheept. Je hoster zou je moeten kunnen helpen.
Niet alle hosters laten je zelf een .htaccess-bestand maken. Als dat bij jouw hoster niet kan, moet de hoster deze verandering even zelf aanbrengen. Elke fatsoenlijke hoster doet dit (en gaat zich daarna 'n halfuurtje zitten schamen onder het bureau omdat ze dit kennelijk vergeten waren).
Als je zelf een .htaccess kunt maken of bewerken, des te beter, want je kunt nog veel meer met 'n .htaccess.
Aan een bestaande .htaccess kunnen gewoon onderstaande regels worden toegevoegd. Als je nog geen .htaccess hebt, maak je 'n nieuwe aan. Een .htaccess-bestand is een gewoon tekstbestand. Je moet het dus maken in een zelfde soort simpele editor, als waarin je html schrijft. Programma's als Word of LibreOffice stoppen er allemaal extra meuk in voor de opmaak, en daar wordt de server hevig ongelukkig van.
Het bestand krijgt de naam '.htaccess'. Verder niets. De punt aan het begin zorgt ervoor dat het bestand op Linux onzichtbaar is. Als de .htaccess na het uploaden onzichtbaar is op de server, moet je waarschijnlijk even in je FTP-programma (het programma waarmee je de site uploadt) aangeven dat onzichtbare bestanden ook getoond moeten worden.
Het .htaccess-bestand wordt in de root van de site gezet. Dat is op dezelfde plaats, als waar je index.html of index.php staat. In het .htaccess-bestand zet je de volgende regels:
AddType video/webm .webm
AddType video/mp4 .mp4
Dat is alles. Als het goed is, zou je nu de juiste MIME-types moeten zien in Firefox en Internet Explorer, zodat je in ieder geval zeker weet dat een eventueel probleem niet hieraan kan liggen.
Een andere mogelijkheid is dat de browser de gebruikte codec niet kent. WebM, MP4, enz. zijn een zogenaamde container, net zoals een zip-bestand dat is. Binnen een zip kunnen allerlei verschillende formaten zitten, zoals gewone tekst, html, afbeeldingen, enz.
WebM, MP4, enz. zijn enigszins te vergelijken met een zip. Binnen WebM, MP4, enz. kunnen verschillende codecs zijn gebruikt, en niet elke browser kent elke codec. Bij de in dit voorbeeld gebruikte video's zijn geen codecs opgegeven, omdat elke browser ze probleemloos kan afspelen.
Iets meer info over codecs kun je vinden op HTML - Living Standard onder The source element, en op Video type parameters.
Omdat ik verder zelf ook geen verstand heb van al die verschillende codecs en zo, kan ik er verder niets zinnigs over melden. Als je mocht denken dat het probleem hier mee te maken zou kunnen hebben, kun je op de pagina met links onder Forums hopelijk een plaats vinden, waar je meer hulp kunt krijgen.
Opera Mini
Opera Mini vertoont geen video's. Sterker nog: er wordt zelfs geen videospeler getoond. Wel kun je in principe de video's gewoon downloaden en in 'n ander programma afspelen. (Met behulp van uitbreidingen schijn je wel video's te kunnen bekijken in deze browser, maar daar heb ik verder niet naar gekeken, omdat dat niet relevant is voor dit voorbeeld.)
Aanvulling 28 april 2015: in Android 4.1 geeft Opera nu automatisch de mogelijkheid de video in de videospeler van Android af te spelen, in Android 4.4.2 speelt Opera Mini de video zonder meer af.
Google Chrome op Android 4.0.3
Elke poging tot het afspelen van een video leidde tot het crashen van Google Chrome. Ik neem aan dat de versie van Google Chrome voor Android of aan de tablet ligt, want ook YouTube leverde dit resultaat op. Alle andere versies van deze browser werkten wel goed.
Firefox op OS X en Windows
Als JavaScript uitstaat, zijn de bedieningsknoppen van de video niet te zien. Het contextuele menu (na rechtsklikken) werkt wel, dus de video is wel af te spelen. Dit is een bug in Firefox die hopelijk snel wordt gerepareerd.
Aanvulling 27 april 2015: inmiddels kan in Firefox JavaScript niet meer worden uitgezet (althans: niet zonder extra hulpmiddelen). Waarmee dit is opgelost.
iPad en iPhone met iOS3
Bij gebruik van het poster-attribuut in <video>, zoals in dit voorbeeld is gebeurd, kan geen video worden afgespeeld. Omdat iOS3 nog nauwelijks wordt gebruikt, lijkt deze bug me niet meer echt belangrijk.
Wijzigingen
Alleen grotere wijzigingen worden hier vermeld, geen dingen als een link die is geüpdatet.
:
Nieuw opgenomen.
(Er stond al eerder een voorbeeld over <video>, maar dat was tijdelijk vervangen door links naar een aantal andere sites, omdat de veranderingen bij <video> niet meer waren bij te benen.)
10 oktober 2012
In iOS6 is kennelijk een bug of een afwijking van de standaard geslopen. Informatie heb ik daar helaas verder nergens over kunnen vinden, en Apple zelf geeft gewoon stomweg nooit ergens informatie over, dus dat schiet ook niet op.
<video> kreeg in de css een breedte van 100% en was daardoor even breed als haar ouder div#wrapper
. Om een of andere reden werkt width: 100%;
niet meer in iOS6. De video wordt in postzegelformaat weergegeven, werkelijk heel erg klein.
De video kan wel venstervullend worden weergegeven, maar dan heb je eigenlijk weer een betere kwaliteit (en dus een groter bestand) nodig. Je kunt ook met de hand de video vergroten, zodat de juiste maat wordt weergegeven, maar dat is natuurlijk op z'n zachtst gezegd ook niet ideaal.
Als de breedte en hoogte in de html bij <video> worden aangebracht, werkt het weer goed. Breedte én hoogte zijn nodig, terwijl volgens de specificatie alleen de breedte óf hoogte nodig is. De andere maat wordt dan automatisch gebruikt. Ook zonder breedte en hoogte zou de video op z'n eigenlijke grootte gespeeld horen te worden, maar dat gebeurt dus ook niet.
Grootte en breedte aanbrengen in het <video>-element is geen goed idee, want dan wordt de video altijd op die grootte weergegeven, ongeacht de grootte van het venster van de browser en ongeacht welk bestand er wordt gedownload.
Hopelijk gaat het hier om een bug en niet om een poging sites te dwingen iets alleen voor iOS te maken. (Apple gedraagt zich steeds meer als de nieuwe Microsoft, dus enige achterdocht is bepaald niet misplaatst.)
Mogelijk is de oude code ooit weer bruikbaar, maar daar heb je nu niet zoveel aan. In de code zijn de volgende wijzigingen aangebracht om dit probleem te omzeilen:
Bij de css voor een minimumbreedte van 640 px is nu de breedte en de hoogte van de video opgegeven: 640 x 360 px. Als een maat in px wordt opgegeven in de css, pikt iOS6 dit wel op, in tegenstelling tot een maat in procenten.
Omdat dit alleen in bredere browservensters werkt, hebben smallere vensters er geen last van.
En omdat ik toch bezig was, heb ik gelijk iets anders iets logischer gemaakt. #groot
met daarin de links voor bredere vensters wordt nu standaard verborgen. Pas in een breder venster wordt dit zichtbaar gemaakt. Hierdoor kon de css voor smallere vensters vervallen.
27 april 2015:
- Het gelijk hierboven staande probleem op iOS speelt niet meer en was dus kennelijk geen machtsgreep, maar een bug. De in de css voor een minimumbreedte van 640 px bij
video
opgegeven breedte en hoogte zijn weer verwijderd. -
Om volstrekt onbegrijpelijke redenen is in de specificatie het
media
-attribuut verwijderd uit het de <source>'s in het <video>-element. Terwijl dit al in alle browsers was geïmplementeerd en uitstekend werkte. Het is nu niet meer mogelijk om, zonder JavaScript of iets dergelijks, naar kleinere schermen een kleinere video te sturen.Alle code en uitleg die hiermee te maken hadden, zijn verwijderd. De kleine video's zijn ook verwijderd.
Wat de reden was van deze beslissing van w3c is mij (en vele anderen) een raadsel. Mede omdat ongeveer gelijktijdig voor afbeeldingen een oplossing is bedacht, die ongeveer hetzelfde werkt als wat bij <video> is verwijderd.
- Voor brede en smalle browservensters is de downloadtekst nu hetzelfde, omdat er nog maar één maat video's is.
- Alle aanpassingen voor Internet Explorer 7 en 8 zijn verwijderd: deze browsers worden niet meer ondersteund. Hierdoor is ook het gebruik van JW Player niet meer nodig. In het <video>-element wordt <object> niet meer gebruikt.
- Safari voor Windows is overal verwijderd, omdat Apple deze browser niet meer maakt.
- Grote delen in de uitleg zijn herschreven en de indeling is iets gewijzigd.
- In de download staat de css niet meer bovenin het html-bestand, maar in een eigen stijlbestand.
- Download-links van
download
-attribuut voorzien. - <video>-element van tekst voorzien voor browsers die <video> niet ondersteunen.
Inhoud van de download en licenties
afbeelding-080-dl.html: de pagina met het voorbeeld
afbeelding-080.pdf: deze uitleg (aangepast aan de inhoud van de download)
afbeelding-080.txt: een kopie van de tekst onder dit kopje (Inhoud van de download en licenties)
080-files-dl:
afbeelding-103-dl.css: bijbehorend stijlbestand
bbb-splash.jpg: afbeelding om weer te geven voor de video speelt
big-buck-bunny-640.mp4: video in MP4-formaat
big-buck-bunny-640.webm: video in WebM-formaat
De gebruikte video is het begin van Big Buck Bunny en is afkomstig van https://peach.blender.org/.
HTML
De code is geschreven in een afwijkende
lettersoort. De code die te maken heeft met de basis van dit voorbeeld (essentiële code), is in de hele uitleg blauw
gekleurd. Alle niet-essentiële code is bruin
. (In de inhoudsopgave staat alles in een gewone letter vanwege de leesbaarheid.)
In de html hieronder wordt alleen de html besproken, waarover iets meer is te vertellen. Een <h1> bijvoorbeeld wordt in de regel niet genoemd, omdat daarover weinig interessants valt te melden. (Als bijvoorbeeld het uiterlijk van de <h1> wordt aangepast met behulp van css, staat dat verderop bij de bespreking van de css.)
Zaken als een doctype
en charset
hebben soms wat voor veel mensen onbekende effecten, dus daarover wordt hieronder wel een en ander geschreven.
Deze uitleg hoort bij het voorbeeld dat in de download zit. Het voorbeeld uit de download verschilt iets van het voorbeeld hier op de site. In de download ontbreekt bijvoorbeeld de navigatie voor de site. Ook in de kopregels zit vaak wat verschil. Daarnaast kunnen er nog andere (meestal kleine) verschillen zijn.
Als je deze uitleg leest naast de broncode van het voorbeeld op de site, kan het dus bijvoorbeeld zijn dat 'n <h1> uit de css bij 'n <h2> uit de html hoort. Maar het gaat niet om hele grote, fundamentele afwijkingen.
Als je dit lastig vindt, kun je bovenaan de pagina de hele handel downloaden. In de download zit 'n voorbeeld dat wel naadloos aansluit op de uitleg in de download.
<!doctype html>
<html lang="nl">
Een document moet met een doctype beginnen om weergaveverschillen tussen browsers te voorkomen. Zonder doctype is de kans op verschillende (en soms volkomen verkeerde) weergave tussen verschillende browsers heel erg groot.
Geldige doctypes vind je op www.w3.org/QA/2002/04/valid-dtd-list.
Gebruik het volledige doctype, inclusief de eventuele url, anders werkt het niet goed.
Het hier gebruikte doctype is dat van html5.
<meta charset="utf-8">
Zorgt dat de browser letters met accenten en dergelijke goed kan weergeven.
utf-8 is de beste charset (tekenset), omdat deze alle talen van de wereld (en nog heel veel andere extra tekens) bestrijkt, maar toch niet meer ruimte inneemt voor de code, dan nodig is. Als je utf-8 gebruikt, hoef je veel minder entiteiten (ä
en dergelijke) te gebruiken, maar kun je bijvoorbeeld gewoon ä gebruiken.
Deze regel moet zo hoog mogelijk komen te staan, als eerste regel binnen de <head>, omdat hij anders door sommige browsers niet wordt gelezen.
In html5 hoeft deze regel niet langer te zijn, dan wat hier staat.
<meta name="viewport" content="width=device-width, initial-scale=1">
Mobiele apparaten variëren enorme in breedte. En dat is een probleem. Sites waren, in ieder geval tot voor kort, gemaakt voor desktopbrowsers. En die hebben, in vergelijking met bijvoorbeeld een smartphone, heel brede browservensters. Hoe moet je op 'n smartphone een pagina weergeven, die is gemaakt voor de breedte van een desktop? Je kunt natuurlijk wachten tot álle sites zijn omgebouwd voor smartphones, tablets, enz., maar dan moet je waarschijnlijk heel erg lang wachten.
Mobiele browsers gokken erop dat een pagina een bepaalde breedte heeft. Safari voor mobiel bijvoorbeeld gaat ervan uit dat een pagina 980 px breed is. De pagina wordt vervolgens zoveel versmald dat hij binnen het venster van het apparaat past. Op een iPhone wordt de pagina dus veel smaller dan op een iPad. Vervolgens kan de gebruiker inzoomen op het deel van de pagina dat hij of zij wil zien.
Dit betekent ook dat bij het openen van de pagina de tekst meestal heel erg klein wordt weergegeven. (Meestal, want niet alle browsers en apparaten doen het op dezelfde manier.) Niet erg fraai, maar bedenk maar 'ns 'n betere oplossing voor bestaande sites.
Nieuwe sites of pagina's kunnen echter wel rekening houden met de veel kleinere vensters van mobiele apparaten. Deze pagina bijvoorbeeld past zich aan de breedte van het venster aan, ook bij heel smalle vensters. Maar die stomme mobiele browser weet dat niet, dus die gaat ervan uit dat ook de al aangepaste pagina 980 px breed is, en verkleint die dan. Dat is ongeveer even behulpzaam als de gedienstige kelner die behulpzaam de stoel naar achteren trekt, net als jij wilt gaan zitten.
Om de door de browser aangeboden hulp vriendelijk maar beslist te weigeren, wordt deze tag gebruikt. Hiermee geef je aan dat de pagina is geoptimaliseerd voor mobiele apparaten.
Een iPad in portretstand bijvoorbeeld is 768 px breed. De kreet width=device-width
zegt tegen de mobiele browser dat de breedte van de weer te geven pagina gelijk is aan de breedte van het apparaat. Voor een iPad in portretstand dus 768 px.
En dat klopt, want de weer te geven video en de teksten passen zich automatisch aan de breedte van het apparaat aan. Er is op deze pagina niets, wat problemen kan opleveren in een smaller browservenster.
Simpeler gezegd: je zegt tegen het mobiele apparaat dat de pagina geen vaste breedte heeft, en dat het dus niet nodig is om de weergave aan te passen.
Er staat nog een tweede deel in de tag: initial-scale=1
. Sommige mobiele apparaten zoomen een pagina gelijk in of uit. Ook weer in een poging behulpzaam te zijn. Ook dat is hier niet nodig, want de pagina past zich aan het apparaat aan. Er is ook een instructie om zoomen helemaal onmogelijk te maken, maar die gebruik ik niet. De bezoeker kan zelf nog gewoon zoomen, wat belangrijk is voor mensen die wat slechter zien.
<link rel="stylesheet" href="080-files-dl/afbeelding-080-dl.css">
Dit is een koppeling naar een extern stijlbestand, waarin de css staat. In html5 is de toevoeging type="text/css"
niet meer nodig, omdat dit standaard al zo staat ingesteld. Je moet uiteraard de naam van en het pad naar het stijlbestand aanpassen aan de naam en plaats van je eigen stijlbestand.
Voordeel van een extern stijlbestand 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 in één enkel stijlbestand aan te brengen, in plaats van in elke pagina apart. Op een grotere site kan dit ontzettend veel werk schelen. Bovendien hoeft de browser zo'n extern stijlbestand maar één keer te downloaden, ongeacht hoeveel pagina's er gebruik van maken. Zou je de css in elke pagina opnieuw aanbrengen, dan worden de te downloaden bestanden veel groter.
In dit voorbeeld heeft een extern stijlbestand eigenlijk geen nut, omdat er maar één pagina is die dit stijlbestand gebruikt. In dit geval kun je de css beter in de <head> van de html-pagina zelf zetten. Voor de omvang maakt het hier niets uit, want de css wordt hoe dan ook altijd precies één keer gedownload, en nooit vaker. Voor het onderhoud maakt het ook geen verschil, want ook hier hoef je de css maar op één plaats te wijzigen. Maar het scheelt wel een extra aanroep naar de server, omdat geen apart stijlbestand hoeft te worden gedownload.
Dat opnemen in de <head> gaat heel simpel: je kopieert gewoon het hele stijlbestand en zet die bovenin de <head>, tussen <style> en </style>:
<style>
body {color: black;}
(...) rest van de css (...)
div {color: red;}
</style>
Maar zodra een stijlbestand op meerdere pagina's wordt gebruikt, wat meestal het geval zal zijn, is een extern stijlbestand beter.
(De reden dat er toch een extern stijlbestand is, terwijl ik hierboven omstandig beweer dat dat in dit voorbeeld eigenlijk geen nut heeft: overzichtelijkheid. Nu kun je html en css los van elkaar bekijken.)
Het <video>-element
<video controls preload="none" poster="080-files-dl/bbb-splash.jpg">
<source src="080-files-dl/big-buck-bunny-640.mp4" type="video/mp4">
<source src="080-files-dl/big-buck-bunny-640.webm" type="video/webm">
Je browser ondersteunt het afspelen van video's niet. Je kunt hieronder de video nog wel downloaden.
</video>
Het <video>-element is onderdeel van html5. In dit voorbeeld wordt maar een heel klein deel van de mogelijkheden gebruikt.
Ik beperk me hier tot html en css, maar <video> kan ook met JavaScript worden aangestuurd. Als je op internet zoekt naar iets als 'video element api', vind je tal van handleidingen.
Hieronder staat een korte omschrijving van de onderdelen, verderop staat de uitgebreide beschrijving van alle onderdelen.
<video>
en </video>
: begin- en eindtag. In de begintag staan enkele attributen die aangeven hoe het element zich moet gedragen. Er zijn veel meer attributen, die verderop worden besproken.
<source>
: binnen elke <source> staat een video. Zodra de browser een video vindt die kan worden afgespeeld, wordt niet verder gekeken naar volgende <source>'s. Bij dit vinden helpt het opgegeven MIME-formaat (type
) van de video.
Tekst onderaan: als een browser <video> niet ondersteunt, wordt deze tekst getoond.
<video controls preload="none" poster="080-files-dl/bbb-splash.jpg">
<video>
: gewoon de openingstag. Helemaal achteraan, na een aantal elementen dat binnen <video> zit, wordt het element afgesloten met </video>.
controls
: geeft aan dat knoppen moeten worden weergegeven, waarmee de videospeler is te bedienen. De maker van de browser heeft voor deze knoppen gezorgd, dus ze verschillen enigszins per browser. Als je controls
weglaat, worden de bedieningsknoppen niet getoond. In de meeste browsers kan nog steeds met rechtsklikken een contextueel worden geopend, waarmee de video toch kan worden afgespeeld. In sommige browsers kan de video nu echter helemaal niet worden afgespeeld, omdat die mogelijkheid in het contextueel menu ontbreekt.
Op mobiele browsers kun je niet rechtsklikken, dus daar kan de video zonder bedieningsknoppen gewoon helemaal niet worden afgespeeld.
Het weglaten van controls
heeft alleen maar zin, als je de video via JavaScript wilt laten afspelen, of via JavaScript eigen knoppen wilt laten weergeven.
Internet Explorer 9 laat de knoppen pas zien, als je over de video hovert.
preload="none"
: dit regelt of de video al wordt gedownload, voordat de video wordt afgespeeld, of dat pas wordt gedownload, als wordt afgespeeld. Dit is niet meer dan een hint voor de browser, de browser kan afwijken van wat hier wordt opgegeven. Ook al geef je op dat de video moet worden gedownload, de meeste mobiele browsers bijvoorbeeld zullen dit toch pas gaan doen, als de bezoeker kiest voor afspelen.
preload
wordt hier alleen gebruikt om een probleem bij Internet Explorer 9 op te lossen. Meer daarover gelijk hieronder bij poster
.
Mogelijke waarden:
none
: pas downloaden als wordt afgespeeld.
metadata
: alleen metagegevens zoals breedte, hoogte en afspeelduur ophalen.
auto
: video gelijk downloaden, al voordat wordt gekozen voor afspelen. Als je niets invult bij preload
, is dit de standaardwaarde.
poster="080-files-dl/bbb-splash.jpg"
: achter poster
kun je de url van een afbeelding opgeven, die wordt getoond voordat de video wordt afgespeeld.
Dit werkt prima in alle browsers, behalve in Internet Explorer 9. De specificatie is een beetje onduidelijk. Daar staat namelijk in dat de afbeelding getoond moet worden, als geen video beschikbaar is. Alle browsers leggen dat uit als: toon de poster, totdat de video wordt afgespeeld.
Internet Explorer 9 legt het zo uit: als er een video is, of die nu wordt afgespeeld of niet, toon dan de poster niet. Aangezien de video beschikbaar is, wordt de poster niet getoond. En zie je dus alleen een zwart schermpje met bedieningsknoppen in deze browser. Maar toegegeven, formeel gezien voldoet Internet Explorer 9 aan de specificatie. Latere versies van Internet Explorer gedragen zich hetzelfde als andere browsers.
Door ook preload="none"
toe te voegen, verschijnt de poster plotsklaps wel. Eigenaardig, want de video is nog steeds beschikbaar, zou je zeggen.
Als je poster
weglaat, wordt op de desktop het eerste frame uit de video getoond, maar de meeste mobiele browsers tonen dan alleen een zwart schermpje met knoppen. Ook Internet Explorer 9 toont nog steeds niets.
autoplay
: wordt niet gebruikt in dit voorbeeld. Zorgt ervoor dat de video automatisch begint af te spelen. Heel fijn als je toevallig in een gehorig huis woont naast een beroepsbokser met 'n kort lontje. Vooral als je vaak 's nachts surft en op de betreffende video luidkeels het Wilhelmus wordt gezongen door het voltallige Nederlandse elftal. Na de revolutie komt hier drie maanden zonnepanelen aanbrengen op een verlaten olieplatform op te staan.
Serieus: dit is een prima manier om bezoekers weg te jagen. Laat mensen zelf kiezen of ze wel of niet je video willen afspelen. Dit geldt nog sterker, als de video ook geluid heeft. In dat geval zou je op z'n minst ook muted
moeten opgeven (zie hieronder).
loop
: wordt niet gebruikt in dit voorbeeld. Als de video is uitgespeeld, wordt weer van voren af aan begonnen.
height
: wordt niet gebruikt in dit voorbeeld. De hoogte van de video in pixel. Zodra ook een hoogte in de css wordt opgegeven, overrulet deze de hier opgegeven hoogte.
width
: de breedte van de video in pixel. Zodra ook een breedte in de css wordt opgegeven, overrulet deze de hier opgegeven breedte.
In dit voorbeeld is geen breedte in de html opgegeven, maar wel een breedte van 100% in de css. Daardoor wordt <video> en dus de daarin zittende video even breed als div#wrapper
, de ouder van <video>.
muted
: wordt niet gebruikt in dit voorbeeld. Zet het geluid uit. De browser is niet verplicht hiernaar te luisteren.
(Normaal genomen zal wel worden geluisterd, als het geluid is uitgezet, maar niet altijd als het geluid aan staat. Mocht je partner als onderdeel van een knetterende ruzie een scheldpartij aan je hebben gestuurd, dan wordt daardoor voorkomen dat deze onbedoeld tijdens de directievergadering wordt afgespeeld.)
mediagroup
: wordt niet gebruikt in dit voorbeeld. Wordt gebruikt om twee of meer video's gelijktijdig af te laten spelen. Dit maakt het bijvoorbeeld mogelijk om een video te voorzien van een doventolk. De video's worden met dezelfde knoppen bediend. Achter mediagroup
wordt de naam van de groep ingevuld: mediagroup="video-1"
. Elke video komt in een apart <video>-element te staan.
Voor zover bekend ondersteunt alleen Firefox op de desktop dit op 27 april 2015, de datum van de laatste aanpassing van dit voorbeeld.
src
: wordt niet gebruikt in dit voorbeeld. Hierin komt de url van de af te spelen video. Dit wordt alleen gebruikt als er maar één video is opgegeven. Zodra er, zoals hier in dit voorbeeld, meerdere video's zijn waaruit de browser moet kiezen, komt elke video in een aparte <source> te staan binnen <video>.
Als het wel wordt gebruikt ziet dit er zo uit:
<video src="bron-van-video">
<source src="080-files-dl/big-buck-bunny-640.mp4" type="video/mp4">
Binnen <video> kunnen meerdere <source>'s staan. Elke <source> verwijst naar een bepaalde video. De browser bekijkt van boven naar beneden alle <source>'s, tot een video wordt gevonden die kan worden afgespeeld. Zodra dat het geval is, worden lagere <source>'s niet meer bekeken.
<source
: gewoon de opening van de tag. De tag wordt aan het eind van de regel afgesloten met een >.
src="(...)"
: de url van de af te spelen video. Hier is dat 080-files-dl/big-buck-bunny-640.mp4
.
type="(...)"
: om het MIME-type van de video op te geven. Hier is dat video/mp4: een video in een container van de soort MP4. Als er problemen met het MIME-type zijn, staat er mogelijk een oplossing bij Bekende problemen (en oplossingen).
Als geen MIME-type wordt opgegeven, moet de browser van elke video een klein stukje downloaden om te kijken, of de video kan worden afgespeeld, net zolang tot een video is gevonden die kan worden afgespeeld.
codecs="(...)"
: wordt niet gebruikt in dit voorbeeld. Hier kun je voor de meer exotische formaten ook nog de exacte codec opgeven die is gebruikt. Iets meer info hierover kun je vinden bij Bekende problemen (en oplossingen).
<source src="080-files-dl/big-buck-bunny-640.webm" type="video/webm">
Deze <source> werkt hetzelfde als <source src="080-files-dl/big-buck-bunny-640.mp4" type="video/mp4">. Het enige verschil is de naam van de video en het MIME-type. Bij de eerste <source> is dat video/mp4
, hier is het video/webm
. Browsers die MP4 kunnen afspelen, hebben de eerdere video uitgekozen en komen niet eens aan bij deze regel.
Je browser ondersteunt het afspelen van video's niet. Je kunt hieronder de video nog wel downloaden.
Als een browser <video> niet ondersteunt, verschijnt deze tekst op het scherm. Afspelen kan niet, de video downloaden en afspelen in een ander programma kan wel.
De download-links <a lang="en" href="..." download="..." title="...">
De volledige code voor het downloaden van de video's:
<p>Video downloaden? Rechtsklik op <a href="080-files-dl/big-buck-bunny-640.mp4" download="Big Buck Bunny.mp4" title="Download video in mp4-formaat">mp4</a> (5,3 <abbr title="megabyte">MB</abbr>) of <a href="080-files-dl/big-buck-bunny-640.webm" download="Big Buck Bunny.webm" title="Download video in webm-formaat">webm</a> (4,8 <abbr>MB</abbr>).</p>
Hier staan twee links: eentje voor de video in mp4-formaat, en eentje voor de video in webm-formaat. De bezoeker kan hierdoor kiezen welk formaat wordt gedownload. Als je maar één formaat opgeeft, is er een kans dat de gedownloade video niet kan worden afgespeeld.
Achter de normale href van een <a> staat extra code:
download="Big Buck Bunny.mp4"
Normaal genomen zou als naam voor de download 'big-buck-bunny-640.mp4' worden gebruikt. Maar in browsers die download
herkennen, wordt de naam nu veranderd in het veel mensvriendelijker 'Big Buck Bunny.mp4'.
De extensie 'mp4' hoeft niet te worden gebruikt achter download
, maar het is beter om dat wel te doen. Niet alle browsers blijken deze extensie zelf toe te voegen, waardoor deze niet altijd achter de naam van de video komt te staan. Een van de grootste ondingen wat betreft veiligheid op Windows is het standaard verbergen van extensies, waardoor 'n gebruiker niet snel kan zien wat voor soort bestand iets is. Ik heb er geen enkele behoefte aan dit veiligheidsrisico naar andere systemen te exporteren, dus daarom gebruik ik een extensie achter download
.
Achter de download-link staat de grootte van de video in MB. Omdat MB een afkorting is, staat deze in een <abbr>. De afkorting MB komt voor de eerste keer voor onder de eerste video, daarom staat bij de eerste <abbr> de afkorting voluit geschreven:
<abbr title="megabyte">MB</abbr>
Afhankelijk van de (instellingen van de) browser begint deze bij activeren van deze link gelijk met downloaden, of wordt eerst om bevestiging gevraagd. Mogelijk wordt niet iedereen gelijk dol van vreugde, als een browser zonder eerst om bevestiging te vragen een video van 300 gigabyte begint te downloaden. Daarom is achter de link de grootte van de download aangegeven.
Als je wilt uitproberen, hoe deze download-link in de diverse browsers op de diverse systemen werkt, moet je dat op een server uitproberen. Firefox bijvoorbeeld speelt de video gewoon af, als je het lokaal probeert. Maar als je het probeert op 'n server, wordt de video in datzelfde Firefox wel gedownload.
CSS
De code is geschreven in een afwijkende
lettersoort. De code die te maken heeft met de basis van dit voorbeeld (essentiële code) is in de hele uitleg blauw
gekleurd. Alle niet-essentiële code is bruin
. (In de inhoudsopgave staat alles in een gewone letter vanwege de leesbaarheid.)
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.
Technisch gezien is er geen enkel bezwaar om de css in het stijlbestand allemaal achter elkaar op één regel te zetten:
div#header-buiten {position: absolute; right: 16px; width: 100%; height: 120px; background: yellow;}
div#header-binnen {margin-left: 16px; height: 120px; text-align: center;}
Maar als je dat doet, garandeer ik je hele grote problemen, omdat het volstrekt onoverzichtelijk is. Beter is het om de css netjes in te laten springen:
div#header-buiten {
position: absolute;
right: 16px;
width: 100%;
height: 120px;
background: yellow;
}
div p {
margin-left: 16px;
height: 120px;
text-align: center;
}
Hiernaast is het heel belangrijk voldoende commentaar (uitleg) in het stijlbestand te schrijven. Nu weet je waarschijnlijk (hopelijk...), waarom je iets doet. Maar over vijf jaar kan dat volstrekt onduidelijk zijn. Op deze site vind je nauwelijks commentaar in de stijlbestanden, maar dat heeft een simpele reden: deze uitleg is in feite één groot commentaar.
Op internet zelf is het goed, als het stijlbestand juist zo klein mogelijk is. Dus voor het uploaden kun je normaal genomen het beste het commentaar weer verwijderen. Veel mensen halen zelfs alles wat overbodig is weg, voordat ze het stijlbestand uploaden. Inspringingen bijvoorbeeld zijn voor mensen handig, een computer heeft ze niet nodig.
Je hebt dan eigenlijk twee stijlbestanden: eentje waarin je dingen uitprobeert, verandert, enz., met commentaar, inspringingen, en dergelijke Dat is de mensvriendelijke versie. Daarnaast is er dan een stijlbestand dat je op de echte site gebruikt: een gecomprimeerde versie.
Dat comprimeren kun je met de hand doen, maar er bestaan ook hulpmiddelen voor. Als je op internet zoekt naar 'css' en 'compress' of 'comprimeren', vind je tal van sites, waar je dat automatisch kunt doen.
(Stijlbestanden op deze site zijn niet gecomprimeerd. Omdat het vaak juist om de css gaat, kunnen mensen dan zonder al te veel moeite de css bekijken.)
css voor alle breedtes
body
Het element waarbinnen de hele pagina staat. Veel instellingen die hier worden opgegeven, worden geërfd door de nakomelingen van <body>. Ze gelden voor de hele pagina, tenzij ze later worden gewijzigd. Dit geldt bijvoorbeeld voor de lettersoort, de lettergrootte en de voorgrondkleur.
background: #ff9;
Achtergrondkleurtje.
color: black;
Voorgrondkleur zwart. Dit is onder andere de kleur van de tekst.
Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hierboven heb ik een achtergrondkleur opgegeven. Sommige mensen hebben zelf de voor- en/of achtergrondkleur veranderd, bijvoorbeeld omdat ze slecht kleuren kunnen onderscheiden. Als ik nu de achtergrondkleur verander, maar niet de voorgrondkleur, loop ik het risico dat tekstkleur en achtergrondkleur te veel op elkaar gaan lijken.
Door beide op te geven, weet ik redelijk zeker dat achtergrond- en tekstkleur genoeg van elkaar blijven verschillen. Als de gebruiker !important
heeft gebruikt, is er nog niets aan de hand, want dan veranderen achtergrond- en voorgrondkleur geen van beide.
font-family: Arial, Helvetica, sans-serif;
Lettersoort. Als er geen Arial is, wordt gezocht naar Helvetica. Als dat er ook niet is in ieder geval 'n lettersoort zonder schreef (dwarsstreepjes).
font-size: 110%;
Iets groter dan standaard. 't Zal de leeftijd zijn, maar ik vind de standaardgrootte wat te klein.
margin: 0;
Standaardmarge bij <body> weghalen.
#wrapper
Het element met id="wrapper". Dit is een div waarbinnen de hele pagina staat.
width: 300px;
300 px breed maken.
Binnen deze div staan ook nog twee paragrafen met tekst. Door deze div een breedte te geven, kan hij makkelijk horizontaal worden gecentreerd op de manier, zoals hieronder bij margin
gebeurt.
Voor bredere browservensters wordt de breedte van div#wrapper
bij @media screen and (min-width: 640px) vergroot. Hele simpele of hele oude mobieltjes kunnen mogelijk niet met media query's uit de voeten. Daarom wordt de video standaard smal weergegeven, en pas als de browser meldt dat 't venster breder is, wordt de video breder afgespeeld.
Oorspronkelijk was deze breedte bedoeld voor een bijbehorende kleinere video, maar dat kan niet meer door een onbegrijpelijke verandering van de specificatie. Hoewel die oorspronkelijke reden is vervallen, blijft toch een breedte staan. Zonder breedte zou #wrapper
, en daarmee de daarin zittende video, de volle breedte van het venster van de browser vullen. Omdat de hoogte van de video automatisch aan de breedte wordt aangepast, kan de video dan te hoog worden voor het venster, waardoor een deel van de video aan de onderkant weg zou vallen.
Met deze breedte is het vrijwel onmogelijk dat een video te hoog wordt.
max-width: 100%;
Een breedte in procenten wordt altijd genomen ten opzichte van de ouder. Hier is dat <body>, die even breed is als het venster van de browser. div#wrapper
, en dus alles wat erin zit, mag nooit breder worden dan het venster van de browser.
margin: 5px auto 0;
Omdat voor links geen waarde is ingevuld, krijgt dat automatisch dezelfde waarde als rechts. Hier staat dus eigenlijk 5px - auto - 0 - auto
in de volgorde boven - rechts - onder - links.
Boven een kleine marge, zodat de video iets onder de rand van het browservenster komt te staan.
Links en rechts auto
. Dat betekent hier: evenveel. div#wrapper
staat nu altijd horizontaal gecentreerd, ongeacht de breedte van het venster.
Deze manier van horizontaal centreren van een blok-element werkt alleen, als het te centreren blok-element een breedte heeft.
video
Alle elementen <video>. Dat is er hier maar eentje.
width: 100%
100% breed maken. Een breedte in procenten is altijd ten opzichte van de ouder. Dat is hier div#wrapper
, die bij #wrapper een breedte van 300 px heeft gekregen. Bij @media screen and (min-width: 640: px) krijgt div#wrapper
een breedte van 640 px. Omdat <video> altijd 100% van de breedte van div#wrapper
krijgt, verandert de breedte van <video> mee met die van div#wrapper
.
Omdat div#wrapper
horizontaal is gecentreerd, is <video> met de daarin erin zittende video dat ook.
<video> werkt op zich ook prima zonder breedte op te geven, maar oudere versies van Android browser geven dan geen duidelijke videospeler weer, voordat de video wordt gestart.
p
Alle paragrafen. Dat zijn hier alleen de paar regels tekst onder de video.
text-align: center;
Tekst horizontaal centreren.
De <p>'s zitten allemaal in div#wrapper
. Die is bij #wrapper horizontaal gecentreerd, waardoor ook deze <p>'s dat zijn. Door de tekst vervolgens weer te centreren binnen de <p>, is ook de tekst horizontaal gecentreerd.
margin: 5px 0 0;
Omdat voor links geen waarde is opgegeven, krijgt dat automatisch dezelfde waarde als rechts. Hier staat dus eigenlijk 5px - 0 - 0 - 0
in de volgorde boven - rechts - onder - links.
Kleine marge aan de bovenkant voor wat afstand tussen tekst en video, en tussen de <p>'s onderling.
#tekst
Het element met id="tekst". Dit is de <p> waarbinnen de tekst met de roze achtergrond staat.
background: #f6c5cb;
Roze achtergrond.
color: black;
Voorgrondkleur zwart. Dit is onder andere de kleur van de tekst.
Hoewel dit de standaardkleur is, geef ik de kleur toch op. Hierboven heb ik een achtergrondkleur opgegeven. Sommige mensen hebben zelf de voor- en/of achtergrondkleur veranderd, bijvoorbeeld omdat ze slecht kleuren kunnen onderscheiden. Als ik nu de achtergrondkleur verander, maar niet de voorgrondkleur, loop ik het risico dat tekstkleur en achtergrondkleur te veel op elkaar gaan lijken.
Door beide op te geven, weet ik redelijk zeker dat achtergrond- en tekstkleur genoeg van elkaar blijven verschillen. Als de gebruiker !important
heeft gebruikt, is er nog niets aan de hand, want dan veranderen achtergrond- en voorgrondkleur geen van beide.
Ik heb dit ook al bij <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.
border: black solid 1px;
Zwart randje rondom de tekst.
padding: 3px 0;
Omdat voor onder en links geen waarde is opgegeven, krijgen die automatisch dezelfde waarde als boven en rechts. Hier staat dus eigenlijk 3px - 0 - 3px - 0
in de volgorde boven - rechts - onder - links.
Boven en onder een kleine padding. Dit geeft wat afstand tussen het zwarte randje en de tekst.
css voor vensters breder dan 640 px
@media screen and (min-width: 640px)
De css die hier tot nu toe staat, geldt voor alle browservensters, ook voor vensters smaller dan 640 px. De css die hieronder staat, geldt alleen voor browservensters breder dan 640 px. Voor een deel is dit nieuwe css, voor een deel wordt hierboven staande css aangepast.
@media
: geeft aan dat het om css gaat, die alleen van toepassing is, als aan bepaalde voorwaarden wordt voldaan. Al langer bestond de mogelijkheid om met behulp van zo'n media query css voor bijvoorbeeld printers op te geven. css3 heeft dat uitgebreid tot bepaalde fysieke eigenschappen, zoals de breedte en hoogte van het venster van de browser.
screen
: deze regel geldt alleen voor schermweergave. Een video printen of zo is wat onhandig.
and
: er komt nog een voorwaarde, waaraan moet worden voldaan.
(min-width: 640px)
: het browservenster moet minstens 640 px breed zijn. Is het venster smaller, dan wordt de css die binnen deze media query staat genegeerd.
Gelijk na deze regel komt een {
te staan, en aan het einde van de css die binnen deze regel valt een bijbehorende afsluitende }
. Die zijn in de regel hierboven weggevallen, maar het geheel ziet er zo uit:
@media screen and (min-width: 640px) {
body {color: silver;}
(...) rest van de css voor deze media query (...)
footer {color: gold;}
}
Voor de eerste css binnen deze media query staat dus een extra {
, en aan het eind staat een extra }
.
#wrapper
Het element met id="wrapper". Dit is een div waarbinnen de hele pagina staat.
width: 640px;
Bij #wrapper heeft div#wrapper
een breedte van 300 px gekregen. In browservensters breder dan 640 px wordt de video op een breedte van 640 px weergegeven. Daarom moet ook div#wrapper
worden verbreed.