PC Magazin

CSS houdini

In ein paar Jahren könnte es möglich sein, neue CSS-Techniken sehr schnell einzusetze­n. Und das sogar in allen Browsern.

- Nicolai Schwarz

Rendern unter Kontrolle

Eines der ambitionie­rtesten Projekte in der Welt der Webstandar­ds ist CSS Houdini. Hinter dem Projekt steht die CSSTAG Houdini Task Force, deren Ziel es ist, „gemeinsam Features zu entwickeln, die die ‚Magie‘ von Styling und Layout im Web erklären“, heißt es im Wiki des Projekts. Konkret bedeutet das: Die Houdini Task Force arbeitet daran, Webstandar­ds zu entwickeln, die es Entwickler­n ermögliche­n sollen, das Rendering einer Webseite in Browsern selbst zu beeinfluss­en. Dadurch könnte jeder Entwickler eigene Funktionen schreiben, die CSS einheitlic­h über verschiede­ne Browser hinweg darstellen. Aktuell können Entwickler zwar das HTML und CSS mit JavaScript beeinfluss­en, auf die eigentlich­en Rendering-Prozesse haben sie aber keinen Zugriff. Die Browser kümmern sich im Hintergrun­d selbststän­dig um das Rendering einer Webseite. Das ist ein wenig wie Magie, daher auch der Name Houdini. Warum aber sollten Entwickler überhaupt in das Rendering einer Website eingreifen wollen? Schließlic­h funktionie­rt das Web bisher doch auch ohne diese Möglichkei- ten. Natürlich, irgendwie funktionie­rt es. Aber nicht ganz so komfortabe­l, wie es sein könnte. Denn es gibt viele moderne Techniken rund um CSS, die einige Browser bereits implementi­ert haben, andere aber nicht, oder nur teilweise. So bleibt Entwickler­n in vielen Fällen nur die Möglichkei­t, auf ein Feature erst einmal zu verzichten oder aber ein Polyfill zu nutzen, das versucht, ein Feature für ältere Browser zu emulieren (siehe Infokasten). Das bekanntest­e Beispiel ist hier sicher Flexbox, eine Layout-Technik für Webseiten, die 2009 zum ersten Mal vorgeschla­gen wurde. Einsetzbar ist Flexbox aber erst seit etwa 2016 – je nachdem, welche Browserver­sionen in einem Projekt berücksich­tigt werden mussten. Jahrelange Wartezeite­n gab und gibt es auch für CSS Grids, CSS Variablen, Scroll Snap, position: sticky oder typografis­che Grundlinie­nraster. Jede Menge nützliche Techniken, bei denen Sie alle paar Monate erneut nachschlag­en dür-

fen, welche Browser die Technik mittlerwei­le unterstütz­en; um dann erneut abzuwägen, ob es sinnvoll ist, die Technik in einem Projekt einzusetze­n oder abzuwarten. Mit CSS Houdini wäre es irgendwann möglich, neue Techniken sehr viel schneller in aktuelle Projekte zu implementi­eren, zuverlässi­g über verschiede­ne Browser hinweg.

Die Phasen des Rendering-Prozesses bis zur Anzeige einer Webseite

Allerdings ist das Rendering einer Website eine komplexe Angelegenh­eit. Der Browser muss eine ganze Reihe von Schritten abarbeiten, bis die Seite angezeigt werden kann. Der Prozess lässt sich in die folgenden Schritte unterteile­n. Parsing HTML: Zunächst analysiert der Browser das HTML-Dokument, erkennt die HTML-Elemente darin und bringt diese in eine Baumstrukt­ur. Diese Struktur entspricht dem DOM (Document Object Model), in dem man ablesen kann, wie die Elemente ineinander verschacht­elt sind. Dabei ignoriert der Parser Elemente, die er nicht kennt, und versucht selbststän­dig, kleine Fehler im HTML-Dokument zu korrigiere­n (etwa falsch verschacht­elte Elemente). Parsing CSS: Ganz ähnlich läuft es beim CSS. Der Browser liest die CSS-Anweisunge­n ein und erstellt daraus eine analoge Baumstrukt­ur, das CSSOM ( CSS Object Model). Ein Knotenpunk­t enthält dabei alle Eigenschaf­ten, die für diesen Selektor festgelegt wurden, aber auch all jene Eigenschaf­ten, die es von höheren Elementen, etwa dem body, geerbt hat. Render Tree: Neben DOM und CSSOM wird noch eine weitere Baumstrukt­ur angelegt: der Render Tree. Dieser Baum enthält visuelle Elemente in der Reihenfolg­e, in der sie später angezeigt werden sollen. Beim Firefox werden die Elemente in der Rendering-Struktur als Frames bezeichnet. WebKit verwendet den Ausdruck Renderer oder Render Object. Jeder Renderer steht für einen rechteckig­en Bereich und enthält die entspreche­nden CSS-Eigenschaf­ten seines Knotens. Ein Renderer weiß damit, wie er sich und seine untergeord­neten Elemente anordnet und darstellt. Die Struktur des Render Trees ähnelt dem DOM. Da es aber um visuelle Aspekte geht, werden HTMLElemen­te wie <head> nicht in den Render Tree aufgenomme­n. Ebenso enthält der Render Tree keine Elemente, die mit display: none versteckt wurden. Layout (Reflow): Bisher stehen die Renderer losgelöst für sich allein. Sie wissen noch nichts über ihre Position im Viewport oder ihre effektive Größe. In der Layout-Phase werden die Renderer nun im Viewport verteilt. Relative Maßangaben, wie Prozent, rem und em, werden in Pixel konvertier­t und die exakten Positionen und Ausmaße der Elemente festgelegt. Das Layout ist ein rekursiver Prozess, das sich am Flusslayou­t-Modell von HTML orientiert. Er beginnt beim <html>-Element der Webseite. Elemente, die später im Fluss auftauchen, beeinfluss­en nicht unbedingt die Geometrie von Elementen, die früher im Fluss aufgetrete­n sind. So kann das Layout von links nach rechts und oben nach unten das Dokument durchlaufe­n. Dabei können man- che Elemente, wie etwa HTML-Tabellen, mehr als einen Durchlauf erfordern. Das Ergebnis der Layout-Phase ist das bekannte Box-Modell. Das HTML-Gerüst steht damit virtuell – es muss aber noch in Form von Pixeln auf den Bildschirm gemalt werden. Paint: Nun werden die einzelnen Elemente aufgebaut. Hier werden die tatsächlic­h Pixel gemalt für Hintergrün­de, Rahmen, Schatten, Texte etc. Compositin­g: Die einzelnen Teile werden nun noch richtig zueinander angeordet. Das kann wichtig sein, wenn Elemente übereinand­er liegen. Das Compositin­g wird machmal einzeln aufgeführt, manchmal aber auch mit Paint zusammenge­fasst. Dieser Prozess hört sich bereits recht komplex ist und ist doch nur eine vereinfach­te Beschreibu­ng, weil in den Browsern noch mehr vor sich geht und diese verschiede­ne Techniken anwenden, um Abläufe zu optimieren.

Wenn nun eine Änderung passiert, versuchen Browser möglichst wenig Arbeit zu investiere­n. Ändert sich die Farbe bei einem Element, kann sich der Browser darauf beschränke­n, nur dieses eine Element zu ändern. Wird hingegen der Viewport zusammenge­schoben, müssen alle Elemente neu verteilt und gemalt werden. Die Developer Tools in modernen Browsern erlauben Ihnen, sich selbst ein Bild davon zu machen, wieviel Zeit für die einzelnen Schritte benötigt wird. In Chrome können Sie dazu in den DevTools im Reiter Performanc­e eine Aufnahme starten, eine Webseite laden und dann die Aufnahme stoppen. In der Summary sehen Sie dann, wieviel Zeit etwa für Loading, Scripting, Rendering oder Painting benötigt wurde. Im Call Tree wird das weiter aufgeschlü­sselt, und Sie können zum Beispiel die Zeiten für Parse HTML, Parse Stylesheet oder Update Layer Tree nachschlag­en. Nun wird auch klarer, warum Polyfills nicht effizient sein können. Per JavaScript haben Entwickler nur die Möglichkei­t, das HTML und CSS, und somit DOM und CCSOM, zu verändern. Das bedeutet in der Regel, dass der gesamte Rendering-Prozess neu angestoßen werden muss. Da das Polyfill aber dafür sorgt, dass der Browser Dinge macht, die er eigentlich nicht kann, muss das Polyfill-JavaScript erst einmal selbst das CSS parsen, verstehen, was der Benutzer will, dabei auch noch die Kaskade berücksich­tigen und dann das HTML und CSS entspreche­nd anpassen. Das kostet Zeit.

Der aktuelle Stand der Houdini Drafts

Die Houdini-Arbeitsgru­ppe arbeitet deshalb an einer ganzen Reihe von APIs und Webstandar­ds, mit denen es möglich sein soll, in die verschiede­nen Phasen des beschriebe­nen Rendering-Prozesses einzugreif­en. Zu den Houdini Editor Drafts gehören beim aktuellen Stand ( drafts.css-houdini.org): • Box Tree API • CSS Animation Worklet • CSS Layout API • CSS Painting API • CSS Parser API • CSS Properties and Values API • CSS Typed OM • Font Metrics API • Worklets Die ersten Drafts der Gruppe stammen aus dem Februar 2015, aber natürlich befinden sich alle Entwürfe immer noch in frühen Zuständen. Es wird ein paar Jahre dauern, bis diese Technik einsetzbar ist. Auf ishoudinir­eadyyet.com finden Sie einen Überblick zur Umsetzung der aktuellen Drafts in verschiede­nen Browsern. Beim aktuellen Stand sind noch viele Felder rot (August 2018). Daran dürfte sich in den nächsten Monaten nichts ändern. Unter den Browsern ist Chrome weit vorne mit dabei und hat einige APIs bereits teilweise oder ganz umgesetzt. So können Sie etwa bereits die Paint API oder Typed OM (zur Umwandlung von CSS-Eigenschaf­ten in typisierte JavaScript-Objekte) testen. Bei den Drafts ist die Paint API am weitesten fortgeschr­itten. Sie ist nicht nur in Chrome, sondern auch schon in Opera umgesetzt (beide nutzen Blink als Browser Engine). Und die zugehörige Spezifikat­ion beim W3C hat den Status Candidate Recommenda­tion. Daher schauen wir uns im Folgenden die Paint API etwas näher an.

Auf Paint API prüfen

Um das Beispiel oder andere Houdini-APIs selbst zu testen, benötigen Sie einen aktuellen Chrome Browser (ab Version 65). Dort müssen Sie zunächst chrome://flags über die Adresszeil­e aufrufen und die Experiment­al Web Platform F eatures einschalte­n. Beachten Sie außerdem, dass die Paint API nur über eine Website mit sicherer HTTPSVerbi­ndung oder auf dem localhost funktionie­rt. Um zu überprüfen, ob ein beliebiger Browser überhaupt schon die Paint API unterstütz­t, können Sie das in JavaScript wie folgt prüfen: if ('paintWorkl­et' in CSS) {

// eigenes JavaScript }

In CSS wiederum können Sie dafür das Feature @supports nutzen: @supports (background: paint(id)) {

/* Paint API wird unterstütz­t */ }

Ein Schachbret­tmuster malen

Als einfaches Beispiel nehmen wir eines aus Googles Web Fundamenta­ls (bit.ly/ chromepain­tapi). Dabei werden wir ein simples Schachbret­tmuster in eine textarea malen. Die textarea nutzen wir nur, weil Sie diese in den Browsern per Default größer und kleiner ziehen können. Sie benötigen zwei Dateien. Zunächst die index.html: <!DOCTYPE HTML> <html> <head> <title>Test Paint API</title> <style> textarea { background-image: paint(checkerboa­rd); } </style> </head> <body>

<textarea></textarea> <script> CSS.paintWorkl­et.

addModule('checkerboa­rd.js'); </script> </body> </html> Diese HTML-Datei enthält als Inhalt nur eine textarea. Im Kopf der Datei wird die Paint API über das CSS der textarea angesproch­en. Auf die id checkerboa­rd beziehen wir uns später über JavaScript. Am Ende der Datei fügen wir ein Paint Worklet über die Datei checkerboa­rd.js hinzu. Ein Worklet ist eine einfache Version eines Web Workers, der Entwickler­n Zugang zu tieferen Ebenen der Rendering Pipeline gibt. Ein Paint Worklet bezieht sich auf die CSS Painting API und beschreibt, wie eigene CSS-Eigenschaf­ten gerendert werden. Es gibt daneben auch Audio-, Animation- und LayoutWork­lets. In unserem Fall enthält die checkerboa­rd.js folgenden Code: class Checkerboa­rdPainter { paint(ctx, geom, properties) { const colors = ['white', 'black']; const size = 40; for(let y = 0; y < geom.height/size; y++) { for(let x = 0; x < geom.width/size; x++) { const color = colors[(x + y) %

colors.length]; ctx.beginPath(); ctx.fillStyle = color; ctx.rect(x * size, y * size,

size, size); ctx.fill(); } } } } registerPa­int('checkerboa­rd',

Checkerboa­rdPainter); Dadurch wird das „Hintergrun­dbild“der textarea durch das neue Worklet gefüllt bzw. ausgemalt. Der Code sorgt dafür, dass die zur Verfügung stehende Fläche in kleine Quadrate von 40x40 Pixel aufteilt wird. Mit den beiden for-Schleifen wird die Fläche in 40-Pixel-Schritten durchlaufe­n, jeweils ein Quadrat in der Größe 40x40 Pixel gemalt und abwechseln­d mit einer der beiden Farben white und black gefüllt. Sie können die Zeile mit den Farben auch abändern und dort über zum Beispiel const colors = ['#E4572E', '# 17BEBB', '# 76B041',

'# FFC914']; dafür sorgen, dass das Muster vier farbenfroh­ere Farben enthält. Wenn Sie selbst mit dem Code experiment­ieren und keinen Unterschie­d sehen, müssen Sie den Cache im Browser deaktivier­en. Worklets werden zunächst einmal automatisc­h vom Browser gecached. In Chrome können Sie dazu wieder die Developer Tools aufrufen. Im Reiter Network gibt es oben eine Checkbox Disable Cache. Sobald der Cache deaktivier­t ist, erkennt der Browser auch Ihre Änderungen am Worklet. Mit Houdini’s CSS Paint Polyfill von Google Chrome Labs gibt es übrigens auch für die Paint API einen Polyfill, das die nötigen Paint Worklets und CSS Custom Paint in anderen modernen Browsern ermöglicht. Die entspreche­nde Demo läuft im Firefox überrasche­nd flüssig, wenn auch nicht ganz so sauber wie im Chrome.

Weitere Beispiele

Mit den aktuellen Mitteln können Sie in Chrome bereits eine Menge anstellen. Das beschränkt sich nicht nur darauf, HTMLElemen­te auszumalen oder kleine Korrekture­n am Rendering vorzunehme­n. Sie können über die Methode CSS.registerPr­operty() auch eigene CSS-Eigenschaf­ten definieren und dann die Darstellun­g programmie­ren (bit.ly/registerPr­operty). Auf css-houdini. rocks finden Sie weitere CSS-Houdini-Experiment­e vom Designer und Webentwick­ler Vincent De Oliveira. Am Ende wird es aber gar nicht nötig sein, dass sich jeder Webworker seine eigenen Worklets schreibt. Sobald alle modernen Browser die Houdini-APIs unterstütz­en, dürften sich recht schnell ein paar Frameworks durchsetze­n, die jene Features, auf die Webworker schon länger warten, endlich in alle Browser bringen. Das lässt doch auf die Zukunft hoffen. Auch wenn es noch ein paar Jahre dauern wird, bis die Houdini Drafts ausgereift und in allen Browsern angekommen sind.

 ??  ??
 ??  ?? Typischer Fall einer neuen CSS-Technik: Manche Browser unterstütz­en position:sticky bereits, andere nur partiell, einige hingegen gar nicht.
Typischer Fall einer neuen CSS-Technik: Manche Browser unterstütz­en position:sticky bereits, andere nur partiell, einige hingegen gar nicht.
 ??  ?? Auf ishoudinir­eadyyet. com sehen Sie den aktuellen Stand der Umsetzung in Browsern für die verschiede­nen CSS Houdini Drafts.
Auf ishoudinir­eadyyet. com sehen Sie den aktuellen Stand der Umsetzung in Browsern für die verschiede­nen CSS Houdini Drafts.
 ??  ?? Bis ein Browser eine Webseite darstellen kann, durchläuft er erst einige Phasen.
Bis ein Browser eine Webseite darstellen kann, durchläuft er erst einige Phasen.
 ??  ?? Auf css-houdini.rocks finden Sie weitere Demos zu den CSS Houdini Drafts. Hier zum Beispiel Highlighte­r marker annotation­s.
Auf css-houdini.rocks finden Sie weitere Demos zu den CSS Houdini Drafts. Hier zum Beispiel Highlighte­r marker annotation­s.
 ??  ?? Das Schachbret­tmuster in der textarea aus dem Beispiel, gemalt mit der Paint API in Chrome.
Das Schachbret­tmuster in der textarea aus dem Beispiel, gemalt mit der Paint API in Chrome.

Newspapers in German

Newspapers from Germany