- Leren
- Informatica & ICT
- Programmeren
- HTML en CSS: responsieve, toegankelijke websites bouwen
- Webformulieren, tabellen en media
Webformulieren, tabellen en media in HTML
BeginnerLes 3 van 8 in Cursus HTML en CSS: responsieve, toegankelijke websites bouwen
Wat je leert
- Maak een formulier, kies voor elk gegeven een passend bedieningselement, geef elk bedieningselement een label en weet precies wat de browser verstuurt wanneer het formulier wordt verzonden.
- Maak een formulier en begrijp welke gegevens het verstuurtGebruik het form-element, namen en waarden, verzendknoppen en de attributen action en method om te bepalen welke gegevens de pagina verlaten en waar ze naartoe gaan.
- Kies invoertypen die bij de gegevens passenKies het invoertype dat bij elk gegeven past, zodat browsers het juiste toetsenbord of de juiste kiezer aanbieden en het basisformaat controleren.
- Gebruik tekstgebieden, uitklaplijsten en andere bedieningselementenVerzamel langere tekst, bied vaste keuzelijsten en invoersuggesties aan en toon voortgang of metingen met textarea, select, datalist, progress en meter.
- Geef elk bedieningselement een label en groepeer samenhangende elementenKoppel zichtbare labels aan hun bedieningselementen, groepeer samenhangende bedieningselementen met fieldset en legend en voeg instructies en aanwijzingen voor automatisch aanvullen toe, zodat iedereen het formulier kan invullen.
- Maak een formulier en begrijp welke gegevens het verstuurt
- Gebruik HTML-validatieattributen zodat de browser ontbrekende, te lange, buiten het bereik vallende en verkeerd opgemaakte waarden opmerkt voordat het formulier wordt verzonden, en weet waar deze controle ophoudt.
- Maak velden verplicht en beperk de tekstlengteGebruik required, minlength en maxlength en voorspel wanneer de browser een verzending accepteert of blokkeert.
- Stel bereiken en stapgroottes in voor getallen, datums en tijdenGebruik min, max en step om alleen zinvolle waarden te accepteren en voorspel welke waarden worden goedgekeurd.
- Controleer of invoer aan patronen voldoet en geef bruikbare feedbackSchrijf eenvoudige patroonregels, leg ze uit aan gebruikers, geef geldige en ongeldige velden vorm en begrijp waarom de server de gegevens opnieuw moet controleren.
- Maak velden verplicht en beperk de tekstlengte
- Maak tabelgegevens op met rijen, cellen, kopcellen en een tabelbijschrift en houd grotere tabellen begrijpelijk met toepassingsbereiken van kopcellen, rij- en kolomgroepen en samengevoegde cellen.
- Maak een gegevenstabel met kopcellen en een tabelbijschriftGebruik table, tr, th, td en caption om gegevens in rijen en kolommen te presenteren en geef de tabel een duidelijke structuur met toepassingsbereiken van kopcellen en rijgroepen.
- Voeg cellen samen en koppel complexe kopcellen aan de juiste gegevenscellenGebruik colspan en rowspan correct, groepeer kolommen en koppel cellen aan hun kopcellen wanneer een tabel meer dan één niveau kopcellen heeft.
- Maak een gegevenstabel met kopcellen en een tabelbijschrift
- Voeg geluid en video in met de eigen spelers van de browser, bied formaten en terugvalmogelijkheden die in verschillende browsers werken en maak media voor iedereen bruikbaar met ondertiteling voor doven en slechthorenden, dialoogondertiteling en transcripten.
- Voeg audio en video in met de juiste attributenGebruik de elementen audio en video met afspeelbediening, afmetingen, een posterafbeelding en laadaanwijzingen, en bepaal wanneer automatisch afspelen en herhalen passend zijn.
- Bied bestandsformaten en terugvalmogelijkheden die overal werkenKies breed ondersteunde bestandsformaten, vermeld alternatieve bronnen op volgorde en voeg terugvalinhoud toe.
- Voeg ondertiteling voor doven en slechthorenden, dialoogondertiteling en transcripten toeSchrijf een eenvoudig WebVTT-bestand, koppel het met het track-element en bied transcripten aan zodat media ook zonder geluid bruikbaar zijn.
- Voeg audio en video in met de juiste attributen
- Plaats kaarten, video's en andere webpagina's met iframes binnen je eigen pagina en kies instellingen die elke inbedding toegankelijk, snel, privacyvriendelijk en veilig houden.
- Sluit een pagina in met een iframeVoeg een iframe toe met een titel, afmetingen en uitgesteld laden, pas inbedcode van een andere website aan en herken websites die inbedding niet toestaan.
- Zorg voor veilige inbeddingen die de privacy beschermen en kies het juiste elementBeperk met sandbox en allow wat een ingesloten pagina mag doen, bedenk wat inbeddingen over bezoekers delen en kies tussen iframe, embed, object en de media-elementen.
- Sluit een pagina in met een iframe
Webformulieren, tabellen en media: uitleg
1Maak formulieren die mensen kunnen gebruiken
Een bruikbaar formulier begint bij de informatie die mensen moeten invullen. Kies bedieningselementen die bij die informatie passen, geef elk element een duidelijk label en koppel de elementen aan een formulier dat betekenisvolle namen en waarden verstuurt. Een zoekveld, een berichtenformulier en een bestandsupload verzamelen allemaal invoer, maar hebben verschillende instellingen nodig. Door de HTML te volgen vanaf de invoer van de gebruiker tot en met het uitgaande verzoek, kun je die keuzes gemakkelijker controleren.
1.1 Hoe een formulier namen en waarden verstuurt
Een formulier verzamelt samenhangende antwoorden en verstuurt die naar een URL. Het <form>-element omvat de bedieningselementen en de verzendknop. Houd afzonderlijke formulieren gescheiden: HTML staat geen formulier binnen een ander formulier toe.
Kies de bestemming en methode
action geeft de ontvangende URL op. Zonder dit attribuut gaat het verzoek naar de huidige pagina. method bepaalt hoe de browser de gegevens verstuurt; standaard is dat GET.
| Methode | Waar de gegevens naartoe gaan | Gebruikelijk gebruik |
|---|---|---|
| GET | In de URL na een vraagteken | Zoekopdrachten en filters |
| POST | In de berichtinhoud van het verzoek | Berichten, aanmeldingen en wijzigingen in opgeslagen gegevens |
GET-gegevens kunnen verschijnen in de geschiedenis, bladwijzers en serverlogboeken. POST houdt ze buiten de querystring, maar versleutelt ze niet. Gebruik HTTPS om gegevens tijdens het verzenden te beschermen. Het serverprogramma ontvangt en verwerkt het verzoek; het HTML-formulier slaat antwoorden niet zelf op en e-mailt ze niet zelf.
Volg een zoekverzoek
<form action="/search" method="get">
<label for="query">Search</label>
<input id="query" type="search" name="q">
<label for="language">Language</label>
<select id="language" name="lang">
<option value="en">English</option>
</select>
<button type="submit">Search</button>
</form>
Als de gebruiker “html tables” invoert, vraagt de browser /search?q=html+tables&lang=en op. Die neemt de veldnaam q en de huidige waarde, codeert de spatie als + en verbindt de twee paren met &. De ? begint de querystring.
Een bedieningselement heeft een name nodig om gegevens mee te sturen. De id heeft een ander doel: het element op de pagina identificeren, onder meer om een label te koppelen. Een invoerveld met id="query" maar zonder name kan er normaal uitzien en normaal werken, terwijl het geen antwoord aan het verzoek toevoegt.
Weet welke bedieningselementen gegevens meesturen
Een leeg tekstveld met een naam stuurt een lege waarde mee, zoals comment=. Een aangevinkt selectievakje stuurt zijn value mee; zonder waarde stuurt het on mee. Een niet-aangevinkt selectievakje stuurt niets mee. Een uitgeschakeld bedieningselement is niet beschikbaar en wordt weggelaten. Een ondersteund readonly veld kan niet worden bewerkt, maar stuurt zijn waarde wel mee.
Een verborgen invoerveld, zoals <input type="hidden" name="source" value="newsletter">, stuurt een waarde mee zonder zichtbaar bedieningselement. Die waarde is niet geheim: bezoekers kunnen die in ontwikkelaarstools bekijken en wijzigen.
Maak het gedrag van knoppen expliciet
Binnen een formulier verzendt een gewone <button> standaard het formulier. Schrijf type="submit" voor de verzendknop en type="button" voor een knop die een script nodig heeft. type="reset" herstelt de beginwaarden en kan het werk van een gebruiker wissen. Als je in een veld met één regel op Enter drukt, wordt het formulier ook vaak verzonden. <input type="submit" value="Send"> is een ander verzendelement; een <button> kan ook inline-inhoud bevatten, zoals een pictogram.
Verstuur de inhoud van een bestand
<form action="/upload" method="post" enctype="multipart/form-data">
<label for="attachment">Attachment</label>
<input id="attachment" type="file" name="attachment">
<button type="submit">Upload</button>
</form>
Voor een gewone bestandsupload zijn zowel POST als enctype="multipart/form-data" nodig. Met de standaardcodering van formulieren gaan bestandsnamen als tekst mee, maar de inhoud van de bestanden niet.
Belangrijkste punten
- De
namevan een bedieningselement identificeert de verzonden waarde;ididentificeert het element op de pagina. - GET zet paren in de URL; POST zet ze in de berichtinhoud van het verzoek. HTTPS versleutelt gegevens tijdens het transport.
- Niet-aangevinkte selectievakjes en uitgeschakelde bedieningselementen worden weggelaten; ondersteunde alleen-lezenvelden worden verzonden.
- Maak knoptypen expliciet om onbedoeld verzenden of resetten te voorkomen.
- Bestandsuploads hebben POST en
multipart/form-datanodig.
1.2 Invoertypen en de waarden die ze verzamelen
Een <input> is een leeg element en heeft dus geen inhoud en geen sluittag. Het type bepaalt het bedieningselement en de bijbehorende hulp van de browser. Ontbrekende of onbekende typen vallen terug op een tekstveld.
Stem tekst af op het doel
| Type | Gebruik | Hulp van de browser |
|---|---|---|
text | Eén regel vrije tekst | Algemene tekstinvoer |
search | Een zoekopdracht | Kan een wisknop bevatten |
email | Een e-mailadres | E-mailtoetsenbord en syntaxiscontrole |
url | Een volledig webadres | URL-toetsenbord en syntaxiscontrole |
tel | Een telefoonnummer | Telefoontoetsenbord; geen formaatcontrole |
password | Een wachtwoord | Verbergt de zichtbare tekens |
Een e-mailveld controleert de syntaxis, niet of een mailbox bestaat. Zelfs “ana@example” komt door de basissyntaxiscontrole. Voeg multiple toe om een lijst met adressen gescheiden door komma's te accepteren. Een URL-veld verwacht een URL-schema: “https://example.com” wordt geaccepteerd, “example.com” niet. Telefoonformaten verschillen, dus tel legt geen formaatregel op. Het verbergen van wachtwoorden voorkomt dat mensen in de buurt op het scherm kunnen meelezen; HTTPS zorgt nog steeds voor versleuteling tijdens de verzending.
Maak onderscheid tussen hoeveelheden en cijfercodes
Gebruik number voor een hoeveelheid, zoals een aantal of een massa. Het heeft vaak pijltjesknoppen om de waarde te verhogen of te verlagen. Gebruik range voor een instelling bij benadering, zoals volume; het standaardbereik is 0–100 en de standaardwaarde is 50.
Een lidmaatschapscode is geen hoeveelheid. Gebruik <input type="text" inputmode="numeric"> voor een cijfercode, zodat voorloopnullen tekst blijven en pijltjesknoppen de code niet veranderen. inputmode stelt alleen een schermtoetsenbord voor: het valideert de invoer niet. decimal, tel, email en url zijn andere nuttige toetsenbordaanwijzingen.
Houd weergave en verzonden formaat gescheiden
Datumkiezers volgen de regionale instellingen van de gebruiker. 15 maart 2026 kan verschijnen als “03/15/2026” of “15/03/2026”, maar de verzonden datum is 2026-03-15.
| Type | Voorbeeld van verzonden waarde |
|---|---|
date | 2026-03-15 |
time | 14:30 |
datetime-local | 2026-03-15T14:30 |
month | 2026-03 |
week | 2026-W11 |
Deze bedieningselementen slaan geen tijdzone op. Als het van belang is, moet bij een lokale afspraaktijd de locatie of tijdzone dus apart worden toegelicht.
Bied onafhankelijke keuzes of één keuze aan
Selectievakjes zijn onafhankelijk: er kunnen er meerdere zijn aangevinkt. Keuzerondjes vormen een groep voor één keuze wanneer hun name-waarden overeenkomen. Geef elk keuzerondje een eigen value en gebruik checked voor een standaardkeuze.
<label><input type="radio" name="size" value="S"> Small</label>
<label><input type="radio" name="size" value="M" checked> Medium</label>
<label><input type="radio" name="size" value="L"> Large</label>
De standaardkeuze verstuurt size=M. Verschillende namen zouden afzonderlijke groepen maken en meerdere keuzes toestaan.
Kies kleuren en bestanden
color biedt een kleurkiezer en kan een RGB-kleur zoals #ff8800 versturen. file opent een bestandskiezer; accept=".pdf,image/*" stelt pdf's en afbeeldingen voor en multiple staat meerdere bestanden toe. Het filter helpt gebruikers bij het kiezen; de server moet het type en de inhoud van het ontvangen bestand nog steeds controleren. Bij bedieningselementen die het gebruiken, stelt value de beginwaarde in. Die blijft de verzonden waarde als de gebruiker niets verandert.
Belangrijkste punten
- Kies een type op basis van de betekenis van de gegevens, niet alleen op basis van het uiterlijk.
- De typen voor e-mail en URL controleren de syntaxis;
teleninputmodedoen dat niet. - Gebruik tekst met een aanwijzing voor een numeriek toetsenbord voor cijfercodes.
- De weergave van datum en tijd verschilt per regio; verzonden formaten liggen vast en bevatten geen tijdzone.
- Keuzerondjes delen een naam voor één keuze; selectievakjes staan onafhankelijke keuzes toe.
- Het
accept-filter van een bestandskiezer is geen beveiligingscontrole.
1.3 Lange antwoorden, vaste keuzes en suggesties
Een invoerveld met één regel past niet bij elk antwoord. Langere tekst heeft ruimte nodig, terwijl een vaste reeks keuzes bedieningselementen nodig heeft die laten zien wat is toegestaan. Bepaal voordat je het element kiest of de gebruiker iets buiten de keuzes mag invoeren.
Geef langere tekst een tekstgebied
<label for="message">Message</label>
<textarea id="message" name="message" rows="5" cols="40"></textarea>
rows geeft het zichtbare aantal regels en cols de breedte bij benadering in tekens. Geen van beide beperkt hoeveel tekst kan worden ingevoerd; gebruik maxlength voor een lengtebeperking. Begintekst hoort tussen de tags, niet in een value-attribuut. Spaties en regeleinden op die plaats worden onderdeel van de beginwaarde. Openings- en sluittags direct naast elkaar maken dus een echt leeg veld.
Verstuur een waarde uit een uitklaplijst
<label for="delivery">Delivery</label>
<select id="delivery" name="delivery" required>
<option value="">Choose delivery</option>
<option value="standard">Standard (3–5 days)</option>
<option value="express">Express (next day)</option>
</select>
De keuze voor “Express (next day)” verstuurt delivery=express. De zichtbare tekst kan een keuze toelichten terwijl de value kort en stabiel blijft. Als een optie geen value heeft, wordt de tekst verstuurd. Voeg selected toe om een optie vooraf te selecteren. Hier heeft de eerste optie een lege waarde, zodat de verplichte lijst met één keuze pas kan worden verzonden nadat de gebruiker een bezorgmethode kiest.
Groepeer opties of sta meerdere opties toe
Een <optgroup label="Hot drinks"> geeft samenhangende opties een kop. Die kop is zelf geen keuze. Een select met multiple staat meerdere geselecteerde opties toe en size bepaalt het aantal zichtbare rijen. Elke geselecteerde waarde wordt een afzonderlijk paar met dezelfde naam: topics=html&topics=css.
Op een computer vereist meervoudige selectie vaak Ctrl-klik of Cmd-klik. Voor een korte lijst met onafhankelijke keuzes maken selectievakjes de selectie meestal duidelijker. Voor een korte lijst met één keuze houden keuzerondjes elke optie zichtbaar. Een select is handig voor een lange vaste lijst.
Geef suggesties zonder te beperken
<label for="city">City</label>
<input id="city" name="city" list="cities">
<datalist id="cities">
<option value="Nairobi">
<option value="Osaka">
</datalist>
De list van het invoerveld komt overeen met de id van de datalist. Gebruikers zien suggesties, maar mogen nog steeds een andere stad typen. Een datalist is daarom nuttig voor veelvoorkomende antwoorden op een open vraag. Als je een select door een datalist vervangt, verander je de toegestane keuzes; je verandert niet alleen het uiterlijk van dezelfde vaste lijst.
Toon voortgang of een meting
<progress> en <meter> tonen waarden in plaats van antwoorden te verzamelen. Een voortgangsbalk volgt hoever een taak is voltooid, zoals <progress value="70" max="100">70%</progress>. Een meetindicator toont een meting binnen een bekend bereik: <meter value="0.6">60%</meter> kan de gebruikte opslagruimte weergeven. Een meetindicator heeft standaard een bereik van 0–1, tenzij min en max dat veranderen. Tekst binnen deze elementen biedt terugvaltekst wanneer de balk niet kan worden getekend. Zet bij beide weergaven een verklarend label, zodat gebruikers weten wat het getal meet.
Belangrijkste punten
- De beginwaarde van een tekstgebied is de inhoud ervan;
rowsencolsbepalen alleen de zichtbare grootte. - Een select verstuurt de waarden van geselecteerde opties en kan een vaste keuze afdwingen.
- Een datalist stelt antwoorden voor, maar staat andere tekst toe.
- Gebruik progress voor de voltooiing van een taak en meter voor een meting binnen een bekend bereik.
1.4 Zichtbare labels en bruikbare formulierinstructies
Een veld heeft een naam nodig die zichtbaar blijft terwijl de gebruiker het invult. Een gekoppeld <label> geeft het bedieningselement ook een toegankelijke naam voor schermlezers en maakt de tekst tot een groter klikdoel. Instructies leggen regels uit die het label alleen niet kan overbrengen.
Koppel het label aan het bedieningselement
<label for="email">Email address</label>
<input id="email" name="email" type="email" autocomplete="email">
De for van het label komt overeen met de id van het invoerveld, inclusief hoofdletters en kleine letters. De name bepaalt wat wordt verzonden en hoeft niet hetzelfde te zijn. Elke id moet uniek zijn op de pagina. Als for="email" naar een name verwijst maar er geen overeenkomstige id is, ziet het label er normaal uit maar is het niet gekoppeld.
Een andere mogelijkheid is om het invoerveld in het label te plaatsen:
<label>
<input type="checkbox" name="news">
Send me the monthly newsletter
</label>
Deze impliciete koppeling is handig voor een kort label bij een selectievakje. Een expliciet paar for en id werkt ook wanneer het label en het bedieningselement in de HTML van elkaar gescheiden zijn.
Houd labels gescheiden van voorbeelden
Een plaatsaanduiding zoals “name@example.com” verdwijnt zodra je begint te typen. Die kan ook moeilijk leesbaar zijn en is geen betrouwbare toegankelijke naam. Behoud het zichtbare label; gebruik een plaatsaanduiding alleen als kort voorbeeld wanneer dat helpt.
Markeer verplichte velden in woorden, zoals “Naam (verplicht)”, of leg een sterretje één keer boven het formulier uit. Kleur alleen kan niet iedereen vertellen wat verplicht is. Leg een formaat uit voordat gebruikers proberen het formulier te verzenden.
<label for="pw">Password (required)</label>
<input id="pw" name="password" type="password"
required minlength="8" aria-describedby="pw-hint">
<p id="pw-hint">Use at least 8 characters.</p>
aria-describedby verwijst naar de id van de toelichting. Het voegt de instructie toe als beschrijving na de naam van het veld; het vervangt het label niet.
Geef een groep bedieningselementen een naam
<fieldset>
<legend>Delivery speed</legend>
<label><input type="radio" name="speed" value="standard"> Standard</label>
<label><input type="radio" name="speed" value="express"> Express</label>
<label><input type="radio" name="speed" value="pickup"> Pickup</label>
</fieldset>
Het groepsbijschrift geeft de gezamenlijke vraag; elk label benoemt een antwoord. Een veldengroep kan ook samenhangende adresvelden groeperen. Zet het groepsbijschrift eerst. disabled op een veldengroep schakelt de bedieningselementen daarin uit, behalve bedieningselementen binnen het eerste groepsbijschrift. Houd gewone formulieronderdelen buiten het groepsbijschrift, zodat deze uitzondering niet voor verrassingen zorgt.
Help browsers bekende gegevens in te vullen
autocomplete beschrijft het doel van informatie over de gebruiker. Waarden zijn onder meer name, email, tel, street-address, postal-code, country-name, bday, new-password, current-password en one-time-code. Correct opgegeven doelen ondersteunen het invullen van opgeslagen gegevens en WCAG 2.2-criterium 1.3.5, Identificeer het doel van de input (AA). autocomplete="off" is een verzoek; browsers kunnen nog steeds opgeslagen wachtwoorden aanbieden.
Gebruik voor een optioneel telefoonveld het label “Telefoonnummer (optioneel)” met type="tel", name="phone" en autocomplete="tel". Klik op het label om de focus te controleren en ga daarna met Tab door het formulier. Test elk label op deze manier, ook labels naast selectievakjes en keuzerondjes.
Belangrijkste punten
- Een zichtbaar label moet echt met zijn bedieningselement zijn gekoppeld.
forkomt overeen met een uniekeid; voor verzending wordtnamegebruikt.- Een groepsbijschrift benoemt een veldengroep, terwijl labels de afzonderlijke bedieningselementen benoemen.
- Koppel zichtbare toelichtingen met
aria-describedbyen markeer verplichte velden in tekst. - Geef de juiste doelen voor automatisch aanvullen op en controleer het formulier met klikken en het toetsenbord.
2Controleer antwoorden vóór verzending
De browser kan ontbrekende antwoorden, tekst met de verkeerde lengte, waarden buiten een bereik en invoer die niet aan een vast formaat voldoet, opsporen. Die controles beginnen bij het invoertype en de HTML-attributen. Ga na hoe verschillende regels samen werken, ook wanneer een lege waarde is toegestaan. Duidelijke instructies helpen mensen hun invoer te verbeteren; controles op de server blijven nodig omdat browserregels kunnen worden omzeild.
2.1 Verplichte velden en tekstlengte
Ingebouwde validatie controleert de bedieningselementen van een formulier wanneer de gebruiker het verzendt. Een ongeldig bedieningselement blokkeert de verzending; de browser zet de focus op het eerste ongeldige veld en geeft een melding in de eigen taal. De browser kiest de exacte bewoording. Om die te veranderen is JavaScript nodig.
Maak een antwoord verplicht
required betekent dat een bedieningselement een waarde nodig heeft. Bij een tekstveld wordt een lege tekenreeks afgewezen. Bij een selectievakje betekent required dat juist dat vakje moet zijn aangevinkt, zoals bij het accepteren van voorwaarden. Als je bij keuzerondjes met dezelfde naam required op één rondje zet, moet één rondje in de groep zijn geselecteerd. Een verplichte select met één keuze en een lege eerste optie vereist een niet-lege keuze.
<label for="username">Username (required)</label>
<input id="username" name="username"
required minlength="4" maxlength="12">
De browser combineert deze regels. Het veld moet een antwoord bevatten en door de gebruiker ingevoerde tekst moet binnen de lengtebeperkingen vallen. Als je type weglaat, krijg je het gewone tekstinvoerveld.
Tel de ingevoerde tekens
minlength bepaalt de kleinste toegestane lengte en maxlength de grootste. Spaties en leestekens tellen mee. De lengte wordt gemeten in UTF-16-code-eenheden, zodat sommige emoji als twee tellen; gewone Latijnse letters tellen elk als één.
In dit voorbeeld heeft “Li” twee tekens en voldoet het niet aan het minimum. “Lina” heeft er vier en wordt geaccepteerd. “mountainhiker” heeft 13 tekens. Bij gewoon typen stopt de browser na het twaalfde teken, zodat “mountainhike” overblijft. De breedte van een tekstveld bepaalt deze grens niet.
Behandel aanwezigheid en lengte als verschillende regels
Een optioneel veld met minlength="4" mag leeg zijn. De minimumlengte wordt gecontroleerd zodra de gebruiker een waarde opgeeft. Als je required toevoegt, wordt ook een lege invoer afgewezen. Dit is van belang voor een optionele bijnaam: een gebruiker mag die weglaten, maar een opgegeven bijnaam moet nog steeds genoeg tekens hebben.
required is een booleaans attribuut. De aanwezigheid schakelt het in, ook bij required="false". Verwijder het attribuut om het veld optioneel te maken. Dezelfde aanwezigheidsregel geldt voor veel andere HTML-schakelaars.
Weet wat deze controles niet bepalen
Een reeks spaties is nog steeds inhoud in een tekstveld. required accepteert die daarom en de spaties tellen ook mee voor de lengte. Voor een regel die een zichtbaar teken vereist, is een geschikt patroon of een controle op de server nodig. Vertel gebruikers niet dat required alleen een betekenisvol antwoord garandeert.
Lengtebeperkingen hangen ook af van de manier waarop de waarde is ingevoerd. Een beginwaarde in de HTML of een waarde die door een script is ingesteld, wordt niet door minlength of maxlength als ongeldig aangemerkt alleen omdat die te kort of te lang is. Een correcte standaardwaarde blijft belangrijk, ook als gewoon typen wordt beperkt.
Om dit veld te controleren, probeer je een lege verzending en voer je daarna twee letters, vier letters en meer dan 12 letters in. Elke poging onderzoekt een andere regel. Wanneer de browser bij de limiet stopt met typen, lees je welke waarde werkelijk in het veld is achtergebleven in plaats van aan te nemen dat de volledige invoerpoging is geaccepteerd.
Belangrijkste punten
requireden lengtebeperkingen lossen verschillende problemen op.- Booleaanse attributen blijven ingeschakeld, ook als ze met de waarde
"false"zijn geschreven. - Spaties tellen als inhoud; sommige emoji gebruiken twee UTF-16-code-eenheden.
- Eén verplicht keuzerondje maakt een keuze verplicht in de groep met dezelfde naam.
2.2 Grenzen en toegestane stappen
Een getal of datum kan het juiste formaat hebben en toch ongeschikt zijn. min en max bepalen de grenzen; step bepaalt welke stappen daarbinnen zijn toegestaan. Een getal moet aan beide controles voldoen.
Stel het bereik in
<label for="weight">Parcel weight (kg)</label>
<input id="weight" name="weight" type="number"
min="0.5" max="30" step="0.5">
De eindpunten zijn inbegrepen. Waarden van 0,5 tot en met 30 kg liggen binnen het bereik, maar moeten ook op stappen van een halve kilogram uitkomen. Vanaf 0,5 krijg je 0,5; 1; 1,5 enzovoort tot en met 30: 60 toegestane waarden. Een invoer van 31 overschrijdt het maximum; 2,25 ligt binnen het bereik maar voldoet niet aan de stapgrootte.
Zoek het beginpunt voordat je telt
Stappen worden vanaf min geteld als dat aanwezig is. Anders worden ze geteld vanaf een geldig HTML-attribuut value en daarna vanaf de standaardbasis van het type. Voor number is die standaardbasis 0. De standaardstap is 1.
Bij min="1" step="2" zijn de geaccepteerde waarden 1, 3, 5, 7 enzovoort. Vier wordt afgewezen, ook al is het een veelvoud van twee, omdat de reeks bij één begint. Bij min="0.5" zonder step-attribuut is de stap nog steeds één: 0,5; 1,5 en 2,5 worden geaccepteerd, maar 1 en 2 niet.
Als noch min noch een value-attribuut een andere basis geeft, accepteert een standaard getalveld gehele getallen. Gebruik step="0.01" voor stappen van een honderdste of step="any" om de stapcontrole uit te schakelen. any verwijdert het minimum of maximum niet.
Gebruik de juiste eenheden voor datums en tijden
| Type | Standaardstap | Voorbeeld van een grens |
|---|---|---|
number of range | 1 | max="30" |
date | 1 dag | min="2026-06-01" |
time | 60 seconden | max="17:00" |
Een datuminvoerveld met min="2026-06-01" max="2026-08-31" accepteert datums in dat gesloten interval. Schrijf de attributen in het verzonden formaat, ook als de kiezer een andere datumvolgorde toont.
Voor afspraken gebruikt type="time" min="09:00" max="17:00" step="900" 900 seconden, ofwel 15 minuten, per stap. De reeks begint om 09.00 uur en eindigt om 17.00 uur. Er zijn 32 tussenpozen en 33 selecteerbare tijden, inclusief beide eindpunten.
Maak onderscheid tussen invoer en opgeslagen waarde
Sommige browsers die aan de taal zijn aangepast, staan decimale invoer als “2,5” toe, maar versturen 2.5. Tekst die geen getal is, wordt geblokkeerd of laat de getalwaarde leeg, afhankelijk van de browser. Een optioneel leeg invoerveld is nog steeds toegestaan tenzij required aanwezig is.
Een range-schuifregelaar blijft binnen het toegestane bereik en springt naar de stappen, zodat gebruikers niet dezelfde bereik- en stapfouten tegenkomen als bij een getypt getal. Daarnaast worden niet-lege email- en url-velden ook zonder required op type gecontroleerd: een optioneel antwoord wordt niet geldig als het verkeerd is opgemaakt.
Belangrijkste punten
- Controleer de grenzen en of de waarde op een toegestane stap uitkomt afzonderlijk.
- Zoek de stapbasis in deze volgorde:
min, HTML-value, dan de standaardbasis van het type. step="any"schakelt de stapcontrole uit maar behoudt de andere beperkingen.- Tijdstappen zijn seconden; datumstappen zijn dagen.
- Tel de eindpunten mee wanneer je het aantal toegestane tijden bepaalt.
2.3 Vaste patronen en bruikbare feedback
Een patroon is nuttig wanneer een organisatie een exact tekstformaat vastlegt, zoals een productcode. De browser toetst de volledige niet-lege waarde aan het patroon. Leg het formaat naast het veld uit, zodat gebruikers eraan kunnen voldoen voordat een fout verschijnt.
Bouw een klein patroon
<label for="code">Product code (required)</label>
<input id="code" name="code" required
pattern="[A-Z]{3}-[0-9]{4}" aria-describedby="code-hint">
<p id="code-hint">Use 3 capital letters, a hyphen, and 4 digits (ABC-1234).</p>
[A-Z] komt overeen met één Latijnse hoofdletter en {3} herhaalt die precies drie keer. Het koppelteken buiten de tekengroepen is letterlijk. [0-9]{4} vereist vier cijfers. “ABC-1234” wordt geaccepteerd. “abc-1234”, “ABC1234” en “ABC-12345” overtreden elk een ander deel van de regel.
| Patroononderdeel | Betekenis |
|---|---|
[A-Za-z] | Eén standaardletter uit het Latijnse alfabet |
{2,5} | Twee tot vijf herhalingen |
+ | Eén of meer herhalingen |
? | Voorafgaand onderdeel is optioneel |
(cm|mm) | Een van de twee alternatieven, cm of mm |
Patronen worden aan de volledige waarde getoetst, dus extra tekst aan het begin of einde wordt afgewezen. Voeg niet de omringende schuine strepen toe die in reguliere expressies van JavaScript worden gebruikt. pattern is van toepassing op tekstachtige invoervelden zoals text, search, tel, email, url en password, niet op een tekstgebied. Lege waarden slaan de patrooncontrole over; required behandelt een leeg antwoord.
Schrijf letterlijke leestekens zorgvuldig
Tekens zoals ., + en ? hebben een speciale betekenis. Zet er een backslash voor als ze letterlijk moeten voorkomen: \. komt overeen met een punt. Binnen een tekengroep vereisen moderne HTML-patronen ook een backslash voor leestekens zoals een letterlijk koppelteken: [a-z0-9\-]. Dit koppelteken verschilt van het koppelteken dat het bereik a-z bepaalt.
Een ongeldig patroon wordt genegeerd. Andere regels, waaronder required en typecontroles, worden nog steeds uitgevoerd. Test een patroon met zowel invoer die moet worden geaccepteerd als invoer die moet worden afgewezen; een formulier dat één verwachte waarde verzendt, heeft nog niet laten zien dat het patroon iets afwijst.
Leg de regel en de fout uit
Zet zichtbare toelichting naast het bedieningselement. Een title kan bijdragen aan sommige browsermeldingen; houd de formaatinstructie zichtbaar naast het veld. Vermijd starre patronen voor namen, telefoonnummers of postcodes, tenzij het toegestane formaat echt vastligt; geldige internationale antwoorden kunnen sterk verschillen.
CSS biedt :valid en :invalid voor de huidige validatiestatus van een veld. :user-invalid stelt de ongeldige toestand uit tot na interactie van de gebruiker, zodat een onaangeraakt formulier niet vol foutopmaak staat. Combineer kleuren met woorden of een pictogram, zodat het onderscheid ook zichtbaar blijft zonder kleurwaarneming.
Bepaal wanneer controles worden uitgevoerd
novalidate op het formulier slaat de validatie door de browser tijdens verzending over. formnovalidate op één verzendknop slaat de validatie voor die knop over. Dat kan een knop “Concept opslaan” naast een gewone knop “Verzenden” ondersteunen. Browsercontroles kunnen ook met ontwikkelaarstools worden verwijderd of met een direct verzoek worden omzeild. De server moet binnenkomende gegevens opnieuw controleren voordat die worden vertrouwd.
Belangrijkste punten
- Een patroon controleert de volledige niet-lege waarde;
requiredbehandelt ontbrekende invoer. - Controleer vaste organisatiecodes met patronen en leg hun formaat zichtbaar uit.
- Een verkeerd opgebouwd patroon wordt genegeerd terwijl andere beperkingen blijven gelden.
- Gebruik voor de vormgeving van validatietoestanden meer dan alleen kleur.
- Een overgeslagen of omzeilde browsercontrole maakt validatie op de server essentieel.
formnovalidategeldt voor één verzendknop;novalidategeldt voor het formulier.
3Maak tabellen die hun gegevens verduidelijken
Een gegevenscel krijgt betekenis door de rij en kolom waarin die staat. Met HTML-tabellen kun je die relaties uitdrukken, zodat mensen een waarde kunnen lezen naast de koppen die de waarde verklaren. Begin met een tabelbijschrift en eenvoudige kopcellen en voeg pas rijgroepen of samengevoegde cellen toe als de gegevens dat vereisen. Door het aantal kolommen te tellen en elke waarde aan de juiste kopcellen te koppelen, blijft de tabel bruikbaar wanneer die wordt voorgelezen én wanneer die wordt bekeken.
3.1 Rijen, kopcellen en een duidelijke tabeltitel
Gebruik een tabel wanneer een waarde afhangt van zowel de rij als de kolom: een trainingslogboek, een rooster of een vergelijking van metingen. Gebruik CSS voor de pagina-indeling. Een lay-out van tabelcellen creëert voor schermlezers misleidende relaties tussen rijen en kolommen en past zich slecht aan smalle schermen aan.
Bouw de structuur op vanuit de gegevens
<table> bevat de tabel, <tr> een rij, <th> een kopcel en <td> een gegevenscel. Cellen worden binnen elke rij van links naar rechts geschreven. Een vetgedrukte gegevenscel blijft een gegevenscel; gebruik <th> om een kop aan te geven.
<table>
<caption>Running log, week 12</caption>
<thead>
<tr>
<th scope="col">Day</th>
<th scope="col">Distance (km)</th>
<th scope="col">Time (min)</th>
</tr>
</thead>
<tbody>
<tr><th scope="row">Monday</th><td>5.0</td><td>28</td></tr>
<tr><th scope="row">Wednesday</th><td>7.5</td><td>45</td></tr>
<tr><th scope="row">Saturday</th><td>10.0</td><td>62</td></tr>
</tbody>
<tfoot>
<tr><th scope="row">Total</th><td>22.5</td><td>135</td></tr>
</tfoot>
</table>
Het tabelbijschrift is het eerste element binnen de tabel. Het vertelt lezers wat de hele tabel beschrijft voordat ze de waarden tegenkomen. Een kop in de buurt kan visueel helpen, maar het tabelbijschrift koppelt de titel aan de tabel zelf.
Koppel elke waarde aan de bijbehorende koppen
scope="col" geeft aan dat een kopcel van boven naar beneden op een kolom van toepassing is. scope="row" geeft aan dat die op een rij van toepassing is. De waarde 7,5 hoort dus bij de rij “Woensdag” en de kolom “Afstand (km)”. Een schermlezer kan die volledige betekenis aankondigen in plaats van een los getal.
Zet eenheden in de kolomkoppen, zodat ze consequent gelden. Elke afstand is hier in kilometers; elke tijd is in minuten. De totale afstand komt van 5,0; 7,5 en 10,0 en is 22,5 km. De tijden 28, 45 en 62 geven 135 min.
Geef elke groep een rol
<thead> groepeert koprijen, <tbody> de hoofdgegevens en <tfoot> het overzicht na de gegevensrijen. Deze groepen beschrijven de structuur en bieden aanknopingspunten voor CSS. Browsers plaatsen een <tbody> om gewone rijen die direct binnen een tabel zijn geschreven, zodat de weergegeven structuur kan verschillen van de bron zonder groepen.
Controleer zowel de betekenis als het uiterlijk
Elke rij beslaat hier drie kolommen. Als je een gegevenscel weglaat, weet de browser niet welke waarde binnen de rij ontbreekt: latere cellen kunnen onder de verkeerde kop komen te staan. Schrijf de cellen op de juiste plaats en gebruik “0” voor een bekende nul of “n.v.t.” wanneer een waarde niet van toepassing is. Bij een onverklaarde lege cel moeten lezers raden.
Tabellen hebben standaard geen randen. Voor eenvoudige lijnen pas je border: 1px solid toe op de cellen en border-collapse: collapse op de tabel. Het oude border-attribuut is verouderd. Een rand helpt het raster zichtbaar te maken, maar kan ontbrekende relaties met kopcellen niet aanvullen of een verkeerd geplaatste waarde corrigeren.
Belangrijkste punten
- Tabellen drukken relaties tussen rijen en kolommen in gegevens uit.
- Gebruik
thvoor kopcellen entdvoor gegevens; vetgedrukte tekst geeft geen betekenis aan de cel. - Plaats een tabelbijschrift eerst en gebruik
scopeom eenvoudige kopcellen te koppelen. - Groepeer rijen met
thead,tbodyentfooten controleer hoeveel kolommen elke rij beslaat. - Zet eenheden in kopcellen en maak de betekenis van ontbrekende gegevens expliciet.
3.2 Samengevoegde cellen en koppen op meerdere niveaus
Met samengevoegde cellen kan één gegeven meerdere posities in het raster beslaan. Ze veranderen hoeveel nieuwe cellen een rij nodig heeft, dus plan de bezette posities voordat je de tags schrijft.
Tel de posities in een rooster met samengevoegde cellen
Neem drie kolommen: “Tijd”, “Maandag” en “Dinsdag”. Om 09.00 uur staat op maandag “Formulieren” en op dinsdag “Tabellen”. Om 10.00 uur begint op maandag “Validatie”, dat doorloopt in de rij van 11.00 uur. Op dinsdag staat om 10.00 uur “Media” en om 11.00 uur “Inbeddingen”. Om 12.00 uur beslaat “Lunchpauze” beide dagen.
<tr>
<th scope="row">10:00</th>
<td rowspan="2">Validation</td><td>Media</td>
</tr>
<tr>
<th scope="row">11:00</th><td>Embeds</td>
</tr>
<tr>
<th scope="row">12:00</th><td colspan="2">Lunch break</td>
</tr>
Om 11.00 uur is de positie voor maandag al bezet door de cel erboven. De enige nieuwe cellen zijn de tijdkop en het gegeven voor dinsdag. Als je nog een cel voor maandag toevoegt, wordt de laatste waarde naar een vierde kolom verschoven. Om 12.00 uur beslaat de tijdkop één kolom en de lunchcel twee, samen dus drie.
colspan beslaat kolommen horizontaal; rowspan beslaat rijen verticaal. Beide hebben standaard de waarde één. Tel bij het controleren van een rij de posities die door nieuwe cellen en door overspanningen uit eerdere rijen zijn gevuld.
Beschrijf groepen kolommen
<colgroup> en <col> beschrijven kolommen en staan na het tabelbijschrift maar vóór de rijgroepen. <col span="2"> vertegenwoordigt twee kolommen. Slechts een beperkt aantal stijlen is via deze elementen van toepassing, waaronder achtergronden, breedte, zichtbaarheid en randen volgens de geldende regels voor tabelranden. Ze vervangen geen kopcellen.
Voor “Afstand (km)” boven twee kolommen met de namen “Gepland” en “Werkelijk” definieer je die twee kolommen als groep. Geef de bovenste kopcel colspan="2" scope="colgroup"; geef de onderste kopcellen scope="col". De overspanning bepaalt de breedte, terwijl scope de relatie met de kopcel aangeeft. Een toepassingsbereik voor een kolomgroep heeft een bijpassende kolomgroep in de tabelstructuur nodig.
Koppel kopcellen zo nodig expliciet
Voor relaties die scope niet duidelijk kan uitdrukken, geef je kopcellen unieke ID's en vermeld je die in het headers-attribuut van de gegevenscel:
<table>
<caption>Monday distance plan</caption>
<colgroup></colgroup>
<colgroup span="2"></colgroup>
<thead>
<tr>
<th rowspan="2" scope="col">Day</th>
<th id="distance" colspan="2" scope="colgroup">Distance (km)</th>
</tr>
<tr>
<th id="planned" scope="col">Planned</th>
<th id="actual" scope="col">Actual</th>
</tr>
</thead>
<tbody>
<tr>
<th id="mon" scope="row">Monday</th>
<td headers="mon distance planned">8</td>
<td headers="mon distance actual">7.5</td>
</tr>
</tbody>
</table>
De geplande waarde 8 verwijst naar Maandag, Afstand (km) en Gepland. De werkelijke waarde 7,5 deelt de rij- en groepskoppen, maar verwijst naar Werkelijk. De namen, gescheiden door spaties, moeten overeenkomen met de ID's van de kopcellen, niet met hun zichtbare tekst.
De abbr van een kopcel kan een kortere tekst bieden om te herhalen, zoals <th abbr="Distance">Distance covered in kilometers</th>. Sommige schermlezers gebruiken die kortere vorm. Als veel overspanningen of drie kopniveaus een tabel moeilijk te volgen maken, splits je de gegevens op in eenvoudigere tabellen met elk een eigen tabelbijschrift. Plaats liever geen tabel binnen een cel van een andere tabel.
Belangrijkste punten
- Tel bezette rasterposities, inclusief overspanningen uit eerdere rijen.
- Een colspan vervangt aangrenzende cellen; een rowspan bezet posities in latere rijen.
- Gebruik kolomgroepen met
scope="colgroup"voor gegroepeerde koppen. - De
headersvan een cel vermeldt de ID's van de bijbehorende kopcellen. - Kies liever eenvoudigere tabellen wanneer samenvoegingen en kopniveaus de relaties verhullen.
4Voeg media toe die mensen kunnen bekijken en beluisteren
Een speler is maar één onderdeel van bruikbare media. Bezoekers hebben ook een ondersteund bestand nodig, een manier om het te starten en te stoppen, en toegang tot de informatie wanneer geluid of beeld niet beschikbaar is. Bouw de speler vanuit het mediabestand op: reserveer ruimte, bied geschikte bronnen aan en koppel gecontroleerde ondertiteling of een transcript. Laadaanwijzingen en verstandige afspeelkeuzes helpen bezoekers ook om grip te houden op de tijd en gegevens die een video kost.
4.1 Spelers, afspelen en downloadkeuzes
<video> en <audio> koppelen mediabestanden aan een pagina. De browser downloadt die afzonderlijke bestanden; de video of het geluid wordt niet in de HTML opgeslagen. Door controls toe te voegen, maak je de afspeelknoppen, pauzeknop, tijdlijn en volumeregeling van de browser zichtbaar.
<video src="intro.mp4" controls width="640" height="360"
poster="intro-poster.jpg" preload="metadata"></video>
<audio src="episode-12.mp3" controls></audio>
Zonder afspeelbediening heeft een audio-element geen zichtbare speler en een video geen zichtbare afspeelknop. Een pagina heeft dan bediening met een script nodig om gebruikers die toegang te geven. Behoud voor een eenvoudige pagina de ingebouwde afspeelbediening.
Reserveer de juiste vorm
width en height accepteren gewone getallen in CSS-pixels. Ze reserveren ruimte terwijl een video laadt en verminderen zo het verspringen van de pagina. Een video van 1920 × 1080 die met een breedte van 640 wordt getoond, heeft een bijpassende hoogte van 360: de breedte is door drie gedeeld, dus de hoogte moet ook door drie worden gedeeld. Een anders gevormde spelersbox behoudt de verhoudingen van het beeld en voegt lege banden toe.
poster biedt een stilstaand beeld vóór het afspelen. Zonder posterafbeelding wacht de browser op mediagegevens voordat die het eerste beeld kan tonen. De posterafbeelding is nuttig wanneer weinig of geen video vooraf wordt geladen.
Bepaal hoeveel je vooraf laadt
| Waarde | Laadaanwijzing |
|---|---|
none | Laad de media niet vooraf |
metadata | Haal informatie op zoals de duur en afmetingen |
auto | De browser mag het hele bestand downloaden |
Dit zijn aanwijzingen: de browser mag ervan afwijken. Automatisch afspelen heeft ook voorrang op vooraf laden. none is nuttig voor lange media die veel bezoekers niet zullen bekijken; metadata helpt de duur te tonen zonder bewust de volledige video op te halen.
Begrijp de afspeelschakelaars
controls, autoplay, muted, loop en playsinline zijn booleaanse attributen. Hun aanwezigheid schakelt ze in: muted="false" start nog steeds met gedempt geluid. Verwijder het attribuut om het uit te schakelen.
Automatisch afspelen met geluid wordt vaak geblokkeerd totdat de gebruiker interactie heeft gehad, afhankelijk van de machtigingen en instellingen van de browser. Gedempte video wordt vaker toegestaan; Safari op de iPhone heeft voor dit gebruik ook playsinline nodig. Een geluidloze herhalende video kan autoplay muted loop playsinline gebruiken. loop start de video opnieuw na het einde. Vertrouw niet op automatisch afspelen om essentiële informatie over te brengen.
Automatisch geluid kan een schermlezer overstemmen en beweging kan afleiden. WCAG 2.2-criterium 1.4.2 (A) vereist een manier om automatische audio die langer dan drie seconden duurt te pauzeren of te stoppen, of het volume ervan onafhankelijk te regelen. Criterium 2.2.2 (A) gaat over automatisch bewegende inhoud die langer dan vijf seconden naast andere inhoud aanwezig is, tenzij de beweging essentieel is. Zorg voor een beschikbare pauzemogelijkheid; de ingebouwde afspeelbediening biedt die bij deze mediaspelers.
Schat het dataverbruik
Een video van twee minuten met 5 megabit per seconde bevat 600 megabit. Gedeeld door acht is dat ongeveer 75 megabyte vóór extra overhead. Kortere video's en een passende aanwijzing voor vooraf laden verminderen onnodige gegevensoverdracht. De iframe-speler van een gehost platform kan de levering van de server van je website naar een andere aanbieder verplaatsen, maar bezoekers downloaden de media nog steeds wanneer ze kijken.
Belangrijkste punten
- Behoud de ingebouwde afspeelbediening zodat bezoekers het afspelen kunnen starten, pauzeren en aanpassen.
- Gebruik numerieke breedte en hoogte om ruimte voor een video te reserveren.
- Vooraf laden is een aanwijzing; automatisch afspelen kan voorrang krijgen.
- Booleaanse attributen worden ingeschakeld door hun aanwezigheid.
- Houd rekening met beperkingen op automatisch afspelen en geef gebruikers controle over automatisch geluid of beweging.
- Een platformspeler verandert wie de media levert, maar de bezoeker moet die nog steeds downloaden.
4.2 Alternatieve bronnen en betrouwbare terugvalmogelijkheden
Een media-extensie geeft de container aan, de bestandsstructuur die beeld en geluid bevat. Codecs comprimeren en decoderen de stromen daarin. Een browser moet zowel de container als de codecs ondersteunen; een extensie .mp4 alleen zegt niet wat erin zit.
Kies geschikte formaten
MP4 met H.264-video en AAC-audio is een breed ondersteunde keuze op gangbare huidige systemen. WebM met VP9- of AV1-video en Opus-audio wordt ook breed ondersteund en kan bij een bepaalde kwaliteit de bestandsgrootte verkleinen. Voor audio is MP3 een breed ondersteunde keuze als je één formaat gebruikt. Ondersteuning hangt nog steeds af van de daadwerkelijke codec en het systeem van de gebruiker, dus test de bestanden zelf.
Bied bronnen in voorkeursvolgorde aan
<video controls width="640" height="360" poster="tour.jpg">
<source src="tour.webm" type="video/webm">
<source src="tour.mp4" type="video/mp4">
<p>Your browser cannot play this video.
<a href="tour.mp4">Download the tour video (MP4)</a>.
</p>
</video>
<p><a href="tour.mp4">Download the tour video (MP4)</a></p>
De browser probeert de onderliggende bronnen op volgorde en gebruikt de eerste die kan worden afgespeeld. Hier heeft WebM de voorkeur; MP4 biedt een alternatief als WebM niet kan worden afgespeeld. Laat src weg op de <video> zelf wanneer je onderliggende bronnen gebruikt. Een src op het media-element heeft voorrang en de lijst met onderliggende bronnen wordt genegeerd.
Het type is een MIME-type dat het bestand beschrijft. Daarmee kan de browser een niet-ondersteund formaat overslaan zonder eerst mediagegevens op te halen. Door een verkeerd type kan een afspeelbaar bestand worden overgeslagen, dus de declaratie moet overeenkomen met het daadwerkelijke bestand. Dezelfde niet-ondersteunde codering onder een andere naam vermelden levert geen ondersteund alternatief op.
Zet de terugvalmogelijkheid op een bereikbare plek
Inhoud binnen <video> is terugvalinhoud voor een browser die het video-element niet herkent. Een moderne browser die het wel herkent maar geen enkele bron kan afspelen, toont die binnenste alinea niet als algemene foutmelding. De afzonderlijke downloadlink buiten de speler blijft in dat geval beschikbaar. Een terugvallink en alternatieve bronnen lossen verschillende problemen op.
Pas hetzelfde patroon toe op audio
<audio controls>
<source src="episode-12.opus" type="audio/ogg; codecs=opus">
<source src="episode-12.mp3" type="audio/mpeg">
<p>Your browser cannot play this audio.</p>
</audio>
<p><a href="episode-12.mp3">Download episode 12 (MP3)</a></p>
Dit eerste bestand gebruikt een Ogg-container met Opus-audio. Het MP3-alternatief gebruikt audio/mpeg, het juiste MIME-type voor MP3. De browser kan niet uit de terugvalalinea afleiden dat die van bestand moet wisselen; source-elementen bieden die keuze. Controleer bij het nakijken van de pagina de paden, de daadwerkelijke bestandsformaten en het afspelen, en controleer daarna afzonderlijk of de externe downloadlink werkt.
Belangrijkste punten
- Voor afspelen is ondersteuning voor zowel de container als de codecs nodig.
- Onderliggende bronnen worden op volgorde geprobeerd wanneer het media-element geen
srcheeft. - Correcte MIME-typen helpen browsers een afspeelbare bron te kiezen.
- Zet een downloadlink buiten de speler voor bronfouten in moderne browsers.
4.3 Ondertiteling, transcripten en tijdnotatie in WebVTT
Mensen hebben een andere toegang tot informatie in media nodig als ze die niet kunnen horen of zien. Ondertiteling voor doven en slechthorenden bevat spraak, sprekers en betekenisvolle geluiden. Dialoogondertiteling schrijft of vertaalt de dialoog voor mensen die de audio horen maar hulp nodig hebben om die te begrijpen. Een transcript geeft spraak en belangrijke geluiden als tekst bij de speler of via een duidelijk benoemde link in de buurt. Audiodescriptie beschrijft belangrijke visuele informatie.
Koppel een ondertitelspoor
<video controls>
<source src="intro.mp4" type="video/mp4">
<track kind="captions" src="intro.en.vtt"
srclang="en" label="English" default>
</video>
<p><a href="intro-transcript.html">Read the introduction transcript</a></p>
Plaats <track> na de bronnen. src verwijst naar een tekstspoorbestand, kind geeft het doel aan, srclang de taal en label levert de menutekst van de speler. Een spoor met dialoogondertiteling moet srclang hebben; neem het ook op voor ondertiteling voor doven en slechthorenden. Slechts één spoor mag default hebben. Zonder kind is de standaardwaarde subtitles.
Schrijf het ondertitelbestand
WebVTT is UTF-8-tekst die wordt opgeslagen met de extensie .vtt. De eerste regel is WEBVTT, gevolgd door een lege regel. Elk tekstsegment heeft daarna een tijdregel en tekst, met een lege regel vóór het volgende segment. Een optionele identificatie kan vóór de tijdregel van een segment staan.
WEBVTT
00:00:01.000 --> 00:00:04.500
MAYA: Welcome to the workshop.
00:00:05.000 --> 00:00:07.250
[door closes]
00:00:07.500 --> 00:00:11.000
MAYA: Let's build our first form.
Het eerste tekstsegment duurt 3,5 seconden, het tweede 2,25 seconden en het derde 3,5 seconden. Het geluidssegment brengt iets over wat een luisteraar hoort, ook al spreekt er niemand.
Houd de tijdsyntaxis exact
Minuten en seconden gebruiken twee cijfers; milliseconden gebruiken er drie na een punt. Uren mogen worden weggelaten: 01:05.000 betekent één minuut en vijf seconden. Het einde moet later zijn dan het begin. Een lege regel beëindigt een tekstsegment, dus houd alle tekst ervan bij elkaar zonder lege regel ertussen.
SRT gebruikt tijdsaanduidingen met een komma, zoals 00:00:01,000; een spoor heeft in plaats daarvan WebVTT nodig. Voor de omzetting zijn de WebVTT-header en tijdsaanduidingen met punten nodig, en moet je de rest van de tekstsegmenten op geldige syntaxis controleren. Alleen de extensie .srt hernoemen zet de inhoud niet om.
Controleer levering en toegankelijkheid
Houd het spoor op dezelfde oorsprong als de pagina: hetzelfde URL-schema, dezelfde host en dezelfde poort. Een spoor van een andere oorsprong heeft een geschikte crossorigin-instelling op de video en toestemming van die server nodig. Anders kan een correct bestand toch niet laden.
WCAG 2.2-criterium 1.2.2 (A) vereist ondertiteling voor doven en slechthorenden bij vooraf opgenomen video met audio, behoudens de uitzondering voor media-alternatieven. Criterium 1.2.1 (A) vereist een alternatief voor vooraf opgenomen inhoud met alleen audio, zoals een transcript voor een podcast. Controleer automatische ondertiteling vóór publicatie op namen, vaktermen, wisselingen van spreker en geluiden.
Andere spoortypen zijn descriptions, chapters en metadata. Browserspelers tonen die doorgaans niet als gewone ondertiteling. Zet essentiële zichtbare instructies niet in een metadataspoor in de verwachting dat ze op het scherm verschijnen.
Belangrijkste punten
- Ondertiteling voor doven en slechthorenden bevat betekenisvolle geluiden en informatie over sprekers; dialoogondertiteling richt zich op de dialoog.
- Koppel een
.vtt-bestand mettracken geef het doel en de taal aan. - Een WebVTT-tekstsegment heeft geldige tijdsaanduidingen met punten, tekst en een afsluitende lege regel nodig.
- Controleer of ondertiteling klopt en bied in de buurt toegang tot een transcript.
- Sporen van een andere oorsprong hebben zowel browserinstellingen als toestemming van de server nodig.
5Sluit een andere pagina zorgvuldig in
Een iframe geeft een andere webpagina een venster binnen je eigen pagina. Die pagina brengt eigen code, machtigingen en laadgedrag mee en is afhankelijk van de aanbieder. Geef het venster een bruikbare naam en afmeting en kies vervolgens wanneer het laadt en wat het mag doen. Als je begrijpt dat een inbedding een afzonderlijk document is, helpt dat om geblokkeerde frames, privacykeuzes en het feit dat de stijlen van je pagina niet doordringen tot de speler van een andere website te verklaren.
5.1 Een frame met titel en een bruikbare terugvallink
Een <iframe> is een inlineframe: het toont een afzonderlijke webpagina binnen de huidige pagina. Dat document heeft eigen HTML, CSS en scripts. De stijlen van je pagina kunnen de afmetingen van het frame bepalen, maar geven de inhoud van een ander document daarin niet vorm.
Begin met een duidelijk frame met afmetingen
<iframe src="https://maps.example.com/venue"
title="Map of the venue"
width="600" height="400" loading="lazy"></iframe>
<p><a href="https://maps.example.com/venue">Open the venue map</a></p>
src geeft de te laden pagina aan. De titel vertelt een schermlezergebruiker wat er in het frame staat voordat die het binnengaat. “Kaart van de locatie” beschrijft het doel; “iframe” of “inhoud” niet. De directe link biedt een andere route als de browser van de bezoeker het frame blokkeert.
width en height accepteren gewone getallen in CSS-pixels. Zonder deze attributen is het standaardframe 300 × 150 CSS-pixels. Browsers tekenen ook een standaardrand. Geef die vorm met CSS in plaats van met het verouderde attribuut frameborder.
Pas aangeboden inbedcode aan
Kaart- en videodiensten bieden meestal een inbedfragment aan bij hun deelknoppen. Inspecteer na het plakken de URL, verbeter de titel, controleer de afmetingen en verwijder verouderde opmaakattributen. Een iframe-URL is het adres van een pagina of speler van een dienst, niet per se van een rechtstreeks mediabestand.
Gebruik HTTPS voor het ingesloten adres. Een HTTP-frame binnen een HTTPS-pagina is actieve gemengde inhoud en wordt geblokkeerd. Alleen een titel schrijven of de afmetingen van het frame veranderen kan een onveilige URL niet laten laden.
Laad op een geschikt moment
loading="lazy" stelt het laden van een frame uit totdat het dicht bij de viewport is. Dat bespaart werk bij het openen van de pagina voor bijvoorbeeld een kaart ver onderaan. De standaardwaarde eager begint direct met laden. Gebruik direct laden voor een prominente inbedding bovenaan, zodat bezoekers niet op de hoofdinhoud hoeven te wachten. Uitgesteld laden verandert het tijdstip; het neemt het netwerkcontact niet weg wanneer het frame uiteindelijk laadt.
Om een speler in de container te laten passen, kan CSS de breedte op 100% zetten en de vorm behouden:
iframe.video-player {
width: 100%;
height: auto;
aspect-ratio: 16 / 9;
border: 0;
}
Pas class="video-player" toe op het betreffende iframe. De HTML-afmetingen bieden nog steeds begininformatie, terwijl CSS de weergegeven grootte bepaalt.
Herken een weigering van een aanbieder
Een website kan inbedding verbieden via de HTTP-antwoordheader X-Frame-Options of een Content Security Policy-regel frame-ancestors. De browser kan een leeg frame of een fout tonen. Deze beperkingen helpen clickjacking te voorkomen, waarbij een misleidende ingesloten pagina klikken opvangt die voor iets anders waren bedoeld.
De HTML van je pagina kan de weigering van de andere website niet opheffen. Gebruik het toegestane inbedadres van de aanbieder als die er een biedt; geef anders een gewone link. Behoud die link ook voor toekomstige problemen: als een aanbieder inhoud verwijdert of verplaatst, kan een ongewijzigd iframe op je pagina stoppen met werken.
Belangrijkste punten
- Een iframe bevat een afzonderlijk document met eigen stijlen en scripts.
- Geef elk frame een beschrijvende titel en zinvolle afmetingen.
- Gebruik uitgesteld laden voor inbeddingen buiten beeld en gebruik HTTPS-URL's.
- Een aanbieder kan inbedding weigeren; bied dan een directe link aan.
5.2 Machtigingen, privacy en elementkeuze
Een inbedding van een derde partij neemt contact op met de aanbieder wanneer de ingesloten inhoud laadt, zelfs voordat een bezoeker op afspelen drukt. Dat verzoek onthult informatie zoals een IP-adres en kan cookies gebruiken. Bepaal of de pagina dat contact direct nodig heeft en welke toegang het ingesloten document nodig heeft.
Stel contact uit wanneer dat passend is
Uitgesteld laden stelt een frame buiten beeld uit totdat het bijna op het scherm verschijnt. Een voorbeeld dat een inbedding pas na een klik laadt, geeft bezoekers een directere keuze. Sommige diensten bieden ook modi met verbeterde privacy. Een frame van dezelfde website neemt niet vanzelf contact op met een andere aanbieder; rechtstreeks opgenomen srcdoc voorkomt het ophalen van een afzonderlijke pagina, al kunnen bronnen waarnaar die HTML verwijst nog steeds netwerkverzoeken doen.
Beperk documentgedrag met sandbox
<iframe src="https://quiz.example.com/start"
title="Practice quiz"
sandbox="allow-scripts allow-forms"></iframe>
Een lege sandbox past alle beperkingen toe, waaronder het blokkeren van scripts, formulierverzending en pop-ups, en kent een ondoorzichtige oorsprong toe. Tokens heffen geselecteerde beperkingen op. Hier mag de quiz scripts uitvoeren en formulieren verzenden, maar allow-popups is niet toegekend. Voeg alleen tokens toe die de inhoud nodig heeft; anders kan een gekopieerde lijst met machtigingen nuttige beperkingen ongedaan maken.
allow-same-origin laat het document zijn normale oorsprong behouden. Combineer dit niet met allow-scripts voor ingesloten inhoud van je eigen oorsprong: door die combinatie kan het document mogelijk zijn sandbox verwijderen. Een sandbox betekent ook niet dat een frame geen netwerkverzoeken doet.
Verleen browserfuncties afzonderlijk
allow is een machtigingenbeleid voor functies zoals volledig scherm, beeld-in-beeld, camera en microfoon. Een videospeler kan allow="fullscreen; picture-in-picture" vragen. Die heeft geen cameratoegang nodig alleen omdat de speler video bevat. Het oudere allowfullscreen verleent ook toegang tot volledig scherm.
Sandbox-tokens regelen het gedrag van het document; functiemachtigingen beantwoorden een andere vraag. Toegang tot volledig scherm verlenen laat een pagina in een sandbox niet vanzelf een formulier verzenden of een script uitvoeren.
Beheer het verwijzende adres en rechtstreeks opgenomen inhoud
referrerpolicy="no-referrer" laat het adres van de verwijzende pagina weg uit het verzoek. Bij het gebruikelijke standaardbeleid verstuurt een HTTPS-verzoek naar een andere oorsprong de oorsprong in plaats van het volledige pad; verzoeken naar een minder veilige verbinding versturen geen verwijzend adres. Dit regelt één header, niet alle informatie die een aanbieder ontvangt.
srcdoc levert de HTML van het frame rechtstreeks aan en heeft voorrang op src:
<iframe title="Message preview" sandbox
srcdoc="<p>Preview of your message</p>"></iframe>
De sandbox houdt dit kleine voorbeeld beperkt. Bij algemenere HTML-voorbeelden moet je zorgvuldig omgaan met de bronnen en opmaakcode die je toestaat.
Kies het element voor de bron
| Bron | Element |
|---|---|
| Afbeelding | img |
| Audio- of videobestand | audio of video |
| Een webpagina, kaart of speler van een dienst | iframe |
| Extern document zoals een pdf | object of embed |
<object> kan terugvalinhoud bevatten, zoals een downloadlink, als de bron niet kan worden weergegeven. Oude plug-ininhoud zoals Flash werkt niet meer in gewone huidige browsers; Adobe beëindigde de ondersteuning voor Flash Player eind 2020. Zet directe links naast belangrijke inbeddingen en controleer regelmatig of de aanbieder ze nog beschikbaar stelt.
Belangrijkste punten
- Bij het laden van inhoud van derden wordt al vóór het afspelen contact opgenomen met de aanbieder.
- Een sandbox begint met beperkingen; tokens herstellen geselecteerde mogelijkheden.
- Houd
allow-scriptsenallow-same-origingescheiden voor inhoud van dezelfde oorsprong. - Gebruik
allowvoor benodigde browserfuncties en het verwijzingsbeleid voor het verwijzende adres. - Kies media-elementen voor mediabestanden en iframes voor afzonderlijke pagina's.
Webformulieren, tabellen en media: voorbeelden
1Maak een aanmeldformulier voor een workshop
20 stappen
- 1IntroductieBegin bij de antwoorden die je nodig hebt
Voor een workshopaanmelding zijn een naam, contactgegevens, één sessiekeuze, optionele interesses en een bericht nodig. Elk antwoord heeft een passend bedieningselement en een label nodig.
Bouw het formulier in lagen op: bepaal waar het gegevens naartoe stuurt, kies de bedieningselementen en koppel daarna labels en instructies. Je controleert zowel wat een bezoeker kan invoeren als wat het ontvangende programma bereikt.
- 2UitlegKies een bestemming en methode
Gebruik
<form action="/registrations" method="post">om een aanmelding naar de ontvangende URL te versturen. POST zet de antwoorden in de berichtinhoud van het verzoek en past bij een verzending waarmee opgeslagen gegevens worden aangemaakt.De verbinding heeft nog steeds HTTPS nodig voor versleuteling. Een methode maakt de informatie op zichzelf niet privé en de HTML slaat de aanmelding niet op; dat doet het ontvangende programma.
- 3VoorbeeldGeef het antwoord een gegevenssleutel
Begin met
<input id="attendee" name="attendee">. Als de bezoeker “Nora” invoert, stuurt het bedieningselementattendee=Noramee.De
namevertelt het ontvangende programma om welk antwoord het gaat. Deididentificeert het veld op de pagina. Als je de naam verwijdert, kan een veld overblijven dat lijkt te werken maar niets met de verzending meestuurt. Een later label wordt via de id gekoppeld. - 4UitdagingVoorspel welke velden worden verstuurd
Een formulier heeft
<input name="guest" value="Nora">,<input name="notes" value="">en een niet-aangevinkt selectievakje met de naamupdates. Welke velden sturen gegevens mee?---reveal---
De tekstinvoervelden sturen
guest=Noraennotes=mee. Het niet-aangevinkte selectievakje stuurt geen paar mee. Een lege tekstwaarde verschilt van een weggelaten selectievakje: het ene benoemt een veld zonder tekst; het andere ontbreekt in de verzonden gegevens. - 5TipMaak verzending een bewuste keuze
Voeg
<button type="submit">Register</button>toe. Een knop binnen een formulier verzendt standaard het formulier, dus een expliciet type maakt de bedoeling duidelijk.Als je later een knop voor een actie met een script toevoegt, gebruik dan
type="button". Een resetknop herstelt de beginwaarden en kan alle invoer van de bezoeker wissen. Ook een druk op Enter in een veld met één regel kan verzending starten, dus het formulier moet werken zonder afhankelijk te zijn van een muisklik. - 6UitlegKies invoertypen voor contactgegevens
Gebruik
type="email"voor het e-mailadres entype="tel"voor een optioneel telefoonnummer. Deze typen sturen de keuze van het telefoontoetsenbord, maar hun controles verschillen.Email controleert de syntaxis, niet of de mailbox bestaat. Tel legt geen telefoonformaat op. Een wachtwoordveld verbergt tekens op het scherm, maar heeft tijdens verzending nog steeds HTTPS nodig. Kies typen voor de informatie die ze vertegenwoordigen, niet alleen voor het gewenste toetsenbord.
- 7VoorbeeldHoud codes als tekst
Stel dat de workshop leden een cijfercode stuurt. Gebruik daarvoor
type="text" inputmode="numeric". De aanwijzing voor een numeriek toetsenbord maakt cijfers gemakkelijk in te voeren zonder de code in een hoeveelheid te veranderen.Een
number-invoerveld kan pijltjesknoppen en gedrag voor hoeveelheden bieden, die ongeschikt zijn voor een identificatiecode.inputmodezelf controleert niets; een vast codeformaat kan een afzonderlijke validatieregel krijgen. - 8UitlegMaak een groep keuzerondjes voor één sessie
Bied drie sessies aan met keuzerondjes die allemaal
name="session"gebruiken. Geef ze waarden zoalsmorning,afternoonenevening.Als je het rondje voor de middag kiest, wordt
session=afternoonmeegestuurd en vervalt de vorige keuze in die groep. Bij verschillende namen kunnen meerdere sessies geselecteerd blijven. Gebruik afzonderlijke selectievakjes voor onafhankelijke interesses, omdat bezoekers er mogelijk meer dan één willen kiezen. - 9UitdagingHerstel een groep voor één keuze
Twee keuzerondjes voor sessies gebruiken
name="morning" value="morning"enname="afternoon" value="afternoon". Een bezoeker kan beide selecteren. Welke wijziging maakt er één groep van?---reveal---
Geef beide dezelfde naam, zoals
name="session", en behoud hun verschillende waarden. Gedeelde namen vormen de groep; verschillende waarden identificeren de gekozen sessie. Alleen hun id's gelijk maken zou dubbele identificaties op de pagina opleveren zonder de groepering te herstellen. - 10KernpuntMaak onderscheid tussen een weergegeven datum en de waarde
Een datumkiezer kan dezelfde dag op verschillende apparaten in een andere volgorde tonen. Een invoerveld van het type
dateverstuurt nog steeds een vaste waarde in de volgorde jaar-maand-dag, zoals2026-11-18.De weergave volgt de regionale instellingen van de bezoeker; het verzoek kopieert die weergavetekst niet. Datum- en tijdinvoervelden geven geen tijdzone mee. Een afspraak heeft daarom voldoende zichtbare context nodig, zodat de bezoeker weet van welke locatie de tijd wordt bedoeld.
- 11VoorbeeldBied een verplichte vaste keuze aan
Een lange lijst met workshoplocaties past bij een select. Geef die een lege eerste optie, zoals
<option value="">Choose a location</option>, en voegrequiredtoe aan de select.Elke echte optie heeft een eigen verzonden waarde. Als je
<option value="studio">Main studio</option>kiest, wordt het vaste sleutel-waardepaarlocation=studioverstuurd wanneer de selectlocationheet. Het zichtbare label kan beschrijvend blijven. - 12VoorbeeldLaat ruimte voor een bericht
Voeg
<textarea id="message" name="message" rows="5"></textarea>toe voor een langer antwoord. Begintekst hoort tussen de tags; de aangrenzende tags houden de beginwaarde hier leeg.Rows bepaalt de zichtbare hoogte, niet de maximale lengte van het antwoord. Een datalist heeft een andere taak: koppel die via de
listvan een invoerveld om suggesties te bieden terwijl andere antwoorden mogelijk blijven. Die kan de vaste keuzes van de select niet afdwingen. - 13UitdagingKies tussen suggesties en vaste antwoorden
De workshop staat alleen de genoemde locaties toe, maar iemand vervangt de select door een tekstinvoerveld dat aan een datalist is gekoppeld. Kan de bezoeker nu een niet-vermelde locatie typen?
---reveal---
Ja. Een datalist biedt suggesties zonder het antwoord te beperken. Behoud een select als precies de aangeboden keuzes zijn toegestaan. Gebruik een datalist wanneer een ander antwoord mogelijk moet blijven, zoals een stad die niet bij de gebruikelijke suggesties staat.
- 14VerbandToon de status zonder een antwoord te verzamelen
Een voortgangsbalk kan tonen hoever de verwerking van een aanmelding is gevorderd. Een meetindicator kan een meting binnen een bekend bereik tonen, zoals opslaggebruik.
Geen van beide is een invoerelement voor antwoorden. Gebruik
<progress value="70" max="100">70%</progress>voor de voltooiing van een taak en geef er verklarende tekst bij. Gebruik voor een groep onafhankelijke optionele interesses selectievakjes, zodat bezoekers hun keuzes daadwerkelijk kunnen wijzigen en versturen. - 15VoorbeeldKoppel een zichtbaar label
Schrijf
<label for="attendee">Name (required)</label>naast het invoerveld metid="attendee". De waarde van for moet exact overeenkomen met de id, inclusief hoofdletters en kleine letters.Als je op het label klikt, moet het invoerveld focus krijgen. Houd het label zichtbaar tijdens het typen; een plaatsaanduiding kan die taak niet vervullen. De tekst die aangeeft dat het veld verplicht is, vertelt de gebruiker wat wordt verwacht, terwijl het required-attribuut de browser laat controleren of er invoer is.
- 16UitlegGeef de keuzes een gezamenlijke vraag
Plaats de keuzerondjes voor sessies in een fieldset waarvan het eerste kindelement
<legend>Session</legend>is. Behoud een afzonderlijk label voor elke optie.Het groepsbijschrift legt de gezamenlijke vraag uit; de labels benoemen de antwoorden. Voor contactvelden helpen correcte autocomplete-waarden zoals
name,emailentelde browser om opgeslagen gegevens aan te bieden. Een formaattoelichting in de buurt kan viaaria-describedbyaan de id van de toelichting worden gekoppeld. - 17UitdagingZoek de verbroken labelkoppeling
De opmaakcode bevat
<label for="contact">Email</label>en<input id="email" name="contact" type="email">. Waarom krijgt dat invoerveld geen focus als je op het label klikt?---reveal---
De waarde van for komt overeen met de name maar niet met de id. Verander die in
for="email"of kies een nieuwe overeenkomende unieke id. De name dient al voor verzending, dus als je de labelkoppeling verandert, hoef je de gegevenssleutel die het ontvangende programma verwacht niet te veranderen. - 18TipVoeg een upload alleen met de bijbehorende codering toe
Als voor de aanmelding een document nodig is, voeg je een
type="file"-invoerveld met een naam toe en stel jeenctype="multipart/form-data"in op het POST-formulier. Deze codering verstuurt de inhoud van het bestand.Een accept-filter kan helpen bij de bestandskeuze, maar bepaalt niet wat de server ontvangt. Onthoud ook dat uitgeschakelde bedieningselementen worden weggelaten, terwijl ondersteunde alleen-lezenvelden worden verzonden. Gebruik het attribuut dat past bij het gewenste gedrag van de gegevens.
- 19UitdagingControleer het voltooide formulier
Een locatieveld met label biedt alleen suggesties via een datalist en het e-mailveld heeft een id maar geen name. De bezoeker moet een vermelde locatie kiezen en de server heeft het e-mailadres nodig. Welke twee reparaties zijn nodig?
---reveal---
Gebruik een select voor de vaste locatiekeuzes en voeg een name toe aan het e-mailveld. De select bepaalt welke keuzes worden aangeboden; de name geeft het e-mailadres een sleutel bij verzending. Een zichtbaar label alleen lost geen van beide problemen op.
- 20SamenvattingLees het formulier in twee richtingen
Controleer vanuit de bezoeker het type bedieningselement, het zichtbare label, de gezamenlijke vraag en de instructies. Controleer vanuit de server de bestemming, methode, namen en meegestuurde waarden.
Klik daarna op elk label en ga met Tab door het formulier. Deze controles vinden verschillende fouten: een formulier kan gemakkelijk in te vullen zijn maar gegevens weglaten, of correcte gegevens versturen terwijl het moeilijk te begrijpen is.
2Debug de validatieregels van een formulier
15 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieVolg de controles die verzending blokkeren
- 2UitlegMaak een schermnaam verplicht
- 3VoorbeeldTest aanwezigheid en lengte afzonderlijk
- 4UitdagingMaak het veld optioneel
- 5TipTest gebruikersinvoer, niet alleen de standaardwaarde
- 6VoorbeeldControleer eerst het bereik
- 7VoorbeeldTel vanaf de werkelijke basis
- 8UitdagingMaak onderscheid tussen stap en maximum
- 9VerbandLees tijdstappen in seconden
- 10UitlegControleer de vaste code van de organisatie
- 11UitdagingZoek een genegeerd patroon
- 12TipLeg de fout uit en maak die zichtbaar
- 13KernpuntEen gebruiksvriendelijke controle is geen vertrouwensgrens
- 14UitdagingOnderzoek verschillende fouten
- 15SamenvattingGebruik een korte lijst met grenstests
3Maak en controleer een sessierooster
11 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductiePlan de tabel vóór de tags
- 2UitlegGeef de tabel en kolommen een naam
- 3VoorbeeldSchrijf één volledige gegevensrij
- 4UitdagingHerstel een kop die alleen visueel is
- 5TipHoud de betekenis van lege cellen duidelijk
- 6VoorbeeldLaat één sessie twee rijen duren
- 7UitdagingTel een rij onder een rowspan
- 8VoorbeeldLaat de lunch beide zalen beslaan
- 9UitlegKoppel een cel aan kopcellen op meerdere niveaus
- 10UitdagingHerstel uitlijning en betekenis samen
- 11SamenvattingVolg een waarde door de tabel
4Publiceer een korte video met ondertiteling
17 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductiePubliceer zowel de informatie als het bestand
- 2VoorbeeldReserveer ruimte voor een speler met afspeelbediening
- 3UitlegGebruik een laadaanwijzing bewust
- 4UitdagingSchakel een booleaanse instelling uit
- 5TipLaat mensen automatisch afspelende media pauzeren
- 6UitlegControleer container en codecs
- 7VoorbeeldVoeg de voorkeursbron eerst toe
- 8UitdagingZoek de ongebruikte alternatieven
- 9KernpuntHoud een terugvalmogelijkheid buiten de speler
- 10UitlegKies ondertiteling voor geluidsinformatie
- 11VoorbeeldSchrijf het eerste tekstsegment
- 12VoorbeeldVoeg een betekenisvol geluidssegment toe
- 13VoorbeeldKoppel het bestand na de bronnen
- 14UitdagingZet een tijdsaanduiding correct om
- 15TipTest het spoor en het transcript
- 16UitdagingHerstel twee afzonderlijke toegankelijkheidsproblemen
- 17SamenvattingControleer de volledige mediaroute
5Beoordeel een ingesloten kaart en quiz
12 stappen
Sla deze les op om elke Walkthrough stap voor stap te volgen.
- 1IntroductieBehandel een inbedding als een ander document
- 2VoorbeeldGeef de kaart een naam voordat je die laadt
- 3UitlegStel het laden van een kaart onder de hoofdinhoud uit
- 4TipInspecteer gekopieerde inbedcode
- 5UitdagingHerken een inbeddingsregel van een server
- 6UitlegBegin de quiz met beperkingen
- 7KernpuntHoud oorsprong en scripts onder controle
- 8UitdagingGeef de quiz alleen wat die nodig heeft
- 9VerbandMaak onderscheid tussen privacy en een verwijzingsheader
- 10UitlegKies een element voor de werkelijke bron
- 11UitdagingBeoordeel een gewijzigde inbedding
- 12SamenvattingBeoordeel het frame als een kleine afhankelijkheid
Webformulieren, tabellen en media: oefenvragen
Set 1: Verzamel en verstuur de juiste antwoorden10 Oefenvragen
Vraag 1 van 10
id="visitor" maar geen name. Waarom ontbreekt de tekst in de verzonden formuliergegevens?Toon antwoordVerberg antwoord
name-attribuut nodig. De id identificeert het element op de pagina en kan een label koppelen, maar levert geen sleutel voor verzending. Als je het verzoek van GET naar POST verandert, stuurt dit naamloze bedieningselement de tekst nog steeds niet mee.Vraag 2 van 10
Toon antwoordVerberg antwoord
Vraag 3 van 10
for="address"; het e-mailveld gebruikt id="email" name="address". Welke ene wijziging koppelt dit label zonder de verzonden gegevenssleutel te veranderen?Toon antwoordVerberg antwoord
for="email" maakt de ontbrekende overeenkomst. De name kan address blijven, zodat de sleutel die het ontvangende programma verwacht behouden blijft. Alleen de name veranderen zou het label naar een id laten verwijzen die nog steeds niet bestaat.Vraag 4 van 10
<option value="">Choose delivery</option>. Wat gebeurt er als de gebruiker verzendt zonder een andere optie te kiezen?Toon antwoordVerberg antwoord
Vraag 5 van 10
/lookup en bevat een tekstinvoerveld name="term" met “css grid”, een niet-aangevinkt selectievakje name="archived" value="yes" en een uitgeschakeld invoerveld name="region" value="east". Welke verzoek-URL ontstaat?Toon antwoordVerberg antwoord
+ wordt gecodeerd. Het niet-aangevinkte selectievakje en het uitgeschakelde invoerveld worden beide weggelaten, zodat alleen term=css+grid overblijft. Een uitgeschakelde waarde wordt niet verstuurd alleen omdat die in de HTML staat en een niet-aangevinkt vakje maakt niet automatisch een waarde no.Vraag 6 van 10
online en onsite. Hoe moet de groepering veranderen?Toon antwoordVerberg antwoord
attendance, en verschillende waarden die de twee vormen aanduiden. Required bepaalt of een groep een selectie nodig heeft; het voegt keuzerondjes met verschillende namen niet samen tot één groep.Vraag 7 van 10
Toon antwoordVerberg antwoord
Vraag 8 van 10
minlength="5". Wat gebeurt er bij de lengtecontrole als de gebruiker het leeg laat?Toon antwoordVerberg antwoord
Vraag 9 van 10
Toon antwoordVerberg antwoord
enctype="multipart/form-data" nodig, terwijl een hulpknop die niet verzendt type="button" nodig heeft. Dit herstelt afzonderlijke gedragingen. POST met de standaardcodering verstuurt de bestandsinhoud nog steeds niet en als het type van de hulpknop ontbreekt, behoudt die binnen een formulier het normale verzendgedrag.Vraag 10 van 10
required="false" minlength="3". De maker wil het optioneel maken, waarbij elk ingevoerd antwoord minstens drie tekens lang moet zijn. Wat moet veranderen?Toon antwoordVerberg antwoord
Set 2: Controleer bereiken, patronen en tabelstructuur10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
step="300" op een invoerveld van het type time?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
min="2" max="14" step="4". Welke ingevoerde waarde voldoet aan al deze beperkingen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
min="08:20" max="10:20" step="1200". Hoeveel niet-lege tijdwaarden voldoen aan deze instellingen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
pattern="[A-Z]{2}-[0-9]{3}". Welke ingevoerde code wordt geaccepteerd?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
"[". Een gebruiker voert “ravi” in. Wat gebeurt er bij normale verzending?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
<tr><th scope="row">B</th><td>18</td></tr> en moet een niet-beschikbare massa en een tijd van 18 minuten tonen. Hoe moet de rij worden hersteld?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
muted="false". De maker wil de oorspronkelijke instelling voor gedempt geluid uitschakelen. Welke wijziging doet dat?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 3: Maak media en ingesloten pagina's bruikbaar10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
src="preview.mp4". Waarom bepaalt de volgorde van de onderliggende bronnen niet wat wordt afgespeeld?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
00:00:12.250 tot 00:00:16.000. Hoelang is dat tekstsegment zichtbaar?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
rows="4" cols="35" en geen lengteattributen. Waarom kan een bezoeker meer dan 140 tekens typen?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Set 4: Debug gecombineerde HTML-problemen10 Oefenvragen
Sla deze les op om elk antwoord te zien en elke set te oefenen.
Vraag 1 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 2 van 10
value="0.25", geen min en geen step-attribuut. De gebruiker vervangt de waarde. Welke invoer voldoet aan de standaardstapregel?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 3 van 10
[A-Z]{2}[0-9]{2}. Normale validatie is ingeschakeld voor het formulier. De verzendknop “Concept opslaan” heeft formnovalidate, terwijl “Verzenden” dat niet heeft. De code is “xy8”. Wat gebeurt er bij elke knop?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 4 van 10
r, planned en actual. Welke opmaakcode past bij de tweede rij?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 5 van 10
name="member" value="K8" readonly, een leeg tekstveld met de naam note en een niet-aangevinkt selectievakje met de naam copy. Het verzoek gebruikt HTTPS. Welk gegevensgedrag moet het ontvangende programma verwachten?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 6 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 7 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 8 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 9 van 10
2.4. Welke eenheid hoort bij die waarde?Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Vraag 10 van 10
Toon antwoordVerberg antwoord
Sla deze les op om dit antwoord te zien.
Kom je niet uit je eigen opgave? Huiswerkhulp
Kernbegrippen
A
action-attribuut
action="/messages" gaat een bericht naar het adres van de website dat berichten ontvangt.afwijking van de stapgrootte
audiodescriptie
automatisch aanvullen
autocomplete="tel" zodat de browser het opgeslagen telefoonnummer van de gebruiker kan voorstellen.automatisch afspelen
B
beeldverhouding
booleaans attribuut
required="false" is nog steeds verplicht, dus het attribuut moet worden verwijderd om het optioneel te maken.C
clickjacking
codec
D
dialoogondertiteling
F
formulier
functiemachtiging
G
gegevenscel
gegevenstabel
gemengde inhoud
GET
getimed tekstsegment
00:00:01.000 --> 00:00:04.500 toont een tekstsegment gedurende drieënhalve seconde.groep keuzerondjes
name="speed" en verschillende waarden om één selectie mogelijk te maken.groepsbijschrift
H
headers-attribuut
headers="mon distance planned" verwijst naar drie koppen die samen de waarde verklaren.I
inbeddingsbeperking
ingebouwde afspeelbediening
controls toevoegt.inlineframe
inlineframedocument
srcdoc="<p>Preview of your message</p>" zonder een afzonderlijke HTML-pagina op te halen.invoermodus
inputmode="numeric" om cijferinvoer op een telefoon gemakkelijker te maken.invoertype
type="date" een kiezer in plaats van een onbeperkt tekstveld met één regel.K
keuzelijst
express verstuurt.kolomgroep
kolomoverspanning
colspan="2" beide kolommen naast de afzonderlijke tijdkop van de rij.kopcel
kwantor
[0-9]{4} vereist de kwantor vier cijfers, zodat drie cijfers de verwachte code niet voltooien.L
label
id overeenkomt met het for-attribuut van het label.lokale datum en tijd
2026-07-09T10:30 versturen; de locatie moet eventuele benodigde tijdzonecontext bieden.M
maximum
max="2026-08-31" staat 31 augustus toe maar wijst een later ingevoerde datum af.maximumlengte
maxlength="12" accepteert tijdens het typen geen dertiende gewoon Latijns teken.mediacontainer
meerdelige formuliergegevens
enctype="multipart/form-data" in zodat de bytes van het geselecteerde document kunnen worden verstuurd.meetindicator
value="0.6" en het standaardbereik toont een meting op 60% van dat bereik.MIME-type
type="audio/mpeg", zodat de browser het bedoelde audioformaat kan herkennen.minimum
min="0.5" step="0.5" mag een pakket 0,5 kg wegen en beginnen de volgende stappen bij die waarde.minimumlengte
minlength="4" mag worden weggelaten, maar een opgegeven bijnaam van twee letters wordt afgewezen.N
naam-waardepaar
delivery=express opleveren, ook als het zichtbare label “Expressbezorging” is.O
omzeiling van validatie
formnovalidate gebruiken terwijl de gewone knop “Verzenden” blijft controleren.ondertiteling voor doven en slechthorenden
oorsprong
optiegroep
P
pattern-attribuut
POST
posterafbeelding
R
reguliere expressie
[A-Z]{3} accepteert precies drie standaardhoofdletters uit het Latijnse alfabet wanneer die als patroon voor de volledige waarde wordt gebruikt.required-attribuut
required heeft.rijgroep
tfoot na de gegevensrijen.rijoverspanning
rowspan="2" laat de positie voor maandag in de volgende rij al bezet.S
sandbox
schuifregelaar
min="0" max="10" gebruiken wanneer een instelling bij benadering nuttiger is dan exacte invoer.selectievakje
source-element
stapbasis
min="1" step="2" staat 1, 3 en 5 toe, zodat een invoer van 4 binnen het bereik wordt afgewezen.stapgrootte
step="900" gebruikt stappen van 15 minuten omdat tijdstappen in seconden worden gemeten.suggestielijst
T
tabelbijschrift
tekstgebied
rows="5" in voor de zichtbare hoogte, terwijl maxlength de ingevoerde tekst afzonderlijk beperkt.tekstspoor
terugvalinhoud
terugvalinhoud van een object-element
toegankelijke naam
toelichting via aria-describedby
id legt vóór verzending van het formulier uit: “Gebruik minimaal 8 tekens”.toepassingsbereik van een kopcel
scope="row", terwijl de afstandskop scope="col" gebruikt voor de waarden eronder.transcript
U
uitgesteld laden
loading="lazy", terwijl de hoofdinhoud bovenaan de pagina snel laadt.V
validatie op de server
validatie van invoerbeperkingen
validatiestatus
:user-invalid kan foutopmaak uitstellen totdat de gebruiker met het bedieningselement heeft gewerkt.veldengroep
verkorte koptekst
abbr="Distance" bieden voor een kortere herhaling.verwijzingsbeleid
referrerpolicy="no-referrer" neemt nog steeds contact op met de aanbieder maar verstuurt geen adres van de verwijzende pagina.vooraf laden
preload="none" om de media niet vooraf op te vragen wanneer veel bezoekers de video mogelijk overslaan.voortgangsindicator
W
WebVTT
intro.en.vtt, waarvan de tijdsaanduidingen punten vóór de millisecondecijfers gebruiken.Over deze les
Door StudeliFout melden
Maak je eigen Studiemateriaal
Maak van je aantekeningen, slides en documenten Leermodules, Oefenvragen, Flashcards en 6 andere tools.