Im August 2020, als die content-visiblity-Eigenschaft in CSS in die Chrome-Browser Einzug hielt, schrieben Una Kravets und Vladimir Levin darüber und wir berichteten. Das Seltsamste daran ist, dass man, um den Leistungsvorteil daraus zu ziehen, sie mit contain-intrinsic-size auf diesen großen Blöcken der Seite kombiniert, bei denen man eine beliebige Höhenschätzung einfügt. Ich schrieb
Dieser Teil erscheint mir extrem seltsam. Einfach eine Höhe schätzen? Was, wenn ich falsch liege? Kann ich die Leistung beeinträchtigen? Kann (oder sollte) ich diesen Wert bei verschiedenen Ansichtsfenstern ändern, wenn der Höhenunterschied zwischen kleinen und großen Bildschirmen drastisch ist?
Jake Archibald und Das Surma haben gerade ein Video dazu gemacht und das hat das ein wenig geklärt. Man kann bei etwa 7:30 sehen, wie verwirrend das ist. Jake benutzte diese riesige HTML-Spec-Seite als Demo und erstellte <section>-Wrapper um große HTML-Teile und wandte
section {
content-visibility: auto; /* this is the thing that delays painting */
contain-intrinsic-size: 1px 5000px; /* this is the guess at the height of the content, and also saying width doesn't matter */
}
Offenbar sind diese 5000 Pixel nicht die Höhe des Elements, sondern die Größe des Inhalts dieses Elements. Ich denke, das ist wichtig, weil es das übergeordnete Element um diese Zahl höher werden lässt, es sei denn, das übergeordnete Element überschreibt dies mit einer eigenen Höhe. Die Magie besteht darin, dass der Browser nur den ersten Abschnitt rendert¹ (wo das Ansichtsfenster höchstwahrscheinlich nicht über 5000 Pixel hoch ist) und das Rendern des Rests aufschiebt. Ähnlich wie beim Lazy Loading, aber alles statt nur Medien. Es geht davon aus, dass der nächste Abschnitt 5000 Pixel hoch ist, aber sobald die Oberseite sichtbar wird, wird er tatsächlich gerendert und die korrekte Höhe ist bekannt. Wenn man also davon ausgeht, dass Ihre Seite nur aus großen Blöcken übereinander besteht, sollte die Verwendung einer extrem großen Zahl dort gut funktionieren. Gott steh Ihnen bei, wenn Ihre Seite komplizierter ist, nehme ich an.
Es ist ein gutes Video und Sie sollten es sich ansehen
Dies ist eine weitere Sache, bei der man dem Browser Informationen über seine Website geben muss, damit er die Leistung gut erbringen kann. Es sind Informationen, die er selbst herausfinden kann, aber erst, nachdem er Dinge getan hat, die Leistung kosten. Man muss ihn also im Voraus informieren, damit er bestimmte Arten von Arbeit vermeiden kann. Bei responsiven Bildern können wir dem Browser, wenn wir ihm ein srcset-Attribut mit Bildern und im Voraus ihre Größe geben, einschließlich eines sizes-Attributs mit Informationen darüber, wie unser CSS funktioniert, Berechnungen im Voraus durchführen, die nur das bestmögliche Bild herunterladen. Ebenso können wir mit der will-change-Eigenschaft in CSS dem Browser im Voraus mitteilen, wann wir Bewegungen vornehmen werden, damit er diese im Voraus optimieren kann, was er sonst nicht könnte. Es ist verständlich, aber ein wenig ermüdend. Es ist, als ob wir eine stuff-you-need-to-know.manifest-Datei bräuchten, die wir Browsern geben müssten, bevor sie etwas anderes tun – nur dass das eine zusätzliche Anfrage wäre!
Die Auswirkungen auf die Barrierefreiheit sind ebenfalls wichtig. Steve Faulkner hat einen Test durchgeführt, bei dem content-visibility: auto auf Bilder und Absätze angewendet wurde
Der Inhalt ist visuell verborgen, aber sowohl in JAWS als auch in NVDA wird das verborgene
<img>-Element angesagt, aber der Inhalt des<p>-Elements nicht. Das hat damit zu tun, wie der Inhalt derimg- undp-Elemente im Browser-Accessibility-Tree dargestellt wird: Dasimg-Element wird mit demalt-Text als zugänglicher Name im Accessibility Tree exponiert. Der Inhalt desp-Elements ist nicht im Accessibility Tree vorhanden.
Er merkt an, dass Inhalte, die auf diese Weise verborgen werden, gemäß der Spezifikation für Screenreader nicht verfügbar sein sollten. Ich könnte mir vorstellen, dass es in beide Richtungen geht, z. B. alles verstecken, als ob es display: none wäre, was bedeutet, dass nichts davon im Accessibility Tree ist. Oder alles im Accessibility Tree belassen. Im Moment ist es ein Zwischenschritt, bei dem man eine Menge verwaister Bilder im Accessibility Tree sehen könnte, ohne weiteren Kontext als ihren alt-Text. Dies ist ein interessantes Beispiel dafür, dass neue Technologien mit mehr Kanten und Ecken herauskommen, als man sich wünschen würde.
Apropos alt-Text: Wir alle wissen, dass diese nicht leer sein sollten, wenn sie wichtige Inhalte darstellen, die jemandem beschrieben werden müssen, der sie nicht sehen kann. Sie sollten wie Absätze sein, sagt Dave
Ich habe endlich die einfachste aller Verbindungen hergestellt:
alt-Text ist wie ein Absatz. Wortbilder. Grundlegend, ich weiß, aber es hilft mir, zu kontextualisieren, wie man gutenalt-Text schreibt, sowie die Quellreihenfolge meines Codes.
Ich möchte hier nicht übermäßig negativ sein! Die Leistungsgewinne für die Einrichtung einer lang scrollenden Seite mit content-visibility sind riesig und das ist großartig. Die Möglichkeit, dem Browser mit zwei Zeilen Code mitzuteilen, was er nicht rendern soll, ist ziemlich nett.
- Ich sage immer wieder "rendern", bin mir aber nicht sicher, ob das wirklich der richtige Begriff ist oder ob er etwas Spezifischeres bedeutet. Die Spezifikation besagt Dinge wie "Benutzeragenten zu ermöglichen, potenziell große Teile von Layout- und Renderarbeit wegzulassen, bis sie benötigt werden" (Hervorhebung von mir).
Ich stimme dem Barrierefreiheits-Teil dieses Artikels nicht zu.
Wenn ein Drittanbieterprogramm die Spezifikation nicht korrekt anwendet, sollten sie sie korrigieren, anstatt die Verantwortung auf die Entwickler abzuwälzen.
Es scheint einen wachsenden Trend zu geben, alles zur Verantwortung des Frontend-Entwicklers zu machen. Dem widerspreche ich von ganzem Herzen.
Die größten Übeltäter dieses Trends sind Apple und Google, zwei Unternehmen mit einer Marktkapitalisierung jenseits der Billionen-Dollar-Grenze.
Kleinere Unternehmen denken anscheinend auch, dass es in Ordnung ist, weil es ihnen nützt. Warum ein Problem an der Wurzel beheben, wenn man es einfach an alle Frontend-Entwickler weitergeben kann?
Wir profitieren nicht davon, sie tun es.
Das muss aufhören, und es beginnt damit, dass diese Praktiken in den veröffentlichten Artikeln nicht mehr gefördert werden...
Ich habe heute mit dieser Content-Visibility-Eigenschaft herumgespielt und das erste, was mir auffiel, war, dass der Scrollbalken nicht mehr richtig funktioniert. Er springt, da die riesige content-intrinsic-size nicht mit der tatsächlichen Größe der Abschnitte übereinstimmt.
Das andere Problem, das mir aufgefallen ist, betrifft Personen, die den Scrollbalken tatsächlich mit der Maus greifen, um schnell auf einer Seite nach oben und unten zu navigieren. Auf Seiten, die
content-visibility: autoverwenden, gibt es ein sehr, sehr spürbares Ruckeln.Ich bin mir nicht sicher, was die beste Lösung dafür ist. Man könnte einen MutationObserver verwenden, um
content-visibility: visibleauf jedes Element zu setzen, sobald es sich im Ansichtsfenster befindet, aber das scheint ein Hack zu sein.Wenn Sie
content-visibility: autoauf einem übergeordneten Element verwenden, werden die untergeordneten Elemente abgeschnitten, wenn sie mit mehr als 1,0 skaliert werden. Das Setzen vonoverflow:visiblehilft in diesem Fall nicht.(content-visibility: auto;) verursacht ein Problem bei Ankerlinks mit sanfter Scroll-Funktion (scroll-behavior: smooth;).
Ich hatte auch Probleme mit dem Scrollbalken und wollte
content-visibilitynur für mobile Geräte verwenden, da meine Seite auf dem Computer nicht davon profitiert (bereits perfekte 100 Punkte bei PageSpeed Insights) und das Scrollbalkenproblem offensichtlich auf Mobilgeräten nicht auftritt.Ich habe festgestellt, dass es tatsächlich eine gute Möglichkeit gibt, mobile Geräte mit CSS zu erkennen (ohne Hacks)
https://css-irl.info/detecting-hover-capable-devices/
Also habe ich das mit diesen Informationen kombiniert
hover: nonebedeutet, dass das anvisierte Gerät keine Elemente überfahren kann (normalerweise nicht möglich, außer in einigen Fällen unter Android) undpointer: coarsebedeutet "der primäre Eingabemechanismus enthält ein Zeigegerät von begrenzter Genauigkeit" (Zitat von MDN).Diese Media-Abfrage schließt auch Benutzer ein, die Touchscreens auf PCs verwenden, aber diese Benutzer sind so selten, dass sie meiner Meinung nach praktisch nicht existieren.
Ja, mit content-visibility:auto gibt es Probleme mit dem Scrollbalken und overflow-content ist nicht sichtbar