HTML

Was bewirkt ein DOCTYPE?

DOCTYPE ist eine Abkürzung für Dokumenttyp. Ein DOCTYPE ist immer mit einer DTD – für Dokumenttypdefinition – verbunden.

Eine DTD definiert, wie Dokumente eines bestimmten Typs strukturiert sein sollten (d.h. ein button kann ein span enthalten, aber kein div), während ein DOCTYPE deklariert, welche DTD ein Dokument angeblich respektiert (d.h. dieses Dokument respektiert die HTML-DTD).

Für Webseiten ist die DOCTYPE-Deklaration erforderlich. Sie wird verwendet, um Benutzeragenten mitzuteilen, welche Version der HTML-Spezifikationen Ihr Dokument respektiert. Sobald ein Benutzeragent einen korrekten DOCTYPE erkannt hat, wird er den No-Quirks-Modus auslösen, der diesem DOCTYPE zum Lesen des Dokuments entspricht. Wenn ein Benutzeragent keinen korrekten DOCTYPE erkennt, wird er den Quirks-Modus auslösen.

Die DOCTYPE-Deklaration für die HTML5-Standards lautet <!DOCTYPE html>.

Wie stellt man eine Seite mit Inhalten in mehreren Sprachen bereit?

Ich gehe davon aus, dass es um den häufigsten Fall geht, nämlich wie man eine Seite mit Inhalten in mehreren Sprachen bereitstellt, wobei der Inhalt innerhalb der Seite jedoch nur in einer konsistenten Sprache angezeigt werden soll.

Wenn eine HTTP-Anfrage an einen Server gestellt wird, sendet der anfragende Benutzeragent normalerweise Informationen über Spracheinstellungen, wie z.B. im Accept-Language-Header. Der Server kann diese Informationen dann nutzen, um eine Version des Dokuments in der entsprechenden Sprache zurückzugeben, falls eine solche Alternative verfügbar ist. Das zurückgegebene HTML-Dokument sollte auch das lang-Attribut im <html>-Tag deklarieren, wie z.B. <html lang="en">...</html>.

Dies ist natürlich nutzlos, um einer Suchmaschine mitzuteilen, dass derselbe Inhalt in verschiedenen Sprachen verfügbar ist, und so müssen Sie auch das hreflang-Attribut im <head> verwenden. Z.B. <link rel="alternate" hreflang="de" href="http://de.example.com/page.html" />

Im Backend enthält das HTML-Markup i18n-Platzhalter und Inhalte für die spezifische Sprache, die in YML- oder JSON-Formaten gespeichert sind. Der Server generiert dann dynamisch die HTML-Seite mit Inhalten in dieser bestimmten Sprache, normalerweise mithilfe eines Backend-Frameworks.

Worauf muss man bei der Gestaltung oder Entwicklung mehrsprachiger Websites achten?

  • Verwenden Sie das lang-Attribut in Ihrem HTML.
  • Benutzer zu ihrer Muttersprache leiten - Ermöglichen Sie es einem Benutzer, sein Land/seine Sprache einfach und problemlos zu ändern.
  • Text in rasterbasierten Bildern (z.B. png, gif, jpg usw.) ist kein skalierbarer Ansatz - Das Platzieren von Text in einem Bild ist immer noch eine beliebte Methode, um gut aussehende, nicht-systemeigene Schriftarten auf jedem Computer anzuzeigen. Um jedoch Bildtext zu übersetzen, muss für jede Textzeichenfolge ein separates Bild für jede Sprache erstellt werden. Mehr als eine Handvoll solcher Ersetzungen kann schnell außer Kontrolle geraten.
  • Restriktive Wort-/Satzlänge - Einige Inhalte können länger sein, wenn sie in einer anderen Sprache geschrieben werden. Achten Sie auf Layout- oder Überlaufprobleme im Design. Es ist am besten, ein Design zu vermeiden, bei dem die Textmenge das Design entscheidend beeinflussen würde. Zeichenzahlen spielen bei Überschriften, Beschriftungen und Schaltflächen eine Rolle. Bei frei fließendem Text wie Fließtext oder Kommentaren sind sie weniger ein Problem.
  • Achten Sie darauf, wie Farben wahrgenommen werden - Farben werden in verschiedenen Sprachen und Kulturen unterschiedlich wahrgenommen. Das Design sollte Farben angemessen verwenden.
  • Formatierung von Daten und Währungen - Kalenderdaten werden manchmal unterschiedlich dargestellt. Z.B. "May 31, 2012" in den USA vs. "31 May 2012" in Teilen Europas.
  • Verketteten Sie keine übersetzten Zeichenfolgen - Tun Sie nichts wie "Das heutige Datum ist " + date. Es wird in Sprachen mit anderer Wortstellung fehlschlagen. Verwenden Sie stattdessen eine Vorlagenzeichenfolge mit Parameterersetzung für jede Sprache. Betrachten Sie zum Beispiel die folgenden beiden Sätze auf Englisch bzw. Chinesisch: I will travel on {% date %} und {% date %} 我会出发. Beachten Sie, dass die Position der Variablen aufgrund der Grammatikregeln der Sprache unterschiedlich ist.
  • Lesrichtung der Sprache - Im Englischen lesen wir von links nach rechts, von oben nach unten, im traditionellen Japanischen wird Text von oben nach unten, von rechts nach links gelesen.
  • Nützlich zu haben - Fügen Sie das Gebietsschema in den Pfad ein (z.B. en_US, zh_CN usw.).

Wofür sind `data-`-Attribute gut?

Bevor JavaScript-Frameworks populär wurden, verwendeten Frontend-Entwickler data--Attribute, um zusätzliche Daten direkt im DOM zu speichern, ohne andere Hacks wie nicht standardisierte Attribute oder zusätzliche Eigenschaften im DOM. Es ist dazu gedacht, benutzerdefinierte Daten zu speichern, die privat für die Seite oder Anwendung sind und für die es keine passenderen Attribute oder Elemente gibt.

Heutzutage wird die Verwendung von data--Attributen im Allgemeinen nicht mehr empfohlen. Ein Grund ist, dass Benutzer das Datenattribut einfach über die Inspektionsfunktion des Browsers ändern können. Das Datenmodell wird besser direkt in JavaScript gespeichert und über Datenbindung, möglicherweise durch eine Bibliothek oder ein Framework, mit dem DOM aktualisiert.

Eine jedoch völlig gültige Verwendung von Datenattributen ist das Hinzufügen eines Hooks für End-to-End-Testframeworks wie Selenium und Capybara, ohne aussichtslose Klassen oder ID-Attribute erstellen zu müssen. Das Element benötigt eine Möglichkeit, von einer bestimmten Selenium-Spezifikation gefunden zu werden, und so etwas wie data-selector='the-thing' ist eine gültige Methode dafür, ohne das semantische Markup anderweitig zu verfälschen.

Betrachten Sie HTML5 als offene Webplattform. Was sind die Bausteine von HTML5?

  • Semantik - Ermöglicht es Ihnen, Ihre Inhalte präziser zu beschreiben.
  • Konnektivität - Ermöglicht die Kommunikation mit dem Server auf neue und innovative Weise.
  • Offline und Speicher - Ermöglicht Webseiten, Daten clientseitig lokal zu speichern und offline effizienter zu arbeiten.
  • Multimedia - Macht Video und Audio zu erstklassigen Bürgern im Open Web.
  • 2D/3D-Grafiken und -Effekte - Ermöglicht eine wesentlich vielfältigere Auswahl an Präsentationsoptionen.
  • Leistung und Integration - Bietet größere Geschwindigkeitsoptimierung und bessere Nutzung der Computerhardware.
  • Gerätezugriff - Ermöglicht die Nutzung verschiedener Eingabe- und Ausgabegeräte.
  • Styling - Ermöglicht Autoren, komplexere Themes zu schreiben.

Beschreiben Sie den Unterschied zwischen einem `cookie`, `sessionStorage` und `localStorage`.

Alle oben genannten Technologien sind Schlüssel-Wert-Speichermechanismen auf Clientseite. Sie können Werte nur als Zeichenketten speichern.

| | cookie | localStorage | sessionStorage | | --- | --- | --- | --- | | Initiator | Client oder Server. Server kann Set-Cookie Header verwenden | Client | Client | | Ablauf | Manuell gesetzt | Für immer | Beim Schließen des Tabs | | Persistent über Browsersitzungen hinweg | Hängt davon ab, ob ein Ablaufdatum gesetzt ist | Ja | Nein | | Wird bei jeder HTTP-Anfrage an den Server gesendet | Cookies werden automatisch über den Cookie-Header gesendet | Nein | Nein | | Kapazität (pro Domain) | 4kb | 5MB | 5MB | | Zugänglichkeit | Jedes Fenster | Jedes Fenster | Derselbe Tab |

Hinweis: Wenn der Benutzer entscheidet, Browserdaten über einen beliebigen vom Browser bereitgestellten Mechanismus zu löschen, werden alle gespeicherten cookie, localStorage oder sessionStorage gelöscht. Dies ist wichtig zu beachten, wenn man lokale Persistenz entwirft, insbesondere im Vergleich zu Alternativen wie der serverseitigen Speicherung in einer Datenbank oder ähnlichem (die natürlich trotz Benutzeraktionen bestehen bleibt).

Beschreiben Sie den Unterschied zwischen `<script>`, `<script async>` und `<script defer>`.

  • <script> - Das HTML-Parsing wird blockiert, das Skript wird sofort abgerufen und ausgeführt, das HTML-Parsing wird nach der Ausführung des Skripts fortgesetzt.
  • <script async> - Das Skript wird parallel zum HTML-Parsing abgerufen und ausgeführt, sobald es verfügbar ist (potenziell bevor das HTML-Parsing abgeschlossen ist). Verwenden Sie async, wenn das Skript unabhängig von anderen Skripten auf der Seite ist, zum Beispiel für Analysen.
  • <script defer> - Das Skript wird parallel zum HTML-Parsing abgerufen und ausgeführt, wenn die Seite vollständig geparst wurde. Wenn es mehrere davon gibt, wird jedes verzögerte Skript in der Reihenfolge ausgeführt, in der es im Dokument gefunden wurde. Wenn ein Skript von einem vollständig geparsten DOM abhängt, ist das defer-Attribut nützlich, um sicherzustellen, dass das HTML vollständig geparst ist, bevor das Skript ausgeführt wird. Ein verzögertes Skript darf kein document.write enthalten.

Hinweis: Die Attribute async und defer werden für Skripte ohne src-Attribut ignoriert.

Warum ist es im Allgemeinen eine gute Idee, CSS `<link>`-Tags zwischen `<head></head>` und JS `<script>`-Tags direkt vor `</body>` zu positionieren? Kennen Sie Ausnahmen?

Platzierung von <link>-Tags im <head>

Das Platzieren von <link>-Tags im <head> ist Teil der korrekten Spezifikation für den Aufbau einer optimierten Website. Beim ersten Laden einer Seite werden HTML und CSS gleichzeitig geparst; HTML erstellt das DOM (Document Object Model) und CSS das CSSOM (CSS Object Model). Beides wird benötigt, um die visuellen Elemente einer Website zu erstellen, was eine schnelle "erste aussagekräftige Darstellung" ermöglicht. Dieses progressive Rendering ist eine Kategorie, in der die Leistung von Optimierungs-Websites gemessen wird. Das Platzieren von Stylesheets am unteren Ende des Dokuments verhindert das progressive Rendering in vielen Browsern. Einige Browser blockieren das Rendering, um ein erneutes Malen von Seitenelementen zu vermeiden, wenn sich deren Stile ändern. Der Benutzer sieht dann eine leere weiße Seite. In anderen Fällen kann es zu einem "Flickern von ungestyltem Inhalt" (FOUC) kommen, bei dem eine Webseite ohne angewendetes Styling angezeigt wird.

Platzierung von <script>-Tags direkt vor </body>

<script>-Tags blockieren das HTML-Parsing, während sie heruntergeladen und ausgeführt werden, was Ihre Seite verlangsamen kann. Das Platzieren der Skripte am Ende ermöglicht es, dass das HTML zuerst geparst und dem Benutzer angezeigt wird.

Eine Ausnahme für die Positionierung von <script>-Tags am Ende ist, wenn Ihr Skript document.write() enthält, aber heutzutage ist es keine gute Praxis, document.write() zu verwenden. Außerdem bedeutet das Platzieren von <script>-Tags am Ende, dass der Browser die Skripte erst herunterladen kann, wenn das gesamte Dokument geparst ist. Dies stellt sicher, dass Ihr Code, der DOM-Elemente manipulieren muss, keinen Fehler auslöst und das gesamte Skript anhält. Wenn Sie <script>-Tags im <head> platzieren müssen, verwenden Sie das defer-Attribut, das den gleichen Effekt erzielt, dass das Skript erst nach dem Parsen des HTML ausgeführt wird, der Browser das Skript aber früher herunterladen kann.

Beachten Sie, dass das Platzieren von Skripten direkt vor dem schließenden </body>-Tag die Illusion erzeugt, dass die Seite bei einem leeren Cache schneller lädt (da die Skripte das Herunterladen des restlichen Dokuments nicht blockieren). Wenn Sie jedoch Code haben, den Sie während des Seitenladevorgangs ausführen möchten, wird dieser erst nach dem Laden der gesamten Seite ausgeführt. Wenn Sie diese Skripte im <head>-Tag platzieren, würden sie früher ausgeführt – bei einem vorab gefüllten Cache würde die Seite also tatsächlich schneller zu laden scheinen.

<head>- und <body>-Tags sind jetzt optional

Gemäß der HTML5-Spezifikation sind bestimmte HTML-Tags wie <head> und <body> optional. Googles Styleguide empfiehlt sogar, sie zu entfernen, um Bytes zu sparen. Diese Praxis ist jedoch noch nicht weit verbreitet, und der Leistungsgewinn ist wahrscheinlich minimal, und für die meisten Websites wird es wahrscheinlich keine Rolle spielen.

Was ist progressives Rendering?

Progressives Rendering ist der Name für Techniken, die verwendet werden, um die Leistung einer Webseite zu verbessern (insbesondere die wahrgenommene Ladezeit), um Inhalte so schnell wie möglich zur Anzeige zu rendern.

Es war früher in den Tagen vor dem Breitband-Internet viel verbreiteter, wird aber immer noch in der modernen Entwicklung verwendet, da mobile Datenverbindungen immer beliebter (und unzuverlässiger) werden!

Beispiele für solche Techniken:

  • Lazy Loading von Bildern - Bilder auf der Seite werden nicht alle auf einmal geladen. JavaScript wird verwendet, um ein Bild zu laden, wenn der Benutzer in den Teil der Seite scrollt, der das Bild anzeigt.
  • Priorisierung sichtbarer Inhalte (oder Above-the-fold-Rendering) - Nur die minimalen CSS/Inhalte/Skripte einbeziehen, die für den Teil der Seite, der zuerst im Browser des Benutzers gerendert werden würde, erforderlich sind, um so schnell wie möglich angezeigt zu werden. Sie können dann verzögerte Skripte verwenden oder auf das DOMContentLoaded/load-Ereignis warten, um andere Ressourcen und Inhalte zu laden.
  • Asynchrone HTML-Fragmente - Teile des HTML an den Browser zu übergeben, während die Seite im Backend erstellt wird. Weitere Details zur Technik finden Sie.

Warum würden Sie ein `srcset`-Attribut in einem Image-Tag verwenden? Erklären Sie den Prozess, den der Browser bei der Auswertung des Inhalts dieses Attributs verwendet.

Sie würden das srcset-Attribut verwenden, wenn Sie Benutzern je nach Bildschirmbreite ihres Geräts unterschiedliche Bilder zur Verfügung stellen möchten – das Bereitstellen von Bildern höherer Qualität für Geräte mit Retina-Display verbessert das Benutzererlebnis, während das Bereitstellen von Bildern niedrigerer Auflösung für Low-End-Geräte die Leistung erhöht und Datenverschwendung reduziert (da das Bereitstellen eines größeren Bildes keinen sichtbaren Unterschied bewirkt). Zum Beispiel: <img srcset="small.jpg 500w, medium.jpg 1000w, large.jpg 2000w" src="..." alt=""> weist den Browser an, je nach Auflösung des Clients die kleine, mittlere oder große .jpg-Grafik anzuzeigen. Der erste Wert ist der Bildname und der zweite ist die Breite des Bildes in Pixeln. Bei einer Gerätebreite von 320px werden folgende Berechnungen durchgeführt:

  • 500 / 320 = 1,5625
  • 1000 / 320 = 3,125
  • 2000 / 320 = 6,25

Wenn die Auflösung des Clients 1x beträgt, ist 1,5625 am nächsten, und 500w entsprechend small.jpg wird vom Browser ausgewählt.

Wenn die Auflösung Retina (2x) beträgt, verwendet der Browser die nächstgelegene Auflösung über dem Minimum. Das bedeutet, er wird nicht die 500w (1,5625) wählen, da diese größer als 1 ist und das Bild schlecht aussehen könnte. Der Browser würde dann das Bild mit einem resultierenden Verhältnis wählen, das näher an 2 liegt, nämlich 1000w (3,125).

srcsets lösen das Problem, dass Sie kleineren Bilddateien an Geräte mit schmalem Bildschirm liefern möchten, da diese keine riesigen Bilder benötigen, wie es bei Desktop-Bildschirmen der Fall ist – und optional auch, dass Sie Bilder mit unterschiedlicher Auflösung an Bildschirme mit hoher/niedriger Dichte liefern möchten.

Haben Sie schon verschiedene HTML-Templating-Sprachen verwendet?

Ja, Pug (ehemals Jade), ERB, Slim, Handlebars, Jinja, Liquid und EJS, um nur einige zu nennen. Meiner Meinung nach sind sie mehr oder weniger gleich und bieten ähnliche Funktionen zum Escapen von Inhalten und hilfreiche Filter zur Manipulation der anzuzeigenden Daten. Die meisten Templating-Engines ermöglichen es Ihnen auch, Ihre eigenen Filter einzufügen, falls Sie eine benutzerdefinierte Verarbeitung vor der Anzeige benötigen.

Was ist der Unterschied zwischen Canvas und SVG?

Canvas ist rasterbasiert und arbeitet mit Pixeln, während SVG vektorbasiert ist und mathematische Beschreibungen von Formen verwendet. Canvas verwendet imperatives Zeichnen, wobei jeder Schritt mit JavaScript spezifiziert wird, ideal für dynamische und interaktive Grafiken wie Animationen und Spiele.

Umgekehrt verwendet SVG deklaratives Zeichnen, wobei Formen und Pfade direkt in HTML definiert werden, was es zugänglicher und SEO-freundlicher macht. Canvas ist aufgrund seines geringeren Overheads optimal für komplexe Szenen, aber die Skalierung kann zu einem Verlust der Bildqualität führen. SVG ist auflösungsunabhängig und passt sich verschiedenen Bildschirmgrößen an, ohne die Qualität zu beeinträchtigen.

Letztendlich eignet sich Canvas für dynamische, leistungsintensive Grafiken, während SVG sich durch skalierbare, auflösungsunabhängige Grafiken auszeichnet, mit inhärenten Vorteilen in Bezug auf Zugänglichkeit und SEO.

Was sind leere Elemente in HTML?

Leere Elemente in HTML sind Elemente, die keinen Inhalt zwischen ihren öffnenden und schließenden Tags enthalten. Stattdessen sind es selbstschließende Tags, was bedeutet, dass sie einen Schrägstrich (/) vor der schließenden spitzen Klammer (>) haben. Einige gängige Beispiele für leere Elemente sind:

  • <img>: Wird verwendet, um Bilder in das Dokument einzubetten.
  • <input>: Wird verwendet, um Benutzereingaben zu akzeptieren.
  • <br>: Wird verwendet, um Zeilenumbrüche oder erzwungene Zeilenumbrüche einzufügen.
  • <hr>: Wird verwendet, um horizontale Linien oder Trennzeichen zu erstellen.