Skip to main content
Mediaweb Logo

Mediaweb

Html Guide

Formularer i HTML: En Begynderguide

Lær at oprette interaktive HTML-formularer med inputtyper, labels, knapper og grundlæggende validering. Mestre formularers tilgængelighed og bedste praksis.

September 4, 2025
5 min læsning
html
formularer
webudvikling
tilgængelighed
brugerinput

Hvad er <form>-elementet?

<form>-elementet er en container, der omslutter alle formularkontrolelementer og definerer, hvordan formulardataene skal behandles. Det fungerer som fundamentet for at indsamle brugerinput og sende det til en server.

Grundlæggende formularstruktur

<form action="/submit" method="POST">
  <!-- Formularkontrolelementer kommer her -->
  <input type="text" name="username" required>
  <button type="submit">Send</button>
</form>

Vigtige formularattributter

  • action: Specificerer hvor formulardataene skal sendes når de indsendes
  • method: Definerer hvordan data skal sendes (GET eller POST)
  • enctype: Specificerer hvordan formulardata skal kodes (vigtigt for filupload)
<form action="/contact" method="POST" enctype="multipart/form-data">
  <!-- Formular til filupload -->
</form>

Essentielle inputtyper

HTML5 introducerede talrige inputtyper, der giver bedre brugeroplevelse og indbygget validering. Lad os udforske de mest almindeligt anvendte:

Tekstinputtyper

<!-- Grundlæggende tekstinput -->
<input type="text" name="fullname" placeholder="Indtast dit fulde navn">

<!-- Password input (skjuler tegn) -->
<input type="password" name="password" placeholder="Indtast adgangskode">

<!-- Email input (med indbygget validering) -->
<input type="email" name="email" placeholder="bruger@eksempel.dk">

<!-- Telefonnummer input -->
<input type="tel" name="phone" placeholder="+45 12 34 56 78">

<!-- URL input -->
<input type="url" name="website" placeholder="https://eksempel.dk">

Specialiserede inputtyper

<!-- Nummer input med min/max værdier -->
<input type="number" name="age" min="18" max="100" step="1">

<!-- Datovælger -->
<input type="date" name="birthdate">

<!-- Tidsvælger -->
<input type="time" name="appointment">

<!-- Farvevælger -->
<input type="color" name="theme-color" value="#ff0000">

<!-- Filupload -->
<input type="file" name="resume" accept=".pdf,.doc,.docx">

Udvælgelsesinputtyper

<!-- Radioknapper (enkelt udvælgelse) -->
<input type="radio" name="gender" value="male" id="male">
<input type="radio" name="gender" value="female" id="female">

<!-- Checkboxe (flere udvælgelser) -->
<input type="checkbox" name="interests" value="coding" id="coding">
<input type="checkbox" name="interests" value="design" id="design">

<!-- Range slider -->
<input type="range" name="satisfaction" min="1" max="10" value="5">

Labels og tilgængelighed

Labels er afgørende for formulartilgængelighed. De giver kontekst for skærmlæsere og forbedrer brugervenligheden for alle brugere.

Korrekt labelbrug

<!-- Metode 1: Brug af 'for' attribut -->
<label for="username">Brugernavn:</label>
<input type="text" id="username" name="username" required>

<!-- Metode 2: Omslutning af input inde i label -->
<label>
  Email-adresse:
  <input type="email" name="email" required>
</label>

Komplet tilgængelig formulareksempel

<form action="/register" method="POST">
  <fieldset>
    <legend>Personlige oplysninger</legend>
    
    <div class="form-group">
      <label for="first-name">Fornavn *</label>
      <input type="text" id="first-name" name="firstName" required 
             aria-describedby="first-name-help">
      <small id="first-name-help">Indtast dit juridiske fornavn</small>
    </div>
    
    <div class="form-group">
      <label for="email">Email-adresse *</label>
      <input type="email" id="email" name="email" required
             aria-describedby="email-help">
      <small id="email-help">Vi deler aldrig din email</small>
    </div>
    
    <div class="form-group">
      <label for="phone">Telefonnummer</label>
      <input type="tel" id="phone" name="phone"
             aria-describedby="phone-help">
      <small id="phone-help">Valgfrit: Inkluder landekode</small>
    </div>
  </fieldset>
</form>

Knapper og formularindsendelse

Knapper styrer formularadfærd og giver klare handlinger for brugere.

Knappetyper

<!-- Send-knap (sender formularen) -->
<button type="submit">Opret konto</button>

<!-- Nulstil-knap (rydder formulardata) -->
<button type="reset">Ryd formular</button>

<!-- Almindelig knap (til JavaScript-interaktioner) -->
<button type="button" onclick="showHelp()">Brug for hjælp?</button>

Input vs Button elementer

<!-- Brug af input element -->
<input type="submit" value="Send formular">

<!-- Brug af button element (mere fleksibelt) -->
<button type="submit">
  <span>Send formular</span>
  <svg><!-- ikon --></svg>
</button>

Grundlæggende formularvalidering

HTML5 giver indbygget validering, der virker uden JavaScript, hvilket forbedrer brugeroplevelsen og datakvaliteten.

Påkrævede felter

<input type="text" name="username" required>
<input type="email" name="email" required>
<select name="country" required>
  <option value="">Vælg et land</option>
  <option value="dk">Danmark</option>
  <option value="se">Sverige</option>
</select>

Mønstervalidering

<!-- Telefonnummermønster -->
<input type="tel" name="phone" 
       pattern="[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}"
       placeholder="12 34 56 78">

<!-- Brugerdefineret brugernavn mønster -->
<input type="text" name="username"
       pattern="[a-zA-Z0-9_]{3,16}"
       title="Brugernavn skal være 3-16 tegn, bogstaver, tal og understreger kun">

Længde- og områdevalidering

<!-- Tekstlængdegrænser -->
<input type="text" name="title" minlength="5" maxlength="100">

<!-- Talområder -->
<input type="number" name="quantity" min="1" max="10">

<!-- Datoområder -->
<input type="date" name="start-date" min="2025-01-01" max="2025-12-31">

Komplet formulareksempel

Her er en omfattende kontaktformular, der demonstrerer alle de koncepter, vi har dækket:

<form action="/contact" method="POST" novalidate>
  <fieldset>
    <legend>Kontaktoplysninger</legend>
    
    <div class="form-row">
      <div class="form-group">
        <label for="first-name">Fornavn *</label>
        <input type="text" id="first-name" name="firstName" 
               required minlength="2" maxlength="50">
      </div>
      
      <div class="form-group">
        <label for="last-name">Efternavn *</label>
        <input type="text" id="last-name" name="lastName" 
               required minlength="2" maxlength="50">
      </div>
    </div>
    
    <div class="form-group">
      <label for="email">Email-adresse *</label>
      <input type="email" id="email" name="email" required>
    </div>
    
    <div class="form-group">
      <label for="phone">Telefonnummer</label>
      <input type="tel" id="phone" name="phone"
             pattern="[0-9]{2} [0-9]{2} [0-9]{2} [0-9]{2}"
             placeholder="12 34 56 78">
    </div>
  </fieldset>
  
  <fieldset>
    <legend>Beskeddetaljer</legend>
    
    <div class="form-group">
      <label for="subject">Emne *</label>
      <select id="subject" name="subject" required>
        <option value="">Vælg et emne</option>
        <option value="general">Generel forespørgsel</option>
        <option value="support">Teknisk support</option>
        <option value="billing">Faktureringsspørgsmål</option>
      </select>
    </div>
    
    <div class="form-group">
      <label for="message">Besked *</label>
      <textarea id="message" name="message" required
                minlength="10" maxlength="1000" rows="5"
                placeholder="Beskriv venligst din forespørgsel..."></textarea>
    </div>
    
    <div class="form-group">
      <label for="priority">Prioritetsniveau</label>
      <input type="range" id="priority" name="priority"
             min="1" max="5" value="3">
      <output for="priority">3</output>
    </div>
  </fieldset>
  
  <fieldset>
    <legend>Præferencer</legend>
    
    <div class="form-group">
      <label>
        <input type="checkbox" name="newsletter" value="yes">
        Tilmeld dig vores nyhedsbrev
      </label>
    </div>
    
    <div class="form-group">
      <fieldset>
        <legend>Foretrukken kontaktmetode</legend>
        <label>
          <input type="radio" name="contact-method" value="email" checked>
          Email
        </label>
        <label>
          <input type="radio" name="contact-method" value="phone">
          Telefon
        </label>
      </fieldset>
    </div>
  </fieldset>
  
  <div class="form-actions">
    <button type="reset">Ryd formular</button>
    <button type="submit">Send besked</button>
  </div>
</form>

Bedste praksis for formularstyling

Selvom denne guide fokuserer på HTML, er her nogle CSS-tips til bedre formularpræsentation:

/* Grundlæggende formularstyling */
.form-group {
  margin-bottom: 1rem;
}

.form-row {
  display: flex;
  gap: 1rem;
}

label {
  display: block;
  margin-bottom: 0.25rem;
  font-weight: 500;
}

input, select, textarea {
  width: 100%;
  padding: 0.5rem;
  border: 1px solid #ccc;
  border-radius: 4px;
  font-size: 1rem;
}

input:focus, select:focus, textarea:focus {
  outline: none;
  border-color: #007bff;
  box-shadow: 0 0 0 2px rgba(0, 123, 255, 0.25);
}

button {
  padding: 0.75rem 1.5rem;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 1rem;
}

button[type="submit"] {
  background-color: #007bff;
  color: white;
}

Almindelige formularfejl at undgå

  1. Manglende labels: Giv altid labels til formularkontrolelementer
  2. Dårlig fejlhåndtering: Giv klare, hjælpsomme fejlmeddelelser
  3. Ingen valideringsfeedback: Vis brugere hvad der gik galt og hvordan de retter det
  4. Utilgængelige formularer: Brug korrekte ARIA-attributter og semantisk HTML
  5. Overvældende formularer: Opdel lange formularer i logiske sektioner
  6. Ingen fremskridtsindikation: For multi-step formularer, vis fremskridt
  7. Uklare påkrævede felter: Marker påkrævede felter tydeligt

Konklusion

HTML-formularer er essentielle for at skabe interaktive weboplevelser. Ved at forstå <form>-elementet, forskellige inputtyper, korrekt labeling og grundlæggende validering kan du skabe formularer, der er både funktionelle og tilgængelige.

Husk disse nøgleprincipper:

  • Brug altid semantiske HTML-elementer
  • Giv klare labels og instruktioner
  • Implementer korrekt validering
  • Overvej tilgængelighed fra starten
  • Test dine formularer med rigtige brugere

Med disse fundamenter på plads vil du være i stand til at skabe formularer, der giver fremragende brugeroplevelser, mens de indsamler de data din applikation har brug for.

Næste skridt

  • Lær om avanceret formularvalidering med JavaScript
  • Udforsk CSS Grid og Flexbox til formularlayouts
  • Studer ARIA-attributter for forbedret tilgængelighed
  • Øv dig med forskellige formularbiblioteker og frameworks
  • Implementer server-side formularprocessering
Sidst opdateret: October 3, 2025

Relaterede Artikler

Fortsæt med at læse disse relaterede artikler