← Område 2 Guide · HTML Felsökning

Webbutveckling 1 · område 2 · guide

HTML – innehåll och struktur

Områdets uppslagsbok. Allt från lektion 10 till 14 står här, i den ordning det gås igenom. Var du borta en lektion är det hit du går, och slår du i den under ett arbetspass hittar du rätt genom innehållsförteckningen eller sökrutan i felsökningen.

Exemplen är hämtade ur områdets förlaga, sajten om Vikstads naturreservat, som du får se på lektionerna. Kraven guiden stödjer står i Projekt 1.

Vad du kan efter guiden

Så hänger avsnitten ihop med lektionerna

Avsnitt 1–2 hör till måndag 7/9, avsnitt 3–5 till tisdag 8/9, 6–7 till fredag 11/9, 8–9 till måndag 14/9 och avsnitt 10 till tisdag 15/9.

1. Dokumentets grund

Element, tagg och attribut

Tre ord som används om vartannat men betyder olika saker.

En tagg är det som står mellan vinkelparenteser: <p> är en starttagg och </p> är en sluttagg. Ett element är starttaggen, innehållet och sluttaggen tillsammans. Ett attribut står inne i starttaggen och säger något extra om elementet.

<a href="stigar.html">Stigarna</a>

Här är a elementet, <a ...> och </a> är taggarna, href är ett attribut och stigar.html är attributets värde. Attributvärden skrivs inom citattecken.

Några element har inget innehåll och därför ingen sluttagg. img, meta, link, br och hr är de du kommer att möta. Det finns inget </img>.

Dokumentets fyra delar

Varje HTML-sida du skriver i den här kursen har samma yttre skelett:

<!doctype html>
<html lang="sv">

  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Sidans namn</title>
  </head>

  <body>
    <p>Allt som syns på sidan ligger här.</p>
  </body>

</html>

<!doctype html> är inte ett element utan en instruktion till webbläsaren: tolka det här som modern HTML. Utelämnar du den byter webbläsaren till ett gammalt läge där saker beter sig annorlunda, och validatorn stannar direkt.

<html lang="sv"> omsluter hela dokumentet. lang säger vilket språk sidan är skriven på. Det spelar roll för skärmläsare, som annars läser svensk text med engelskt uttal, och för webbläsarens stavningskontroll och översättningsfunktion.

<head> är information om sidan. Ingenting i head syns på sidan. <body> är sidan – allt som syns ligger där.

Rad i headVad den gör
<meta charset="utf-8">Säger hur tecknen ska tolkas. Ska stå först i head
<meta name="viewport" ...>Gör att sidan utgår från skärmens bredd på mobil. Vi går igenom den i område 4 – låt den stå
<title>Namnet i flikens rubrik, i bokmärken och i sökresultat
title är inte h1

title står i head och syns i fliken. h1 står i body och syns på sidan. De får gärna likna varandra, men de gör olika jobb. Ge varje sida en egen title – fyra flikar som alla heter "Min sajt" går inte att skilja åt.

Så här börjar stigar.html i förlagan. Sidans namn först, sajtens namn efter, så att fliken går att läsa även när den är smal:

<!doctype html>
<html lang="sv">

  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Stigarna – Vikstads naturreservat</title>
  </head>
Prova själv

Skapa index.html, skriv skelettet från minnet och byt ut title mot ditt eget ämne. Öppna filen och titta på flikens namn. Ta sedan bort raden <!doctype html>, ladda om och se att sidan fortfarande visas – felet syns inte, och det är precis därför validatorn behövs.

2. Teckenkodning och entiteter

Varför åäö går sönder

Datorn lagrar text som siffror. En teckenkodning är tabellen som säger vilken siffra som betyder vilket tecken. Skriver du filen med en tabell och webbläsaren läser den med en annan blir det fel – och det är alltid åäö som drabbas först, eftersom a, b och c ligger likadant i nästan alla tabeller.

Så här ser det ut när det gått fel:

Näckrosmossen är blöt året om

Två tecken i stället för ett, varje gång ett svenskt tecken skulle stått. Det betyder att filen är sparad som UTF-8 men läses som något annat. Lösningen är en enda rad, och den ska ligga först i head:

<meta charset="utf-8">

UTF-8 är teckenkodningen som rymmer alla språks tecken. Codespaces sparar dina filer som UTF-8 automatiskt. Det du behöver göra är att tala om det för webbläsaren. Ligger raden längre ned i head har webbläsaren redan hunnit gissa fel på det som stod före den.

Entiteter

Vissa tecken betyder något särskilt i HTML och kan därför inte skrivas rakt av. Vill du visa dem som text skriver du dem som en entitet: ett och-tecken, ett namn och ett semikolon.

EntitetBlirNär du behöver den
&lt;<När du vill visa HTML-kod som text på en sida
&gt;>Samma sak
&amp;&I text: "Ost & kex". Behövs även i adresser
&nbsp;mellanslag som inte brytsMellan tal och enhet: 5&nbsp;km
&ndash;–Tankstreck och intervall: 9&ndash;12
&copy;©I sidfoten
<p>Så här skriver du ett stycke: &lt;p&gt;Text&lt;/p&gt;</p>

Sidan visar <p>Text</p> som text i stället för att skapa ett stycke.

Åäö är inga entiteter

Med <meta charset="utf-8"> på plats skriver du å, ä och ö rakt av. Skriver du &aring; i stället gör du dig själv en otjänst – koden blir oläslig och nästa person tror att något är trasigt.

I stigar.html används tankstreck i löpande text:

<p>Spängerna är hala när det regnar &ndash; gå försiktigt, särskilt med barn.</p>
Prova själv

Skriv ett stycke som innehåller ett tankstreck och ett och-tecken. Ladda om och kontrollera att båda syns. Ta sedan bort <meta charset="utf-8">, ladda om, och se vad som händer med dina å, ä och ö. Sätt tillbaka raden.

3. Semantiska element

Ett semantiskt element säger vad innehållet är, inte hur det ska se ut. nav betyder "det här är navigation". div betyder ingenting alls.

Det spelar roll för tre grupper: skärmläsare, som kan hoppa direkt till main; sökmotorer, som förstår vad som är huvudinnehåll; och du själv om tre veckor, när du letar efter var något låg.

Utan CSS syns knappt någon skillnad på sidan. Det är därför området ligger före CSS – du väljer element efter innebörd, inte efter utseende, eftersom utseende ännu inte finns.

<body>

  <header>
    <p>Sajtens namn</p>
    <nav>...</nav>
  </header>

  <main>
    <h1>Sidans rubrik</h1>
    <section>...</section>
  </main>

  <footer>
    <p>Vem som gjort sidan.</p>
  </footer>

</body>
ElementVad det ärRegler
headerSidans eller ett avsnitts toppFår finnas flera per sida
navEn samling länkar som leder någonstansBara för större länkgrupper, inte varje länk
mainSidans huvudinnehållExakt en per sida. Innehåller inte header, nav eller footer
sectionEtt tematiskt avsnittSka ha en rubrik. Har den ingen är det troligen en div
articleNågot som står för sig självtSka gå att lyfta ur och fortfarande vara begriplig
asideInnehåll vid sidan om, som en faktarutaInte "höger spalt" – det är utseende
footerSidans eller ett avsnitts fotFår finnas flera per sida
divIngentingSista utvägen. I den här uppgiften behövs den nästan aldrig
section eller article?

Fråga dig om innehållet skulle vara begripligt om du klippte ut det och satte det någon annanstans. En artikel om tranan fungerar fristående – article. Avsnittet "Fåglar", som bara är en grupp av artiklar, gör det inte – section.

Så ser det ut i förlagan, med en section per djurgrupp och en article per art. Rubriknivåerna följer nästlingen:

<section id="faglar">
  <h2>Fåglar</h2>

  <article>
    <h3>Trana</h3>
    <p>Ett till två par häckar på mossen varje år.</p>
  </article>

  <article>
    <h3>Fiskgjuse</h3>
    <p>Ett par häckar i en tall vid Skogsleden.</p>
  </article>

</section>
Prova själv

Rita din sida på papper och skriv ut vilka block den har innan du kodar. Koda sedan skelettet med header, nav, main och footer, utan innehåll. Kontrollera att du har exakt en main, och att varken header eller footer ligger inuti den.

4. Text och listor

Rubriker

h1 till h6 är rubriknivåer, inte textstorlekar. De bygger sidans innehållsförteckning.

<h1>Djur och växter</h1>
  <h2>Fåglar</h2>
    <h3>Trana</h3>
    <h3>Fiskgjuse</h3>
  <h2>Däggdjur</h2>

Indraget ovan är bara för att visa strukturen – rubriker nästlas inte inuti varandra i koden.

Stycken och betoning

<p>Ett stycke text. Radbrytningar i koden syns inte på sidan.</p>

Vill du ha ett nytt stycke skriver du ett nytt p. Använd inte <br> för att skapa luft – br är för radbrytningar som hör till innehållet, som i en adress eller en diktrad.

ElementBetyderSer ut som
strongViktigtFet
emBetonatKursiv
bFet utan innebördFet
iKursiv utan innebördKursiv

Välj strong och em när betoningen betyder något, b och i när det bara är utseende. En skärmläsare läser strong med tryck och b som vanlig text.

Tre sorters listor

ul – punktlista. Ordningen spelar ingen roll.

<ul>
  <li>Du får plocka bär och matsvamp.</li>
  <li>Du får inte göra upp eld utanför de två eldstäderna.</li>
</ul>

ol – numrerad lista. Ordningen spelar roll: steg, placeringar, instruktioner. Numren skriver du inte själv – webbläsaren räknar.

<ol>
  <li>Kör Vikstadsvägen till dess slut.</li>
  <li>Parkera på grusplanen.</li>
  <li>Följ skylten mot fågeltornet.</li>
</ol>

dl – beskrivningslista. Par av term och förklaring. En ordlista, ett antal begrepp som ska förklaras. dt är termen, dd är beskrivningen.

<dl>
  <dt>Rundsileshår</dt>
  <dd>Köttätande, ungefär fem centimeter bred.</dd>

  <dt>Tuvull</dt>
  <dd>De vita ulltussarna över mossen i juni.</dd>
</dl>
Bara li direkt i listan

I alla tre listorna får bara li – eller dt och dd – ligga direkt inuti listan. Ett p mellan två li är ett valideringsfel. Lägg det inuti ett li i stället.

Prova själv

Skriv en ul med tre saker om ditt ämne, och gör om samma innehåll till en dl där varje punkt får en förklaring. Titta på skillnaden och behåll den som passar innehållet bäst.

5. Länkar och sökvägar

<a href="stigar.html">Stigarna</a>

href säger vart länken går. Texten mellan taggarna är det du klickar på.

Relativa och absoluta sökvägar

En relativ sökväg utgår från filen du står i. En absolut sökväg börjar med https:// och pekar ut en adress på internet.

SökvägBetyder
stigar.htmlFilen stigar.html i samma mapp som den här filen
bilder/karta.svgMappen bilder bredvid den här filen, och filen i den
../index.htmlEn mapp uppåt, och filen index.html där
https://www.naturvardsverket.se/En annan sajt. Hela adressen krävs
/stigar.htmlBörja om från serverns rot. Använd aldrig i den här kursen
Tre fel som bara syns efter publicering

Inledande snedstreck. Hos dig fungerar det. På GitHub Pages ligger din sajt under användarnamn.github.io/reponamn/, och snedstrecket hoppar över reponamnet och letar på fel ställe.

Versaler i filnamn. GitHubs server skiljer på stort och smått, din egen dator gör det oftast inte. Stigar.html och stigar.html är två olika filer för servern.

Mellanslag i filnamn. Använd bindestreck: djur-och-vaxter.html.

Ankarlänkar

En länk kan peka på ett ställe längre ned på samma sida. Elementet du vill nå får ett id, och länken skriver samma namn med # framför.

<a href="#vaxter">Växter på mossen</a>

<section id="vaxter">
  <h2>Växter på mossen</h2>
</section>

Ett id får finnas en gång per sida. Två element med samma id är ett valideringsfel, och länken landar på det första. Ankarlänkar fungerar även mellan sidor: besok.html#kontaktformular öppnar besok.html och hoppar direkt till formuläret.

Länktexter som säger vart de går

Skärmläsare kan lista sidans alla länkar. En lista med sju "läs mer" är obrukbar.

<!-- Fungerar inte -->
<p>Vill du veta mer om föreskrifterna, <a href="...">klicka här</a>.</p>

<!-- Fungerar -->
<p>Läs mer om vad som gäller i naturreservat hos
  <a href="https://www.naturvardsverket.se/">Naturvårdsverket</a>.</p>

Länktexten ska gå att förstå lyft ur meningen.

Navigationen

En navigation är en lista med länkar, inuti nav. Länkarna ligger i en ul för att de är en lista. Utan CSS syns punkterna, och det är rätt så länge.

<nav aria-label="Huvudmeny">
  <ul>
    <li><a href="index.html" aria-current="page">Start</a></li>
    <li><a href="stigar.html">Stigarna</a></li>
    <li><a href="djur-och-vaxter.html">Djur och växter</a></li>
    <li><a href="besok.html">Planera besöket</a></li>
  </ul>
</nav>
aria-current flyttas manuellt

aria-current="page" sätts på länken till den sida man står på – den talar om för skärmläsaren "du är här". Den ska stå på exakt en länk per sida, och du måste flytta den när du kopierar navigationen till nästa sida. Det är ett av de vanligaste slarvfelen.

aria-label på nav ger navigationen ett namn. Har sidan flera nav – huvudmeny och en innehållsförteckning – behövs det för att skilja dem åt.

Länkar som inte går till en sida:

<a href="mailto:parkenheten@vikstad.example">parkenheten@vikstad.example</a>
<a href="tel:055512345">0555-123 45</a>
Prova själv

Bygg navigationen på din startsida med alla fyra sidorna, och kopiera den till de tre andra. Flytta aria-current="page" på varje sida. Klicka dig sedan runt hela sajten och kontrollera att du kan nå varje sida från varje annan.

6. Bilder

<img src="bilder/karta.svg" alt="Karta över reservatet med tre markerade stigar.">

img har ingen sluttagg. src är sökvägen till bildfilen, alt är texten som ersätter bilden.

Alt-texten

alt läses upp av skärmläsare och visas om bilden inte laddas. Den är ett krav på varje bild i uppgiften. Skriv vad bilden visar, inte vad den heter:

<!-- Säger ingenting -->
<img src="bilder/trana.svg" alt="trana.svg">
<img src="bilder/trana.svg" alt="bild">

<!-- Säger något -->
<img src="bilder/trana.svg"
     alt="En trana i profil. Fågeln är grå med lång hals, långa ben och en röd
          fläck på hjässan.">

Skriv inte "bild på" eller "bilden visar" – att det är en bild vet skärmläsaren redan. Är bilden rent dekorativ och tillför ingenting skriver du alt="", tomt men närvarande. Då hoppar skärmläsaren över den. Att utelämna alt helt är alltid fel.

width, height och figure

<img src="bilder/karta.svg" width="640" height="400" alt="...">

Måtten anges utan enhet och i bildens verkliga pixelstorlek. De styr inte utseendet – det gör CSS senare – utan låter webbläsaren reservera rätt plats innan bilden laddats, så att texten inte hoppar när den kommer.

Hör det en bildtext till bilden, håll ihop dem:

<figure>
  <img src="bilder/sileshar.svg" width="480" height="360"
       alt="En rundsileshår sedd uppifrån. Bladen bildar en rosett.">
  <figcaption>Rundsileshår fångar insekter med klibbiga droppar på bladen.</figcaption>
</figure>

figcaption ska ligga direkt inuti figure, som första eller sista barn. Bildtexten och alt-texten säger olika saker: alt-texten beskriver vad man ser, bildtexten säger något om det. Skriv inte samma sak två gånger.

Formaten

FormatPassar tillEgenskaper
JPGFotonLiten fil, men tappar kvalitet varje gång den sparas om
PNGSkärmbilder, skarpa kanter, genomskinlighetStörre fil, tappar ingen kvalitet
WebPBåde foton och grafikMindre än både JPG och PNG. Fungerar i alla moderna webbläsare
SVGIkoner, kartor, diagram, logotyperRitad med koordinater i stället för pixlar. Skalar hur långt som helst utan att bli suddig

Tumregel: fotografi → JPG eller WebP. Ritad figur → SVG. Bilderna i förlagan är SVG, eftersom de är ritade figurer – en karta, en fågel, en växt. En karta som SVG är skarp både på mobilen och på projektorn.

Bilder från kameran är ofta fyra megabyte. Det är för mycket för en webbsida. Skala ner till den bredd den faktiskt visas i, ungefär 1600 pixlar räcker gott, innan du lägger in den.

Prova själv

Lägg in en bild med alt, width och height. Läs alt-texten högt för dig själv utan att titta på bilden – förstår du vad den visar? Ändra sedan src till ett filnamn som inte finns, ladda om, och se att alt-texten är det som visas i stället.

7. Ljud och video

<audio src="ljud/tranrop.mp3" controls></audio>

<video src="film/mossen.mp4" width="640" height="360" controls></video>

controls ger uppspelningsknapparna. Utan det syns ingen spelare alls. Sätt inte autoplay – ljud som startar av sig självt är ett av de säkraste sätten att få någon att stänga en sida.

Undertexter med track

Video utan undertext utestänger den som inte hör. track lägger till en textfil som visas i takt med filmen:

<video width="640" height="360" controls>
  <source src="film/mossen.mp4" type="video/mp4">
  <track src="film/mossen.vtt" kind="captions" srclang="sv" label="Svenska" default>
  <p>Din webbläsare kan inte spela upp video.
    <a href="film/mossen.mp4">Ladda ner filmen</a> i stället.</p>
</video>

source i stället för src gör att du kan erbjuda flera format. Texten längst ned visas bara om webbläsaren inte klarar video alls.

Undertextfilen är en vanlig textfil med ändelsen .vtt:

WEBVTT

00:00:00.000 --> 00:00:04.000
Näckrosmossen är åtta meter djup på mitten.

00:00:04.000 --> 00:00:09.500
Den har byggts upp sedan istiden, en millimeter om året.

Ett transkript – hela innehållet i text under spelaren – är ännu bättre. Det går att söka i, att läsa snabbt, och det fungerar för den som varken hör eller kan spela upp filmen.

Prova själv

Det ligger ett kort videoklipp i itslearning, under område 2, som du får använda. Ladda ner det och lägg in det med video och controls. Skapa sedan en fil undertext.vtt bredvid det, skriv undertexter till de första tjugo sekunderna, och koppla den med track.

Spela upp och kontrollera att texten kommer när den ska. Gör den inte det är det nästan alltid tidsformatet: två siffror för timmar, minuter och sekunder, och punkt före millisekunderna.

8. Tabeller

En tabell är för data som hör ihop i rader och kolumner. Tidtabeller, priser, jämförelser, mätvärden. En tabell är aldrig för layout – vill du ha två saker bredvid varandra löser du det med CSS i område 3.

<table>
  <caption>De tre markerade stigarna</caption>
  <thead>
    <tr>
      <th scope="col">Stig</th>
      <th scope="col">Längd</th>
      <th scope="col">Tid</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <th scope="row">Mosseleden</th>
      <td>2,4 km</td>
      <td>1 timme</td>
    </tr>
    <tr>
      <th scope="row">Strandleden</th>
      <td>4,1 km</td>
      <td>1 timme 30 minuter</td>
    </tr>
  </tbody>
</table>
ElementVad det är
captionTabellens rubrik. Ska ligga först inuti table
theadRaden eller raderna med kolumnrubriker
tbodyTabellens innehåll
trEn rad
thEn rubrikcell
tdEn datacell

scope

scope säger vad en rubrikcell är rubrik för. Utan den vet en skärmläsare inte om th-cellen hör till kolumnen eller raden.

Har tabellen rubriker åt båda håll, som exemplet ovan, blir varje datacell entydig: en skärmläsare kan säga "Strandleden, Längd, 4,1 km" i stället för bara "4,1 km".

Radrubriken är ett th

Första cellen i varje rad är en rubrik, inte data. Den ska vara <th scope="row">, inte <td>. Det är den vanligaste missen i hela avsnittet.

Prova själv

Bygg en tabell med minst tre rader och tre kolumner om ditt ämne. Ge den en caption, scope="col" på kolumnrubrikerna och scope="row" på första cellen i varje rad. Läs sedan upp en godtycklig datacell tillsammans med dess två rubriker – blir det en begriplig mening?

9. Formulär

Formulären i den här kursen skickar ingenting

Ett riktigt formulär har ett action som pekar på ett program på en server. Något sådant har vi inte, och att bygga det ligger utanför kursen. Därför saknar formulären här action, och ingenting händer när du trycker på knappen. Markeringen är däremot exakt densamma som i ett formulär som fungerar, och det är den som bedöms.

label och for – den viktigaste regeln

<label for="namn">Namn</label>
<input type="text" id="namn" name="namn">

for på etiketten ska vara exakt samma sträng som id på fältet. Då händer tre saker: skärmläsaren läser upp etiketten när fältet får fokus, klick på texten sätter markören i fältet, och kryssrutor blir mycket lättare att träffa.

id och name är olika saker som ofta får samma värde. id är sidans interna identitet och kopplar ihop etikett och fält. name är namnet som skickas till servern.

En placeholder är inte en etikett

Den försvinner när man börjar skriva, och den som tappade tråden har ingen chans att se vad fältet var till för. Varje fält behöver en label.

Fälttyper

typeTill
textVanlig text
emailE-postadress. Mobilen visar ett tangentbord med @
telTelefonnummer. Numeriskt tangentbord
numberTal. Går att begränsa med min och max
dateDatum. Webbläsaren visar en kalender
urlWebbadress
searchSökfält
passwordText som döljs
checkboxKryssruta. Flera kan väljas
radioAlternativknapp. Bara ett kan väljas i en grupp

Kryssrutor och alternativknappar har etiketten efter fältet, till skillnad från övriga:

<input type="checkbox" id="kikare" name="behov" value="kikare">
<label for="kikare">Vi vill låna kikare</label>

Alternativknappar hör ihop genom att ha samma name. Det är det som gör att bara en i taget kan väljas:

<input type="radio" id="svar-epost" name="svarssatt" value="epost" checked>
<label for="svar-epost">E-post</label>

<input type="radio" id="svar-sms" name="svarssatt" value="sms">
<label for="svar-sms">SMS</label>

Samma name, olika id. Glömmer du det kan användaren kryssa i båda.

select och textarea

<label for="tur">Inriktning</label>
<select id="tur" name="tur">
  <option value="allman">Allmän tur om reservatet</option>
  <option value="faglar">Fågeltur, start klockan sex</option>
</select>
<label for="meddelande">Övrigt</label>
<textarea id="meddelande" name="meddelande" rows="6" cols="40"></textarea>

textarea har alltid en sluttagg, direkt efter starttaggen om fältet ska vara tomt. Allt du skriver emellan hamnar som förifylld text i rutan – även mellanslag och radbrytningar.

fieldset och legend

<fieldset>
  <legend>Dina uppgifter</legend>

  <p>
    <label for="namn">Namn</label>
    <input type="text" id="namn" name="namn" autocomplete="name" required>
  </p>

  <p>
    <label for="epost">E-postadress</label>
    <input type="email" id="epost" name="epost" autocomplete="email" required>
  </p>
</fieldset>

legend ska vara första elementet inuti fieldset. För alternativknappar är fieldset inte bara snyggt utan nödvändigt: utan en legend hör skärmläsaren "E-post" och "SMS" utan att få veta vad frågan var.

Krav och hjälp

AttributGör
requiredFältet måste fyllas i
min, maxGränser för number och date
patternEtt mönster värdet måste följa
valueFörifyllt värde
checkedFörvald kryssruta eller alternativknapp
autocompleteLåter webbläsaren fylla i namn, e-post och adress åt användaren

autocomplete="name", autocomplete="email" och autocomplete="tel" är de du behöver. De sparar tid för alla, och mycket tid för den som har svårt att skriva.

<button type="submit">Skicka anmälan</button>

Skriv vad knappen gör. "Skicka anmälan" är bättre än "Skicka", som är bättre än "OK".

Prova själv

Bygg ett formulär med ett textfält, ett e-postfält och en textarea, alla med kopplade etiketter. Klicka sedan på varje etikett och kontrollera att markören hamnar i rätt fält. Gör den inte det stämmer inte for med id.

10. Validering och webbläsartest

W3C:s validator läser din HTML och säger vad som inte följer standarden. Den finns på validator.w3.org och kan ta din kod på tre sätt:

Validera varje sida för sig. Validatorn läser ett dokument i taget och följer inte dina länkar.

Läs uppifrån

Ett fel skapar ofta tio. En ostängd <section> högt upp gör att allt därefter hamnar på fel ställe, och validatorn klagar på varje element hela vägen ner. Rätta det översta felet, validera om, och se hur många som försvann. Att börja i mitten av en lista med sextio fel är bortkastad tid.

Validatorn skiljer på tre sorter: Error är fel och ska bort. Warning är något som troligen är fel. Info är en upplysning. Kravet på E är noll Error, på C noll av båda.

De vanligaste felen

MeddelandeVad det betyderÅtgärd
Start tag seen without seeing a doctype firstDokumentet saknar doctypeLägg <!doctype html> allra överst
Element head is missing a required instance of child element titleIngen titleLägg <title> i head
Consider adding a lang attributelang saknas på html<html lang="sv">
An img element must have an alt attributeBild utan alt-textSkriv alt, tomt om bilden är dekorativ
Duplicate IDSamma id två gånger på sidanEtt id per sida. Döp om det ena
End tag X seen, but there were open elementsEn tagg är ostängdLeta efter elementet som saknar sluttagg, ovanför
Stray end tagEn sluttagg utan starttaggTa bort den, eller lägg till starttaggen
Element figcaption not allowed as child of element Xfigcaption ligger utanför sin figureFlytta in den i figure
Element li not allowed as child of element Xli ligger utanför en listali måste ligga direkt i ul eller ol
The element button must not appear as a descendant of the a elementKlickbart i klickbartVälj det ena
Section lacks heading (varning)section utan rubrikGe den en rubrik, eller gör om den till div
Table column N established by element th has no cells beginning in itRader med olika antal cellerRäkna cellerna. Varje rad ska ha lika många

Testa i två webbläsare

Öppna sajten i två olika webbläsare – Chrome och Firefox, eller Edge och Firefox. De tolkar korrekt HTML likadant, men de har olika standardstil: rubrikstorlekar, formulärfält och datumväljare ser olika ut.

Det är därför det ingår i uppgiften. Ser något helt annorlunda ut i den ena är det nästan alltid ett strukturfel som råkar visa sig i just den webbläsaren.

Testa också med enbart tangentbord. Tab flyttar framåt, Shift + Tab bakåt, Enter följer en länk. Kommer du åt alla länkar och alla fält, och i en ordning som följer sidan?

Prova själv

Validera en av dina sidor nu, innan den är klar. Rätta det översta felet, validera om och räkna hur många som försvann. Gör om tills det står Document checking completed. No errors or warnings to show.

11. Ta det längre

För dig som har ska-kraven på plats och siktar mot C eller A.

A är inte mer kod

Det är inte mängden som skiljer A från C. Det är att varje element är valt, och att du kan säga varför.

12. Felsökning

21 rader

SymptomTrolig orsakÅtgärd
Åäö blir konstiga tecken<meta charset="utf-8"> saknas eller ligger för långt nedFörst i head, före title
Sidan visas men validatorn stannar direktDoctype saknas<!doctype html> allra överst
Resten av sidan hamnar inuti ett blockEn tagg är ostängdLeta efter elementet utan sluttagg, ovanför felet
Validatorn hittar hundratals felEtt tidigt fel skapar följdfelRätta det översta felet och validera om
Bilden visas som en trasig ikonsrc pekar fel, eller filen är inte committadJämför sökvägen med filträdet. Kontrollera att filen syns på github.com
Bilden syns hos mig men inte publiceratVersal i mapp- eller filnamnetServern skiljer på stort och smått. Gemener överallt
Alla länkar dör efter publiceringInledande snedstreck i hrefstigar.html, inte /stigar.html
Ankarlänken hoppar till fel ställeTvå element har samma idEtt id per sida
Ankarlänken gör ingentingid saknas på målet, eller stavas olikahref="#vaxter" kräver id="vaxter"
Rubrikerna blir olika storaDu hoppade från h1 till h3Nivåerna ska följa på varandra
Punktlistan renderar konstigtNågot annat än li ligger direkt i ulFlytta in innehållet i ett li
Tabellen ser ut som en radda textIngen CSS. Linjer är form, inte strukturRätt så länge. Linjerna kommer i område 3
En kolumn hamnar snett i tabellenOlika antal celler på olika raderRäkna td och th per rad
Klick på etiketten gör ingentingfor matchar inte fältets idSka vara exakt samma sträng
Båda alternativknapparna går att väljaDe har olika nameSamma name, olika id
Textarean är förifylld med mellanslagRadbrytningar mellan <textarea> och </textarea>Skriv sluttaggen direkt efter starttaggen
Formuläret gör ingenting när jag skickarDet finns ingen server som tar emotFörväntat. Strukturen bedöms, inte att det skickas
Bilden täcker halva skärmenIngen CSSSå ska det se ut. Storleken sätts i område 3
figcaption ger valideringsfelDen ligger utanför sin figureFlytta in den, först eller sist i figure
Skärmläsaren säger bara "4,1 km"Radrubriken är td, inte th med scope="row"Byt cellen till th scope="row"
Sidan ser annorlunda ut i FirefoxOlika standardstil för formulär och rubrikerFörväntat utan CSS. Skiljer det sig mycket, leta strukturfel

13. Snabbreferens

ElementVad det ärAvsnitt
<!doctype html>Säger att dokumentet är modern HTML1
html lang="sv"Omsluter dokumentet, anger språk1
headInformation om sidan. Syns inte1
meta charset="utf-8"Teckenkodning. Först i head2
titleFlikens namn1
bodyAllt som syns1
headerTopp på sidan eller ett avsnitt3
navGrupp av navigationslänkar5
mainSidans huvudinnehåll. En per sida3
sectionTematiskt avsnitt med rubrik3
articleFristående innehåll3
asideInnehåll vid sidan om3
footerFot på sidan eller ett avsnitt3
divIngen innebörd. Sista utvägen3
h1–h6Rubriknivåer4
pStycke4
strong, emViktigt, betonat4
ul, ol, liPunktlista, numrerad lista, listrad4
dl, dt, ddBeskrivningslista, term, beskrivning4
a hrefLänk5
idUnik identitet på sidan. Mål för ankarlänk5
aria-current="page"Markerar aktuell sida i menyn5
img src altBild med ersättningstext6
width, heightBildens verkliga mått, utan enhet6
figure, figcaptionBild med bildtext6
audio, video, controlsMediespelare7
source, trackFormat respektive undertext7
table, captionTabell och tabellrubrik8
thead, tbody, trRubrikdel, innehåll, rad8
th scope, tdRubrikcell, datacell8
formFormulär9
label forEtikett kopplad till fält9
input typeFält. Se typtabellen i avsnitt 99
select, optionRullgardin9
textareaFlerradigt textfält9
fieldset, legendFältgrupp och dess namn9
buttonKnapp9
required, patternKrav på ifyllnad respektive format9

14. Ordlista

Klicka på en rad för att visa betydelsen, eller träna på orden med knapparna nedan.

Ordträning

OrdBetyder
elementStarttagg, innehåll och sluttagg tillsammans
taggDet som står mellan vinkelparenteser, som <p>
attributExtra information i starttaggen, som href="..."
doctypeRaden överst som säger att dokumentet är modern HTML
semantikAtt elementet säger vad innehållet är, inte hur det ser ut
teckenkodningTabellen som säger vilken siffra som betyder vilket tecken
UTF-8Teckenkodningen som rymmer alla språks tecken
entitetSkrivsätt för tecken som betyder något särskilt i HTML, som &lt;
relativ sökvägSökväg som utgår från filen du står i
absolut sökvägHela adressen, från https://
ankarlänkLänk till ett id längre ned på en sida
alt-textTexten som ersätter en bild för den som inte ser den
valideringAtt kontrollera att koden följer standarden
skärmläsareProgram som läser upp sidan för den som inte ser skärmen
landmärkeEtt semantiskt block, som main eller nav, som går att hoppa till
transkriptHela innehållet i en ljud- eller videofil skrivet som text