CSS tippek: Mire jó a contain?

CSS tippek: contain

A contain CSS tulajdonság előnyeiből érthetetlenül kevés weblap profitál, pedig minden valamire való böngésző támogatja a lehetőségét. Jól használva jelentősen csökkenthetjük vele a weblapok erőforrásigényét, ami mobilon egyet jelent a Core Web Vitals mutatók javulásával.

Egy 2024-es, játékokhoz összerakott PC-nek egy weblap megjelenítése meg sem kottyan, de az alsó- vagy középkategóriás mobiloknál egyáltalán nem ilyen jó a helyzet. A legkomolyabb problémát a dinamikus tartalmak jelentik, amelyeknél a layout-thrashing probléma miatt a böngészőkkel gyakran a valóban szükséges feladatok többszörösét végeztetjük el.

A layout-thrashing jelenség

Nézzük röviden a probléma gyökerét. Egy weboldal megjelenítése során, amikor a böngésző úgy ítéli meg, hogy már elegendő tartalom áll rendelkezésre, akkor megkezdi az oldal elemeinek elrendezését, megrajzolását. A gond, hogy eközben is töltődhetnek be és futhatnak olyan javascriptek, amelyek a DOM fát módosítják. Például hirdetéseket jelenítünk meg, más oldalakról származó tartalmakat ágyazunk be.

A legnagyobb probléma, hogy a DOM módosításai után a böngésző a legtöbb esetben újrakezdi az elrendezés kiszámítását (reflow). Hiszen nem áll rendelkezésére információ arról, hogy egy DOM elem változása a többi elem méretére, pozíciójára is hatással van-e. A böngésző gyakorlatilag kidobja az addig elvégzett munka eredményét, és kezd mindent elölről.

Nem ritka, hogy a fenti probléma akár többször is jelentkezik már az első felhasználó számára látható pixelek megjelenítése előtt. Ha a kidobott munkamennyiség jelentős, esetleg a probléma többször ismétlődik, akkor máris a layout-thrashingről beszélünk. A Chrome DevTools Performance paneljén általában jól tetten érhető a jelenség.

A Performance panelen a Layout (lila) és a Paint (zöld) szakaszok érdekesek számunkra. Minél több van ezekből, annál esélyesebb, hogy a böngészőnkkel fölös köröket futtatunk.

Mit okoz a layout-thrashing?

Az oldal megjelenítését a layout-thrashing komolyan késlelteti, hiszen a böngésző erőforrásai fölöslegesen pazarlódnak el. Ez a késleltetés és a fölöslegesen elvégzett munka a CWV mutatók közül elsődlegesen az FCP, az LCP és az INP értékekre hat negatívan.

Itt kerülhet képbe a „contain” tulajdonság, amivel korlátozhatjuk, hogy egy adott HTML elem és a leszármazottai hogyan hathatnak a lap többi részére. A böngészőnek ezzel a tudtára adhatjuk, hogy az adott elem változásai hogyan hathatnak a lap más részeire.

Egy egyszerű példa a contain használatára

Az alábbi egyszerű példa jól szemlélteti a contain beállítás egyszerűségét és egyben nagyszerűségét. Lehetőséget ad rá, hogy elemeket szinte korlátozott „konténerbe” zárjunk. Ezzel a beállítással a böngészőnek már nem kell újraszámolnia valamennyi elem elrendezését lapon, csak mert egyetlen elem tartalma változik.

HTML

...
<div class="fixed">
  <div id="div-gpt-ad-123123123-0"></div>
</div>
...

CSS

.fixed {
  width: 300px;
  height: 250px;
  contain: strict;
}

A fenti példában a „contain” tulajdonság „strict” beállításával, egyetlen CSS sorral elértük, hogy a 300x250px méretű DIV egy zárt konténerré vált. Ezzel a hirdetési egységen belül bármi történhet később, az nem hat ki lap többi részére. A böngésző a hirdetés megjelenésekor és frissítésekor is tudni fogja, hogy nem kell a teljes oldalt újrarajzolnia.

Fontos, hogy a contain tulajdonságot nagyon óvatosan kell használni, hiszen indokolatlan korlátozások problémákat is okozhatnak. Ha azonban jól használjátok, akkor nagyon sokat megtakaríthattok vele a böngésző erőforrásaiból. Ez pedig esélyesen komolyan kihat a CWV (Core Web Vitals) mutatokra is, főképp komplexebb oldalaknál.

További információ:

Legújabb cikkeink