Webtechnologien Wintersemester 2024

HTML

Hypertext Markup Language

Quelle: Markus Spiske

Vor langer, langer Zeit

  • Dokumente verstreut, Referenzen purer Text
  • mühsame Suche der passenden Datei anhand der Text-Referenz
  • Berners-Lee suchte einfache Auszeichnungssprache für sein WorldWideWeb
  • Damals auch hip: SGML, LaTeX, MS Word
  • SGML: Standard Generalized Markup Language
  • Tim Berners-Lee brauchte etwas Einfaches und baute es – erst einmal – selbst
  • HTTP als simples Protokoll zum Laden weiterer Dokumente
  • HTML als simple Auszeichnungssprache, basierend auf SGML (1986 standardisiert)

SGML

SGML

  • Standard Generalized Markup Language
  • Metasprache zur Definition von Auszeichnungssprachen
  • Trennung von Inhalt und Layout
  • Markup sollte deklarativ und präzise sein

Quelle: Wikipedia

  • deklarativ: Beschreibung der Struktur des Dokuments statt des Verarbeitungsprozess
  • präzise: Gründlich ausgezeichnete Dokumente, damit sie auch von anderen Programmen verarbeitet werden können
  • letzteres Knackpunkt zu HTML5

  • Parser konnte für jedes Computer-System implementiert werden
  • Sprache definiert nur abstraktes Layout ohne Festlegung der Umsetzung in eine Präsentation
  • es wird nur die Funktion / Rolle eines Textstücks beschrieben
  • damit unabhängig vom Formatierer / Betrachter (z.B. Browser)

  • Bild: Oxford English Dictionary (1985)

SGML

<!DOCTYPE article PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
<article>
   <sect1 id="introduction">
      <title>Hello world introduction</title>
      <para>
         Hello world!
      </para>
   </sect1>
</article>

Quelle: newbiedoc.sourceforge.net

  • Aufbau
    1. SGML-Deklaration
    2. Prolog mit Dokumententyp (Doctype)
    3. Dokument an sich, beginnend mit einem Element und seinen Kindern

HTML

  • 1989 von Tim Berners-Lee als Teil des WorldWideWeb entworfen
  • Übernahm SGMLs Elemente zur Strukturierung von Texten: Absätze, Überschriften, Listen
  • Fügte Anker-Element hinzu, um Dokumente zu verknüpfen
  • Wahl von SGML war ein kluger Schritt – andere hätten vielleicht eigene Sprache erdacht
  • Dadurch höhere Akzeptanz
  • Zudem leicht verständlich

Bilder

  • 1992 tauschte sich eine Gruppen von Web-Enthusiasten zur Zukunft von HTML aus
  • Unter anderem darüber, wie Bilder eingebettet werden könnten (und ob überhaupt)
  • Dann kam Marc Andreessen dazu und stellte seine Idee des <img>-Tags vor
  • Nicht alle stimmten zu, aber Mosaic hatte es schon eingebaut und so ist es bis heute

Unternehmen

  • Die Arbeit am Web verlief langsam, weil viel ehrenamtlich
  • Große Firmen hatten wenig Interesse am WWW, weil unklar, ob sich damit Geld verdienen ließe

HTML im Wandel der Zeit

HTML5

  • Snapshot-Standardisierung durch W3C
  • Lebendige Entwicklung durch WHATWG
  • Viele neue HTML-Elemente
  • HTML5 nicht mehr XML-konform

HTML5 Timeline

Quelle: w3.org

  • XML: Kritiker bemängeln, dass mangelnde Härte zu Schlamperei führt
  • HTML5 teilweise Paving the Cowpath (Pflastern der Trampelpfade) – Standardisieren von Dingen, die weitläufig genutzt werden aber wild gewachsen sind

Code

Syntax – Tags

<!-- Ich bin ein Kommentar -->

<!-- Start / Ende -->
Ein <strong>richtig</strong> schöner Tag.

<!-- Selbstschließend (void elements) -->
<hr /> oder <hr>

<!-- Schachtelung -->
<h1>Die <strong>Chance</strong> des Tages</h1>
  • Wenn nicht geschlossen, wird Geltungsbereich erahnt
  • case insensitive: sollten aber klein geschrieben werden
  • unbekannte = inline (aber nicht nötig)

Syntax – Attribute

<!-- Schlüssel-Wert-Paar -->
<input value="Goku" placeholder="Name">

<!-- binäre Attribute (kann Wert haben, muss aber nicht) -->
<input disabled>

<!-- Mehrere Werte als leerzeichengetrennte Liste -->
<input class="aktiv obligatorisch hervorgehoben">

<!-- Custom Data Attributes -->
<span class="notifications" data-count="3">Benachrichtigungen</span>
  • Leerzeichen als Trenner
  • Anführungszeichen empfohlen (doppelt und einfach)
  • In XML müsste Wert gegeben werden, dann Name als Wert required="required"
  • rel="nofollow" um Spam zu entschärfen

Syntax – Kodierung

  • früher nötig für Nicht-ASCII
  • heute nur noch für geschützte Zeichen (wenn UTF-8 o.ä.)
&auml; &szlig;
&quot;
&amp;
&nbsp;
&lt; &gt;
&#9731;
body { font: 300% monospace; }

Elemente

  • Häufig synonym zu Tags verwendet
  • Tags sind textliche Repräsentation
  • Elemente sind das daraus gewonnene Ergebnis des Parsens

Grundgerüst

<!DOCTYPE html>
<html lang="de">
   <head>
      <meta charset="utf-8">
      <title></title>
   </head>
   <body></body>
</html>
  • Doctype früher länger und wichtig, wurde sich aber häufig nicht daran gehalten, weswegen Browser begannen, ihn zu ignorieren, darum heute so kurz (genannt: Standards Mode)
  • html als Wurzel-Element (muss nicht in HTML5, aber sollte)
  • lang sollte gesetzt sein, um Sprachsynthese-Tools zu helfen, die richtige Aussprache zu wählen etc
  • head: Bearbeitungshinweise
  • body: Anzuzeigender Inhalt

Grund-
gerüst

Quelle: @SlexAxton

  • Conditional Comments
  • HTML5-Boilerplate
  • Modernizr
  • leerer Head 😌

Elemente

  • Historisch: Block / Inline, heute Kategorien

Quelle: W3C – Content Models – Mehr: MDN – Content categories

  • Inline: Im Fluss
  • Block: Eigene, aufspannende Box

Content Models

Name Beschreibung
Metadata Definiert Präsentation oder Verhalten des restlichen Inhalts.
Sectioning Unterteilt semantisch. Definiert Scope von Headern und Footern.
Heading Definiert den Kopf eines Bereichs.
Phrasing Zeichnet den Text des Inhalts aus.
Embedded Bindet andere Ressourcen ein.
Interactive Inhalt, der zur Benutzer-Interaktion gedacht ist.
  • Metadata: base, command, link, meta, noscript, script, style, title
  • Sectioning: article, aside, nav, section
  • Heading: h1, h2, h3, h4, h5, h6, hgroup
  • Phrasing: a, br, button, img, input, select, small, span, strong, textarea, time
  • Embedded: audio, canvas, embed, iframe, img, math, object, svg, video
  • Interactive: a, audio, button, details, embed, iframe, img, input, keygen, label, menu, object, select, textarea, video

Überschriften

<h1>Eins</h1>
<h2>Zwei</h2>
<h3>Drei</h3>
<h4>Vier</h4>
<h5>Fünf</h5>
<h6>Sechs</h6>

Hervorhebung von Text

Das muss <strong>dringend</strong> erledigt werden.<br>
<em>Du</em> hast doch gesagt: <q>Machste eh nicht.</q><br>
Das Wort <i>das</i> ist ein Artikel.<br>
<small>Copyright <del>2023</del> 2024 Foo Inc.</small><br>
<code>public static void <span class="function">main</span>(String[] args)</code>
body { font-size: 150%; line-height: 1.5; }
  • Emphasis: Betonung
  • Strong: Starke Betonung
  • i: Textabschnitt, der sich aus einem Grund vom Rest des Textes abhebt
  • Gründe: Technische Fachbegriffe, fremdsprachliche Ausdrücke, Gedanken fiktionaler Charaktere

Anreicherung von Text

Der Flieger nach <abbr title="Derby Field Airport, Lovelock, USA">LOL</abbr> wird am <time datetime="2014-10-01 17:01">1. Oktober um 17.01 Uhr</time> starten.
body { font-size: 150%; line-height: 1.5; }

Auch Text

<p>Ich bin ein eigener Absatz.</p> <p> Ich auch. </p>
<pre>           Mir ist jedes
            Leerzeichen
              wichtig.</pre>
body { font-size: 150%; line-height: 1.5; }

Bilder

Image-Tag

  • Funfact: Die gleichen Leute, die sich img ausgedacht haben (Netscape) fanden dann auch, dass img zu kompliziert sei und bauten image als Alias ein
  • Eine Studie aus dem Jahre 2005 zeigte, dass rund 0.2% aller Seiten das <image> Element benutzen
  • Weshalb es bis heute von jedem Browser schweigend unterstützt wird

Betitelte Bilder

<figure>
    <img src="wikipedia.png" alt="Wikipedia">
    <figcaption>Die freie Enzyklopädie</figcaption>
</figure>
body {
   display: flex;
   justify-content: space-around;
   align-items: center;
}
* { font-size: 23px; }
  • width und height helfen Browser, Größe vorher zu wissen und verhindern Sprünge

iFrames

<iframe
 src="https://beier.f4.htw-berlin.de/"
 height="321" width="357"
 frameborder="0">
 Kann keine iFrames.
</iframe>

Listen

<ul>
   <li>Tick</li>
   <li>Trick</li>
   <li>Track</li>
</ul>

<ol>
   <li>Schlafen</li>
   <li>Essen</li>
   <li>Lernen</li>
</ol>

<dl>
   <dt>HTTP</dt>
   <dd>Hypertext Transfer Protocol</dd>
   <dt>HTML</dt>
   <dd>Hypertext Markup Language</dd>
</dl>
* { font-size: 23px; }
  • Anhand der lis zeigen, dass Tag nicht mehr geschlossen werden muss (aber schlechter Stil)

Tabellen

<table>
   <tr>
      <th>Stadt</th>
      <th>Land</th>
      <th>Fluss</th>
   </tr>
   <tr>
      <td>Berlin</td>
      <td>Deutschland</td>
      <td>Spree</td>
   </tr>
   <tr>
      <td>London</td>
      <td>England</td>
      <td>Themse</td>
   </tr>
</table>

<br><br>
<a href="http://css-tricks.com/complete-guide-table-element/">A Complete Guide to the Table Element</a>
* {
   font-size: 23px;
   text-align: left;
   padding: 0 10px 10px 0;
}

Formulare

<form action="index.php" method="POST">
   <input type="text" name="stadt" placeholder="Stadt">
   <label for="nl">Newsletter?</label>
   <input id="nl" type="checkbox" name="nl" checked>
   <input type="number" name="alter" value="42">
   <button type="submit">Absenden</button>
</form>
* { font-size: 20px; }
  • radio: Mehrfachoptionsfelder
  • file: Dateiauswahl
  • reset: Tabula Rasa

Formulare – Input Types

<input type="password">
<input type="email">
<input type="tel">
<input type="url">
<input type="date">
<input type="week">
<input type="month">
<input type="time">
<input type="color">
<input type="number">
<input type="range">
<input type="search">
* { font-size: 17px; }
input {
   display: block;
   width: 100%;
}
  • text: default
  • hidden: Nicht sichtbare Felder, werden auch übermittelt
  • password: Inhalt visuell verschleiert
  • image + src-Attribut: Bild-Button (uargs, dann doch gleich button)

Formulare – Input Attributes

<input autofocus>
<input inputmode="numeric">
<input autocomplete="off">
<input autocomplete="email">
<input autocomplete="one-time-code">
<input disabled value="nein">
<input readonly value="nur zum Kopieren">
<input minlength="3" maxlength="7">
<input required>
<input pattern="^[0-9]{5}$">
<input tabindex="-1">
* { font-size: 17px; }
input {
   display: block;
   width: 100%;
}
input:focus:valid { background-color: #caecae }
input:focus:invalid { background-color: #ffcece }
  • one-time-code: auto-insert für 2FA-SMS-Codes
  • tabindex kann auf jedem Element liegen, aber gerade bei Formularen sinnvoll (z.B. tabindex="-1" wird es beim Tabben ausgelassen, mit 0 fügt es sich in den normalen Fluss ein)

Formulare – Dropdown-Liste

<select name="produkte">
   <optgroup label="Defensiv">
      <option>Schild</option> <option>Rüstung</option>
   </optgroup>
   <optgroup label="Offensiv">
      <option>Schwert</option> <option selected>Bogen</option>
   </optgroup>
   <optgroup label="Premium" disabled>
      <option>Heiltrank</option> <option>Tarnmantel</option>
   </optgroup>
</select>
body { text-align: center; }

Container

<header>  <h1>Schau an was ich esse</h1> <nav> (...) </nav>  </header>

<div> Bedeutungslose Hülle </div>

<section>
   <h2>Wochenmahl</h2>
   <article>  <h3>Nudeln</h3>  <p>Nudeln mit Soße</p>  </article>
   <aside>  <a href="/archiv">Archiv des letzten Monats</a> </aside>
</section>

<footer>  <p>Lirum larum, Löffelstiel.</p>  </footer>
  • section: thematische Gruppierung von Inhalten typischerweise mit einer Überschrift
  • article: für sich geschlossene Abschnitte (können herausgelöst werden und ergeben noch Sinn)
  • aside: Am Rande erwähnenswert

Spezielle Attribute

  • id
    • dokumentenweiter, einzigartiger Name zur Identifizierung eines Elements
    • id = fragment identifier, dadurch verlinkbar
  • class
    • Klassifizierung / semantische Gruppierung mehrerer Elemente
  • title
    • Ergänzender Text zu einem Element (häufig für Toltips benutzt)
  • viertes wäre style, dazu nächstes Mal mehr

Semantik

  • Hervorhebung der Bedeutung / der Natur / des Wesens eines Inhalts

Elemente

  • standardisierte, globale, maschinenlesbare Bedeutung

Klassen / IDs

  • frei wählbare, lokale, für Entwickler relevante Bedeutung
  • selten für Maschinen bedeutsam
  • primär Ankerpunkte für CSS und JavaScript
  • HTML bietet zwei grundlegende Wege der semantischen Auszeichnung
  • Klassen und IDs (als Attribute)
    • für eine lokale, anwendungsspezifische Bedeutung
    • wenig bis keine semantische Bedeutung für Maschinen
  • selten weil Microformats

  • Styling ist egal! Semantik vor allem wichtig, für SEO und Accessibility mit Assistive Devices wie Screen Reader
  • für nicht-indizierte Seiten wie In-House-Anwendungen deutlich weniger wichtig

HTML5

Quelle: SirPepe