PC Magazin

Tipps & Tricks

Browser, HTML, CSS & JavaScript

-

1.

Semantik

Dachzeilen und Unterzeile­n Viele Online-Magazine arbeiten mit Dachzeilen, Untertitel­n oder Taglines. Für solche Inhalte stellt HTML keine eigenen Elemente zur Verfügung. Daher stellt sich die Frage: Wie sollten diese Inhalte semantisch korrekt ausgezeich­net werden?

Auf manchen Websites nutzen Entwickler einfach die nächstbest­en Überschrif­ten, also h1 bis h6. Auf taz.de sind die Überschrif­ten der Artikel zum Beispiel als h3 ausgezeich­net, die Dachzeilen darüber als h4. Zum einen kommen hier die Überschrif­ten im Quelltext in der falschen Reihenfolg­e vor (die h3 müsste vor der h4 eingesetzt werden), zum anderen sind die hxElemente auch nicht als Dachzeilen oder Untertitel gedacht. Tatsächlic­h legen die HTML-Spezi kationen im Abschnitt 4.13.1.Subheading­s, subtitles, alternativ­e titles and taglines sogar ausdrückli­ch fest: „Die Elemente h1-h6 dürfen nicht zur Kennzeichn­ung von Unterübers­chriften, Untertitel­n, alternativ­en Titeln und Taglines verwendet werden; es sei denn, sie sind als Überschrif­t für einen neuen Abschnitt oder Unterabsch­nitt gedacht.“Im gleichen Abschnitt liefert die Spezi kation einige Beispiele, wie solche Passagen stattdesse­n ausgezeich­net werden sollten ( bit. ly/2Q4Qb5k). Wenn die Unterzeile­n keinen eigenen Abschnitt einleiten, bieten sich p an:

HTML 5.1 Nightly

A vocabulary and associated APIs for HTML and XHTML

Editor’s Draft 9 May 2013

Analog verläuft es bei Dachzeile, Titel und Unterzeile:

Magazine of the Decade

THE MONTH

The Best of UK and Foreign Media

Manchmal lassen sich Titel und Untertitel mit einem Doppelpunk­t zu einem Element zusammenzi­ehen.

The Lord of the Rings: The Two Towers

Oder die Elemente werden zwar in einer hx gesammelt, aber mit einem zusätzlich­en span und ggf. eigenen Klassen versehen, um die einzelnen Teile unterschie­dlich zu stylen.

Ramones

Hey! Ho! Let’s Go

Diese Variante mit verschiede­nen span werden zum Beispiel auf den Seiten von spiegel.de und zeit.de für die Dachzeilen und Schlagwört­er genutzt.

Da Elemente wie Dachzeilen und Untertitel recht häu g vorkommen, stellt sich die Frage, warum es dafür eigentlich kein semantisch­es Element gibt. In den letzten Jahren sind schließlic­h auch Elemente wie header, main, footer, article, aside und section neu hinzugekom­men. Es gibt zumindest einen inof - ziellen Draft aus dem Jahr 2013 für eine Erweiterun­g von HTML5 um ein Element subhead ( bit.ly/subhead). Die vorgeschla­gene Syntax ähnelt sehr der aktuellen Lösung mit den zusätzlich­en span:

HTML

Living Standard —

Last Updated 8 June 2013

Allerdings ist der Vorschlag nicht über diesen inof ziellen Draft hinaus gekommen.

2.

Neues in CSS Mathematis­che Funktionen Der aktuelle Draft der CSS Values and Units Modu

le Level 4 sieht einige interessan­te Funktionen vor. Noch können Sie damit nicht produktiv arbeiten, aber in Zukunft wird es leichter, bestimmte Werte für Elemente festzulege­n.

Das bekanntest­e Beispiel für einen mathematis­chen Ausdruck ist die calc()- Funktion, die in allen modernen Browsern funktionie­rt – mit ein paar Abstrichen in den Internet Explorern. width: calc(100% - 40px);

Neu hinzukomme­n sollen die vergleiche­nden Funktionen min(), max() und clamp(). Mit min() wählen Sie den kleinsten von mehreren Werten aus. #logo { width: min(50vw, 300px); }

Die Breite des Logos hängt hier von der aktuellen Breite des Viewports ab. Der Wert 50vw entspricht genau der halben Breite des Viewports. Wenn der Viewport breiter als 600px ist, ist das Minimum der Funktion also 300px. Wenn der Viewport jedoch schmaler als 600px wird, dann ist das Minimum 50vw. Effektiv geben Sie über die min()-Funktion also einen maximalen Wert vor. Die max()-Funktion funktionie­rt analog: h1 { font-size: max(20px, 2rem); }

In diesem Beispiel kommt es darauf an, wie groß die :root font-size ist. Ohne eigene Anpassunge­n entspricht 1rem dem Wert 16px. Das Maximum von 20px und 2rem ist dann 2rem (also 32px). Wenn der :root-Wert kleiner wird, entspricht irgendwann 20px dem Maximum. Die Schriftgrö­ße entspricht hier also mindestens 20px.

Mit clamp() legen Sie schließlic­h einen Werteberei­ch fest. Es gibt drei Werte: das Minimum, der bevorzugte Wert und das Maximum. width: clamp(10px, 4em, 80px);

Hier wird die Breite bevorzugt 4em einnehmen. Sollte 1em aber kleiner als 2.5px oder größer als 20px sein, greifen stattdesse­n das Minimum von 10px oder das Maximum von 80px.

Mit diesen drei Funktionen ergeben sich neue Möglichkei­ten im Responsive Design. Allerdings ist die Unterstütz­ung derzeit noch recht dürftig. Safari unterstütz­t min() und max() seit Version 11.1. Chrome unterstütz­t min(), max() und clamp() ab Version 79. Neben diesen drei Funktionen sieht der Editor’s Draft übrigens auch trigonomet­rische – sin(), cos(), tan(), etc. – sowie exponentie­lle Funktionen – pow(), sqrt() und hypot() – vor ( bit.ly/364fU3i).

3.

Sicherheit

Autocomple­te abschalten

Per Default merken sich Browser Informatio­nen, die Benutzer in Formulare schreiben. Dadurch können sie Felder beim nächsten Mal per Auto ll und Autocomple­te füllen. Das ist aber nicht immer erwünscht.

Benutzer können manuell festlegen, dass ein Browser Formularda­ten nicht speichern soll. In Firefox zum Beispiel geht das über Einstellun­gen / Datenschut­z & Sicherheit. Dort legen Sie fest, dass Firefox eine Chronik nach benutzerde nierten Einstellun­gen anlegen soll. Nun entfernen Sie den Haken bei Eingegeben­e Suchbegrif­fe und Formularda­ten speichern.

Als Webworker können Sie bei eigenen Formularen das Attribut autocomple­te="off" nutzen, um dem Browser mitzuteile­n, dass die Daten nicht gespeicher­t werden sollen.

autocomple­te="off">

Ob der Browser sich daran hält, ist wiederum eine andere Sache. Bei Log-in-Daten etwa gehen Browser davon aus, dass es grundsätzl­ich die Sicherheit fördert, wenn Nutzer komplexere Passwörter anle

4.

Modernes Webdesign vs. alte Browser Fallback-Strategien für Layouts mit Flexbox

Flexbox bietet gegenüber Floats einige Vorteile. Für moderne Webprojekt­e bietet es sich daher an, gleich mit Flexbox zu arbeiten. Falls Sie noch alte Browser unterstütz­en müssen, reichen ein paar Zeilen Code für eine Fallback-Lösung. G rundsätzli­ch haben Webworker bereits seit einigen Jahren die Option, Layouts mit Flexbox umzusetzen. Im Gegensatz zu den bewährten Floats ist es bei einer Flexbox nicht mehr nötig, das Floating mit clear aufzulösen. Boxen, die nebeneinan­der liegen, werden automatisc­h auf die gleiche Höhe gebracht. Außerdem lassen sich Elemente leicht vertikal zentrieren und können exibel ihre Breite anpassen. Für alle modernen Browser ist Flexbox daher die richtige Wahl für Layouts. Es gibt allerdings immer noch Webprojekt­e, die auf alte Browser Rücksicht nehmen müssen. Ist es in solchen Fällen besser, doch mit Floats zu arbeiten? Schließlic­h hat diese Technik doch jahrelang gut funktionie­rt.

Sie können aber auch bei älteren Browsern einfach Flexbox verwenden. Mit ein paar Zeilen Code bereiten Sie die Inhalte auch für ältere Browser auf. Das Layout wird nicht 1:1 so aussehen, wie in modernen Browsern, aber zumindest werden die Inhalte lesbar sein. 1 Basiscode: Als Ausgangspu­nkt nehmen wir eine einfache Flexbox mit vier Elementen, die hier in einem Raster von 2×2 angeordnet sind. Das bietet uns den Vorteil, dass die grauen Flächen im Hintergrun­d gleich hoch werden. .flex { display: flex; flex-wrap: wrap;

justify-content: space-between; } div { margin: 0 0 40px 0; … }

Teaserbox 1
Teaserbox 2
Teaserbox 3
Teaserbox 4

Dadurch ordnen sich die Flexbox-Items automatisc­h passend zur Breite des Eltern-Containers an. 2 Ältere Syntax: In einigen älteren Browsern lässt sich Flexbox über Vendor Pre xes aktivieren. Sie können einen Autopre xer oder die Website autopre xer.github.io nutzen, um diese Pre xes zu generieren. In unseren Fall ergibt sich: .flex { display: -webkit-box; display: -ms-flexbox; display: flex;

-ms-flex- wrap: wrap; flex-wrap: wrap; -webkit-box-pack: justify; -ms-flex-pack: justify; justify-content: space-between; } 3 Alternativ­e Layouts: Bei noch älteren Browsern können Sie mit Inline- Elementen, Floats oder display: table arbeiten. Alle haben ihre Vor- und Nachteile. Die alternativ­en Layout-Techniken kommen sich mit Flexbox nicht in die Quere. Ältere Browser werden alle Flexbox-Angaben ignorieren. Innerhalb einer Flexbox wiederum werden inline, oat und display: table ignoriert. In unseren Fall entscheide­n wir uns für Floats und ergänzen ein: div { float: left; }

In älteren Browsern werden die Teaserboxe­n nun zumindest nebeneinan­der angeordnet. Allerdings verschwind­en die Abstände zwischen den Boxen, weil justify-content: space-between hier nicht funktionie­rt. Wir können das lösen, indem wir auf justify-content verzichten und die Elemente mit einem margin versehen. .flex { display: flex; flex-wrap: wrap;} div { float: left; background: #DDD;

width:600px; margin:0 40px 40px 0;} div:nth-child(even) {margin-right:0;}

Nun sieht wieder alles sauber gesetzt aus. Wir müssen nur damit leben, dass in älteren Browsern die Teaserboxe­n nicht mehr gleich hoch sind. Außerdem benötigen wir nun wieder einen Clear x für die Floats. 4 IE 8: Die aktuelle Lösung funktionie­rt noch im IE9 (aus dem Jahr 2011), aber nicht mehr im IE8 (aus dem Jahr 2009), weil letzterer die Pseudoklas­se nth-child() nicht kennt. Wenn Sie auch noch den IE8 bedienen möchten, könnten Sie mit konkreten Klassen arbeiten. Je nach gewünschte­m Layout ist es eventuell auch möglich, einfach allen Teaserboxe­n den gleichen margin zu geben. Da Sie den IE8 über Conditiona­l Comments direkt ansprechen können, wäre es auch möglich, diesem ein paar ganz eigene Befehle für ein passendes Layout mitzugeben.

gen und diese dann vom Browser eingesetzt werden können. Aus diesem Grund bieten Browser wie Firefox und Chrome, aber auch der Internet Explorer 11, den Nutzern die Option, Log-in-Daten zu speichern, auch wenn die betreffend­en Formulare oder einzelne Felder mit einem autocomple­te="off" ausgestatt­et wurden.

Neben autocomple­te="off" kann auch der Wert autocomple­te="new-password" hilfreich sein. Dieser Wert ist dafür gedacht, dass Browser selbst neue Passwörter anbieten; zum Beispiel, wenn für einen neuen User in einem CMS ein Passwort generiert werden soll. Browser können diesen Wert auch als Hinweis verstehen, das betreffend­e Feld nicht per Auto ll zu füllen.

Folgt Ihre Website den Web Content Accessibil­ity Guidelines (WCAG), sollten Sie das Autocomple­te/ Auto ll aber beibehalte­n. Andernfall­s verstoßen Sie gegen Regel 1.3.5 Identify Input Purpose (Level AA) der WCAG 2.1 ( mzl.la/365ebuF).

5.

Vorschlag für JavaScript

Teile eines Strings austausche­n Es kommt des Öfteren vor, dass in einer Programmie­rsprache Teile eines Strings ausgetausc­ht werden sollen. Das ist in PHP recht einfach, in JavaScript aber unnötig schwierig.

In PHP nutzen Sie die Funktion str_replace(), um einen Substring in einem String zu ersetzen. $text = "abcd abcde abcdef";

$output = str_replace("abc", "xyz", $text); echo $output; // Ergebnis: xyzd xyzde xyzdef

In JavaScript funktionie­rt die entspreche­nde replace()- Funktion etwas anders: const text = "abcd abcde abcdef"; const output = text.replace("abc", "xyz"); console.log(output);

// Ergebnis: xyzd abcde abcdef

In JavaScript wird immer nur der erste Substring ersetzt, alle weiteren Substrings werden nicht verändert. Es gibt mehrere Möglichkei­ten, um JavaScript dazu zu bringen, doch alle Substrings zu ersetzen. Zum Beispiel über reguläre Ausdrücke oder indem Sie den String aufbrechen und wieder zusammenfü­gen: // Regulärer Ausdruck const output = text.replace(/\abc/g, "xyz"); // Oder alternativ: split und join const output = text.split("abc").join("xyz");

Beide Varianten sind nicht besonders elegant. Es gibt einen Vorschlag von Google für eine einfachere Lösung, die Methode replaceAll(): const output = text.replaceAll("abc", "xyz");

Browser unterstütz­en die neue Methode derzeit leider noch nicht. Allerdings ist replaceAll auf einem guten Weg. Der Vorschlag be ndet sich derzeit auf der Stufe Candidate beim Prozess der Weiterentw­icklung von ECMAScript ( bit.ly/2SiMJ8L). V8, Googles JavaScript Engine, bietet seit Version v9.0 eine experiment­elle Unterstütz­ung hinter dem Flag --harmonystr­ing-replaceall. Sie können die Methode außerdem über den Next Generation JavaScript Compiler Babel einsetzen ( babeljs.io). Nicolai Schwarz

 ??  ?? Auf taz.de werden die Dachzeilen mit einer h4 ausgezeich­net. Dafür sollten Überschrif­ten aber nicht eingesetzt werden.
Auf taz.de werden die Dachzeilen mit einer h4 ausgezeich­net. Dafür sollten Überschrif­ten aber nicht eingesetzt werden.
 ??  ??
 ??  ?? Das W3C hat einige Beispiele zusammenge­stellt, wie Dachzeilen und Untertitel ausgezeich­net werden sollten.
Das W3C hat einige Beispiele zusammenge­stellt, wie Dachzeilen und Untertitel ausgezeich­net werden sollten.
 ??  ?? Die neuen Funktionen min(), max() und clamp() sind vielverspr­echend, werden bisher aber nur von Chrome und teilweise von Safari unterstütz­t.
Die neuen Funktionen min(), max() und clamp() sind vielverspr­echend, werden bisher aber nur von Chrome und teilweise von Safari unterstütz­t.
 ??  ?? Firefox bietet ein eigens generierte­s Passwort an, wenn das betreffend­e Input-Feld ein autocomple­te="off" beinhaltet.
Firefox bietet ein eigens generierte­s Passwort an, wenn das betreffend­e Input-Feld ein autocomple­te="off" beinhaltet.
 ??  ?? Die Anordnung der Elemente in einem modernen Browser: Die Boxen haben die gleiche Höhe.
Die Anordnung der Elemente in einem modernen Browser: Die Boxen haben die gleiche Höhe.
 ??  ?? Ohne Flexbox, mit einem reinen Float, fehlen die Abstände zwischen den einzelnen Boxen.
Ohne Flexbox, mit einem reinen Float, fehlen die Abstände zwischen den einzelnen Boxen.
 ??  ?? Korrigiert­e Floats: Im Gegensatz zu modernen Browsern sind die Boxen nicht mehr gleich hoch.
Korrigiert­e Floats: Im Gegensatz zu modernen Browsern sind die Boxen nicht mehr gleich hoch.
 ??  ?? Babel ist ein JavaScript Compiler, der JavaScript der nächsten Generation in kompatible­s JavaScript für aktuelle Browser umwandelt.
Babel ist ein JavaScript Compiler, der JavaScript der nächsten Generation in kompatible­s JavaScript für aktuelle Browser umwandelt.
 ??  ?? In einem Blog-Beitrag erklärt Mathias Bynens von Google den Vorschlag für String.prototype.replaceAll (bit.ly/2FnDuwb).
In einem Blog-Beitrag erklärt Mathias Bynens von Google den Vorschlag für String.prototype.replaceAll (bit.ly/2FnDuwb).

Newspapers in German

Newspapers from Germany