Skip links en inhoudsopgave

Uitleg video zonder plug-in in (bijna) elke browser

Laatst aangepast: .

De videospeler.

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

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:

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

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:

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:

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:

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 (&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.

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.

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.

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.