Blog

content-visibility: Offscreen-Rendering ohne Listen-Virtualisierung

Eine Liste mit tausend Kommentaren rendert langsam, also greifst du zu react-window – und tauschst dafür flüssiges Scrollen gegen Strg+F, den Seitendruck und teilweise die Navigation von Screenreadern ein, weil Elemente außerhalb des sichtbaren Bereichs physisch aufhören, im DOM zu existieren. content-visibility löst dasselbe Problem anders: Die Elemente bleiben im DOM, der Browser überspringt für sie nur die teure Layout- und Malarbeit, solange sie nicht in der Nähe des sichtbaren Bereichs sind – und kann sie, überraschenderweise, vorübergehend wieder sichtbar machen, wenn du in ihnen nach Text suchst.

Popover API und natives <dialog>: Schluss mit von Hand gebauten Modals

Im Artikel über Barrierefreiheit war ein Modal mit display:none, das trotzdem noch im Accessibility-Baum existierte, ein Beispiel für einen Fehler, der beim Bau eines Modals von Grund auf mit Divs entsteht. Die eigentliche Frage lautet: Warum musste man es überhaupt von Grund auf bauen? Ich schaue mir an, was das native <dialog> und das popover-Attribut kostenlos mitbringen – Top Layer, Fokusfalle, Light Dismiss – und wo sich diese beiden Mechanismen so sehr unterscheiden, dass eine Verwechslung schnell zu einer unzugänglichen Oberfläche führt.

CSS @layer: wie Cascade Layers den Krieg um die Spezifität beenden

Die Utility-Klasse .mt-4 verliert gegen die Regel .card .card__header .card__title, obwohl sie logisch gewinnen sollte, weil sie später hinzugefügt wurde. Das ist kein Zufall – das ist Spezifität, die exakt das tut, wofür sie entworfen wurde. @layer führt eine völlig neue Achse zur Konfliktlösung ein, die vor der Spezifität greift, nicht neben ihr – und hat eine Falle, die so unintuitiv ist, dass selbst ein Teil der Dokumentation im Netz sie falsch darstellt.

CSS :has() — der Elternteil, der weiß, was im Inneren passiert

Ein Formularfeld soll sich rot einfärben, wenn der Input darin ungültig ist. Klingt simpel – nur konnte CSS 25 Jahre lang ein Element nicht danach fragen, was in seinem Inneren passiert, sondern immer nur umgekehrt. Ich schaue mir an, wie :has() diese Richtung umkehrt, wie es sich von gewöhnlichen Kombinatoren unterscheidet und wo diese neue Macht die Performance wirklich kostet.

Container Queries: die Komponente, die ihren Container kennt, nicht den Viewport

Dieselbe Produktkarte sieht im Grid großartig aus und bricht in der schmalen Sidebar zusammen – trotz sorgfältig gewählter Media Queries. Das Problem liegt nicht in deinem Code, sondern in der Frage, die eine Media Query überhaupt stellt: nach der Bildschirmbreite, nicht nach dem Platz, den die Komponente tatsächlich bekommen hat. Ich schaue mir an, wie Container Queries diese Frage dorthin verlagern, wo sie von Anfang an hingehört, und was unter der Haube wirklich passiert, wenn ein Element zum „Query-Container" wird.