Panduan Cumulative Layout Shift (CLS)

Apa Cumulative Layout Shift measures, bagaimana score adalah calculated (impact × distance), session windows, thresholds, umum penyebab, dan cara perbaiki dan debug them.

Pertama kali diterbitkan: 26 Jun 2026 · Terakhir diperbarui: 8 Agu 2026 · Advanced
Bahasa

Cumulative Layout Shift (CLS) adalah Core Web Vital untuk visual stability — bagaimana banyak terlihat konten unexpectedly moves sementara sebuah halaman adalah di gunakan. ini adalah sebuah unitless score (impact fraction × distance fraction per shift), dan since June 2021 ini adalah largest session window dari shifts, tidak lifetime sum. baik adalah ≤ 0,1 di 75th percentile dari data lapangan; 0,1–0,25 perlu improvement; > 0,25 adalah poor. biasa culprits adalah unsized images/ads/iframes/embeds, web fonts, dan konten injected di atas fold — perbaiki them oleh reserving space (width/height atau aspect-ratio), tuning font-display, dan animating dengan transform. Lighthouse sering membaca near-0 karena ini tidak interact dengan halaman atau jalankan penuh halaman lifecycle — data lapangan (CrUX) adalah apa Google sebenarnya peringkat pada.

TL;DR — CLS adalah Core Web Vital untuk visual stability. setiap shift scores sebagai impact fraction × distance fraction; metric itself adalah largest session window dari shifts (≤ 1 s antara shifts, ≤ 5 s window) — tidak lifetime sum, yang adalah apa ini adalah sebelum June 2021. baik adalah ≤ 0,1, perlu improvement ≤ 0,25, poor > 0,25, di 75th percentile dari data lapangan. hanya viewport-terlihat shifts count; shifts di dalam 500 ms dari sebuah discrete input adalah excluded (scrolling tidak). penyebab adalah unsized images/video/ads/iframes/ embeds, web fonts, dan konten injected di atas existing konten; memperbaiki adalah reserving space, font-display/size-adjust, dan transform-hanya animation. trap untuk hindari: Lighthouse (lab) routinely membaca near-0 karena ini tidak interact dengan halaman atau jalankan penuh lifecycle — data lapangan (CrUX) adalah apa Google sebenarnya measures.

Apa CLS measures

Google’s framing: “Cumulative Layout Shift (CLS) adalah a stable Core Web Vital metric. ini an important, user-centric metric untuk measuring visual stability karena it helps quantify bagaimana sering users experience unexpected layout shifts.” (terjemahan) “Cumulative Layout Shift (CLS) adalah sebuah stable Core Web Vital metric. ini adalah sebuah penting, pengguna-centric metric untuk measuring visual stability karena ini helps quantify bagaimana sering pengguna experience unexpected layout shifts.” operative kata adalah unexpected — konten itu moves pada -nya own, tidak karena pengguna melakukan sesuatu.

ini sits di Core Web Vitals trio dengan Largest Contentful Paint (memuat) dan Interaction untuk Berikutnya Paint (responsiveness). Di mana LCP dan INP adalah timed di milliseconds, CLS adalah odd satu out: sebuah unitless ratio score. itu trips orang up constantly. sebuah CLS dari 0,05 adalah tidak 50 ms. ini memiliki Tidak time unit di semua.

formula: impact × distance

Per shift, Google defines ini sebagai:

layout shift score = impact fraction × distance fraction
  • Impact fraction “measures bagaimana unstable elements impact itu viewport area antara dua frames” (terjemahan) “measures bagaimana unstable elements impact viewport area antara dua frames” — combined terlihat area moving elements occupied (sebelum dan setelah), sebagai sebuah share dari viewport.
  • Distance fraction adalah “itu greatest horizontal atau vertical distance any unstable element memiliki moved di itu frame divided oleh itu viewport’s largest dimension (width atau height, whichever adalah greater).” (terjemahan) “ greatest horizontal atau vertical distance apa pun unstable element memiliki moved di frame divided oleh viewport’s largest dimension (width atau height, whichever adalah greater).”

Keduanya dimensions penting independently. sebuah kecil element itu travels di seluruh sebagian besar dari screen dan sebuah besar element itu barely nudges dapat score very differently. web.dev’s worked contoh: sebuah impact fraction dari 0.75 dan sebuah distance fraction dari 0.25 memberikan sebuah layout shift score dari 0.1875.

One shift scores the visible area affected multiplied by the farthest movement relative to the viewport. Sumber: web.dev

Three cards form the equation. Impact fraction is 0.75: the visible viewport area affected between two frames. Distance fraction is 0.25: the farthest movement divided by the viewport's largest dimension. Multiplying them produces a unitless individual layout-shift score of 0.1875. CLS ultimately keeps the largest session-window total, not a lifetime sum of every shift.

© Patrick Stox LLC · CC BY 4.0 ·

Session windows: bagian everyone mendapatkan wrong

Di sini’s single sebagian besar-misstated fact tentang CLS, dan satu I sebagian besar ingin Anda untuk take away. CLS adalah tidak sum dari semua shifts di atas halaman’s lifetime. ini digunakan untuk menjadi — itu changed di June 2021.

Hari ini: “CLS measures itu largest burst dari layout shift scores untuk setiap unexpected layout shift itu occurs during itu entire lifecycle dari a halaman.” (terjemahan) “CLS measures largest burst dari layout shift scores untuk setiap unexpected layout shift itu occurs selama entire lifecycle dari sebuah halaman.” sebuah burst adalah sebuah session window: “satu atau lebih individual layout shifts occur di rapid succession dengan lebih sedikit daripada 1-second di antara setiap shift dan a maximum dari 5 seconds untuk itu total window duration.” (terjemahan) “satu atau lebih individual layout shifts occur di rapid succession dengan lebih sedikit daripada 1-kedua di antara setiap shift dan sebuah maximum dari 5 seconds untuk total window duration.” CLS adalah score dari largest such window — tidak sum, tidak average.

Evidence for this claim CLS uses the largest session window of unexpected layout shifts, with gaps under one second and a maximum five-second window; recent discrete input can exclude a shift. Scope: Current CLS session-window and recent-input rules. Confidence: high · Verified: web.dev: Cumulative Layout Shift

Mengapa perubahan? old sum-semuanya definition diam-diam punished panjang-lived halaman. sebuah single-halaman app atau sebuah infinite-scroll feed accumulated lebih CLS hanya oleh existing lebih lama, bahkan jika setiap individual shift adalah tiny dan well-spaced. Chrome Speed Metrics team moved untuk sebuah maximum session window untuk berhenti penalizing duration, dan chose maximum di atas average untuk hindari sebuah perverse outcome di mana memperbaiki sebuah kecil, sekunder shift dapat membuat Anda score worse. Ketika perubahan rolled out, Tidak origin mendapat sebuah worse score, sebagian besar saw Tidak perubahan, dan sebuah slice dari slow-UI dan infinite-scroll halaman ditingkatkan. jika Anda baca sebuah older post itu masih says “sum dari all shifts,” (terjemahan) “sum dari semua shifts,” ini adalah out dari date.

Apa counts — dan apa tidak

Three exclusions decide apa sebenarnya lands di Anda score:

  • Di bawah fold tidak count. hanya shifts dari konten terlihat di saat ini viewport adalah scored. sebuah shift di bottom dari sebuah panjang halaman itu pengguna tidak pernah scrolls untuk memiliki Tidak impact. Practically, ini berarti memperbaiki di-viewport shifts adalah hampir selalu lebih tinggi ROI daripada chasing shifts cara down halaman.
  • pengguna-initiated shifts mendapatkan sebuah 500 ms lulus. “Layout shifts that occur within 500 milliseconds of user input will have the hadRecentInput flag set, so they can be excluded from calculations.” (terjemahan) “Layout shift yang terjadi dalam 500 milidetik setelah input pengguna akan memiliki flag hadRecentInput yang ditetapkan, sehingga dapat dikecualikan dari perhitungan.” Google’s stance: shifts “that occur in response to user interactions (such as clicking or tapping a link, pressing a button, or typing in a search box) are generally fine, as long as the shift occurs close enough to the interaction that the relationship is clear to the user.” (terjemahan) “Pergeseran yang terjadi sebagai respons terhadap interaksi pengguna umumnya wajar selama terjadi cukup dekat dengan interaksi sehingga hubungannya jelas bagi pengguna.” Open sebuah accordion, expand sebuah menu — itu movement adalah yang diharapkan, so ini adalah forgiven.
  • tetapi scrolling adalah tidak sebuah free lulus. 500 ms exclusion hanya applies untuk discrete events — tap, click, keypress. Continuous gestures (scrolling, pinch-zoom) melakukan tidak trigger exclusion window. jika konten shifts sementara seseorang scrolls, itu masih counts. ini pembedaan adalah wrong di sebuah lot dari coverage; mendapatkan ini right.
Evidence for this claim A layout shift occurring within 500 milliseconds of a qualifying recent user input has hadRecentInput set and is excluded from CLS. Scope: field and lab Confidence: high · Verified: Cumulative Layout Shift (CLS)

Thresholds, dan di mana score muncul dari

“Untuk sediakan a good user experience, sites seharusnya strive untuk memiliki a CLS score dari 0.1 atau lebih sedikit,” (terjemahan) “untuk menyediakan sebuah baik pengguna experience, situs seharusnya strive untuk memiliki sebuah CLS score dari 0,1 atau lebih sedikit,” diukur di “itu 75th percentile dari halaman loads, segmented across mobile dan desktop devices.” (terjemahan) “ 75th percentile dari halaman memuat, segmented di seluruh mobile dan desktop devices.” penuh bands:

Evidence for this claim CLS is good at 0.1 or less and poor above 0.25, assessed at the 75th percentile of page loads. Scope: Current web.dev CLS field thresholds. Confidence: high · Verified: web.dev: Cumulative Layout Shift
  • baik: ≤ 0,1
  • perlu improvement: 0,1 – 0,25
  • Poor: > 0,25
Evidence for this claim CLS is good at 0.1 or less and poor above 0.25, assessed at the 75th percentile of page loads. Scope: Current web.dev CLS field thresholds. Confidence: high · Verified: web.dev: Cumulative Layout Shift

0,1 line tidak arbitrary. Google’s pengguna research ditemukan itu “levels dari shift dari 0.15 dan lebih tinggi adalah consistently perceived sebagai disruptive, sementara shifts dari 0.1 dan lebih rendah adalah noticeable tetapi tidak excessively disruptive.” (terjemahan) “tingkat dari shift dari 0,15 dan lebih tinggi adalah consistently perceived sebagai disruptive, sementara shifts dari 0,1 dan lebih rendah adalah noticeable tetapi tidak excessively disruptive.” mereka landed pada 0,1 alih-alih sesuatu stricter partly karena ketiga-party embeds (ads, social) so commonly penyebab shifts itu sebuah tighter bar akan menjadi impractical untuk nyata web.

“75th percentile dari field data” (terjemahan) “75th percentile dari data lapangan” bagian adalah muat-bearing, yang brings us untuk biggest pengukuran trap.

Lab vs. field: mengapa angka disagree

ini adalah di mana sebagian besar orang mendapatkan burned. Lighthouse dan lainnya lab alat sering report sebuah CLS near 0,0 sementara data lapangan — dan Google — tampilkan sesuatu banyak worse. kesenjangan tidak either alat menjadi dishonest; ini adalah cakupan. sebuah lab jalankan adalah sebuah single, pendek, scripted pemuatan halaman: ini tidak scroll, tidak click, dan tidak stick sekitar, so ini captures awal-muat shifts hanya. data lapangan (CrUX) aggregates nyata visits di seluruh banyak pengguna, devices, dan navigations di atas sebuah rolling window, dan CLS adalah didefinisikan di atas entire halaman lifecycle — menus opening, lazy konten memuat sebagai pengguna scrolls, late ads filling di, namun panjang session berjalan. sebuah pendek lab jalankan structurally dapat’t see sebagian besar dari itu.

So practical aturan adalah: gunakan data lab untuk debug sebuah spesifik shift, dan data lapangan untuk know Anda nyata score. Google peringkat pada field data dari Chrome pengguna Experience Report (CrUX), surfaced di PageSpeed Insights dan Search Console. jika Lighthouse membaca 0,0 tetapi PageSpeed Insights menampilkan 0,18, treat field angka sebagai satu itu reflects Anda sebenarnya pengguna — lalu go reproduce shift di lab oleh interacting dengan halaman cara sebuah nyata pengunjung akan. Dua lebih cakupan gaps worth knowing: sebagian besar alat, including Lighthouse, jangan propagate iframe layout shifts up untuk parent document’s score bahkan though CrUX dapat reflect them, dan RUM dibangun pada Layout Instability API inherits itu sama iframe blind spot — so Anda own nyata-pengguna monitoring dapat di bawah-jelaskan sebuah CrUX angka itu looks worse daripada apa Anda pertama-party attribution menampilkan.

umum penyebab

di rough order dari bagaimana sering I see them:

  1. Images dan video tanpa dimensions. Tidak reserved height berarti semuanya di bawah jumps ketika media memuat.
  2. Ads, embeds, dan iframes tanpa reserved space. Ad networks sajikan dynamic sizes; embeds jangan announce mereka height sebelum memuat.
  3. Dynamically injected konten di atas existing konten. Cookie banners, notification bars, “related” (terjemahan) “related” widgets, late-memuat promos — apa pun itu pushes down apa sudah pada screen.
  4. Web fonts (FOIT/FOUT). Ketika custom font swaps di untuk fallback, text reflows jika mereka metrics differ.
  5. Animations pada layout-triggering properties. Animating top, left, margin, box-shadow, atau box-sizing forces browser untuk re-lay-out halaman pada setiap frame.

memperbaiki

setiap perbaiki mirrors -nya penyebab:

  • Images/video — reserve space. Set width dan height attributes so browser computes aspect ratio dan holds box; pair dengan img { height: auto; width: 100%; } untuk responsive perilaku, atau gunakan CSS aspect-ratio property. ini adalah single highest-leverage CLS perbaiki pada sebagian besar situs.
  • Ads/embeds/iframes — reserve space too. gunakan min-height atau aspect-ratio pada container; untuk ad slots, Google’s Publisher Tag guidance adalah blunt: “Setting a fixed height and width directly on the ad slot div is the most effective way to do this.” (terjemahan) “Menetapkan tinggi dan lebar tetap langsung pada div slot iklan adalah cara paling efektif untuk melakukannya.” untuk multi-size slots, reserve untuk largest configured size. Push late-memuat konten lebih rendah so apa pun residual shift adalah di bawah fold.
  • Dynamic konten — jangan insert ke flow. Reserve sebuah placeholder itu matches akhir size, atau overlay konten alih-alih injecting ini. Skeleton loaders hanya help jika mereka match akhir dimensions persis — sebuah skeleton bahkan sebuah sedikit pixels lebih singkat daripada nyata konten masih shifts. Prefer pengguna-triggered memuat (“Load lebih” (terjemahan) “muat lebih”) di atas surprise insertions.
  • Fonts — match metrics. font-display: optional adalah satu-satunya nilai dengan effectively zero CLS risk; swap minimizes invisible text tetapi dapat shift pada tukar. Better masih, gunakan CSS metric overrides — size-adjust, ascent-override, descent-override, line-gap-override — untuk size fallback font untuk match web font so tukar adalah seamless. Preload critical fonts.
  • Animations — transform hanya. Animate dengan transform (translate, scale, rotate) alih-alih top/left/margin. Transform-based animations adalah composited dan jangan trigger layout, so mereka jangan shift apa pun.

Bagaimana CLS fits ke rankings (pertahankan ini di proportion)

CLS adalah satu input untuk Google’s pengalaman halaman sinyal. Google says Core Web Vitals adalah sesuatu -nya peringkat sistem gunakan — tetapi saat ini Penelusuran documentation tidak publish sebuah tepat CLS weight, sebuah tiebreaker aturan, atau sebuah peringkat jaminan, so treat apa pun spesifik mechanism (including “ini a tiebreaker” (terjemahan) “ini adalah sebuah tiebreaker”) sebagai sebuah berfungsi approximation, tidak sebuah terdokumentasi fact. My standing advice di seluruh semuanya I tulis tentang Core Web Vitals: mendapatkan ke “good” (terjemahan) “baik” band dan move pada. sebagian besar situs tidak akan see sebuah bermakna peringkat atau business lift dari grinding 0,08 down untuk 0,02, dan sebuah single score rarely menjelaskan sebuah revenue atau conversion outcome oleh itself. CLS adalah table stakes — Anda ingin jelas bar, tetapi ini tidak seharusnya become centerpiece dari Anda SEO program di expense dari LCP, INP, atau, frankly, Anda sebenarnya konten.

Dua operational notes itu save sebuah lot dari confusion:

  • CrUX lags ~28 days. ini adalah sebuah rolling 28-day window, so sebuah perbaiki Anda ship hari ini tidak akan fully register di PageSpeed Insights atau Search Console untuk weeks. jangan panic ketika angka tidak move berikutnya morning.
  • ** attributed element adalah sering tidak root penyebab.** Layout Shift Attribution API tells Anda yang element moved, tetapi sebagai web.dev notes, “ini possible itu ini elements adalah hanya indirectly related untuk itu ‘root penyebab’ dari layout instability.” (terjemahan) “ini adalah mungkin itu ini elements adalah hanya indirectly related untuk ‘root penyebab’ dari layout instability.” text itu jumped adalah biasanya victim dari sebuah unsized image di atas ini memuat late — perbaiki penyebab, tidak symptom. berfungsi ini sebagai sebuah timestamp-untuk-trigger loop: note shift’s mulai time, lalu periksa apa else changed di itu sama window — sebuah network permintaan finishing, sebuah image atau font arriving, sebuah resize, atau sebuah class/style perubahan — dan treat attributed node sebagai sebuah lead, tidak proof, until Anda’ve cocok ini untuk itu trigger.

Add an expert note

Pin an expert quote

New person? Create their unclaimed profile at /admin/experts/ → Pin a quote first.