CSS tippek: A content-visibility előnyei

CSS tippek: content-visibility

Napjainkban hatalmasra duzzadtak a weboldalak, és ez főként a mobil böngészőkre ró komoly terhet. A content-visibility CSS tulajdonsággal azonban lehetőségünk van ezt a terhet jelentősen mérsékelni.

A képeknél mindenki ismeri a lazy-loading technikát, ami annyit tesz, hogy az oldalba illesztett képeket csak akkor kezdjük el betölteni, ha azok megjelenítésére már valóban szükség van. Egyszerű és nagyszerű. Nos, a content-visibility:auto beállítás is valami ehhez hasonló, de itt nem a képek letöltését késleltetjük, hanem az egyes elemek megjelenítését.

A content-visibility tulajdonsággal meghatározhatjuk, hogy egy adott elemmel kell-e foglalkoznia a böngészőnek az oldal betöltésekor. Az alapértelmezett visible és az elemet teljesen elrejtő hidden beállítás nem különösebben érdekes, de az auto már annál inkább. Ezzel megvalósíthatjuk azt, hogy a böngésző csak akkor kezdjen el dolgozni egy adott elem megjelenítésén, amikor az már valóban szükséges, mert például a felhasználó görgetéssel a közelébe ért.

A content-visibility:auto előnyei

Főképp hosszabb és sok szakaszra osztható oldalaknál előnyös, ha egy gyenge hardveren futó böngészőnek nem kell a teljes oldalt renderelnie a látogatás első pillanatában. Ennek számtalan előnye van, a Core Web Vitals mutatóknál látványos javulást is elérhetünk a beállításával.

  1. A keresők elvárásai miatt az oldalak egyre terjedelmesebbek, és az ezzel együtt növekvő oldalbetöltési idő problémás lehet. A mobil eszközökön egy több tízezer pixeles magasságú lap renderelése már komoly feladat. Ezt a feladatot redukálhatjuk a töredékére néhány content-visibility:auto beállítással.
  2. A layout-thrashing hatása is jelentősen csökkenhet, hiszen a böngésző a távoli elemek renderelését meg sem kezdi, ha azok content-visibility:auto beállítással rendelkeznek.
  3. A Core Web Vitals mutatók közül az INP, az FCP és az LCP értékek is jelentősen javulhatnak. A javulás mértéke persze függ a lap méretétől, és a content-visibility:auto beállítású elemek mennyiségétől és elhelyezkedésétől.

A beállítással optimális körülmények között néhány tizedmásodpercet faraghatunk le, de akár ennyin is múlhat az, hogy a gyengéről az elfogadható szintre hozzuk fel a lapunk Core Web Vitals mutatóit.

Néhány content-visibility probléma

Ahogy minden jó dolognak, a content-visibility:auto beállításnak is van árnyoldala, ez pedig a várható méretek meglehetősen körülményes beállítása. Sajnos, ha nem tudjuk egységes méretű szekciókra osztani a lapot, akkor még az is kérdéses lehet, hogy érdemes-e egyáltalán belevágnunk.

  1. A böngésző a renderelésnél átugrott elemek méreteit nem ismeri, így a scrollbar hossza problémás lehet. Ha az átugrandó elemek méretet nem állítjuk be (pl. contain-intrinsic-height tulajdonsággal), akkor a scrollbar kezdetben megtévesztően rövid lesz, majd elég csúnyán ugrálni fog görgetés közben.
  2. A content-visibility tulajdonságot még nem minden böngésző támogatja, például a Safari aktuális verziója sem. Ez persze nem halálos probléma, hiszen a megjelenítést valójában nem befolyásolja, csak a megjelenítés sebességét optimalizáljuk a segítségével.

Bár remek lehetőségeket rejt a tulajdonság, valós környezetben néha sokkal nehezebb beállítani, mint azt elsőre gondolnánk. Őszinte leszek, a tulajdonság megjelenése óta én csak néhány lapnál implementáltam ezt. Ennyinél érte meg a méret és felépítés miatt a pixelszámolgatás, de ezeknél az FCP és az LCP értéke jellemzően 200-300 ms értékkel csökkent mobilon.

Egy gyors content-visibility teszt eredménye

Az alábbi képen egy teszt eredménye látható. Ehhez egy olyan HTML fájl generáltam, amely 50 section elemet tartalmazott, egyenként 500 karakternyi szöveggel és egy képpel. Ezt a fájlt teszteltem a Chrome DevTools Performance eszközével 20x CPU lassítás mellett. A bal oldalon látható az eredmény content-visibility beállítás nélkül, a jobb oldalon pedig content-visibility:auto beállítás mellett.

Ez csak egy szintetikus teszt volt, melynél egy végtelenül egyszerű HTML kód volt a tesztalany. Ennél jelentősebb eltérést kapunk egy valós, komplexebb HTML/CSS kóddal felépített, vagy JavaScripttel jobban terhelt oldalak esetén. Azonban már ez is elég meggyőző, hiszen egy primitív HTML lapnál is közel 70%-ot nyertünk a renderelési időn.

Egy egyszerű content-visibility példa

Az alábbi példa néhány elemre beállítja a content-visibility és a contain-intrinsic-size tulajdonságokat mobil szélesség esetén. Ezzel a mobil böngészők a hajtás alatti tartalmakat csak akkor kezdik renderelni, ha azokhoz a felhasználó már közel jár.

HTML

...
<main>
  <section>
    <!-- Hajtás fölötti tartalom -->
  </section>
  <section class="lazy-mobile-content">
    <!-- Hajtás alatti tartalom #1 -->
  </section>
  <section class="lazy-mobile-content">
    <!-- Hajtás alatti tartalom #2 -->
  </section>
  <section class="lazy-mobile-content">
    <!-- Hajtás alatti tartalom #3 -->
  </section>
</main>
...
<footer>
  <!-- Lábléc tartalma -->
</footer>
...

CSS

@media screen and (max-width:480px) {
  footer {
    content-visibility: auto;
    contain-intrinsic-size:auto 400px;
  }
  .lazy-mobile-content {
    content-visibility: auto;
    contain-intrinsic-size:auto 600px;
  }
}

A példában én egyszerűen 600px magasságot rendeltem a lazy-mobile-content osztállyal megjelölt section elemekhez, illetve 400px magasságot a lap alján lévő footer elemhez. Egy valós weboldalon persze ezeknél komplikáltabb beállítás is szükséges lehet.

A content-visibility csak mobil szélességhez (480px alatt) van beállítva, hiszen a mobil böngészőknél profitálhatunk ezzel a legtöbbet. A mobiloknál a scrollbar hossza is kevésbé jelentős, így a pontos méretbeállítás is kevésbé kritikus fontosságú.

Összegzés

A képek esetében alkalmazott lazy-loading beállítást nem helyettesíti content-visibility:auto CSS tulajdonság, de nagyon jól kiegészíti azt. A két lehetőség együttes használata minden más technikánál hatékonyabban terelheti a problémás Core Web Vitals mutatókat a zöld sávba. Ezekkel a gyengébb eszközökön a teljes oldalbetöltési időn akár másodperceket is lefaraghatunk, ami már drasztikusan javítja a visszafordulási arányt is.

Összefoglalva, a content-visibility:auto egyértelműen egy szuper CSS tulajdonság. Nem minden esetben egyszerű használni, de néha igen jelentős hasznot hoz. Csak a kisördög miatt vetődik fel bennem egy gonosz kérdés, amelyre nem hiszem, hogy valaha is választ kapok. 2024-ben miért CSS szinten vacakolunk még az optimalizálással, ha egy böngésző automatikusan is optimalizálhatná a renderelést?

Ha elakadnál a content-visibility használatában, akkor lépj be a Facebook csoportunkba, segítünk!

További információ:

Legújabb cikkeink