Interaction to następny Paint (INP)

co INP measures, the ≤200 ms threshold at p75, why it replaced FID in 2024, i how to actually fix a poor score — z a techniczne SEO.

Opublikowano po raz pierwszy: 26 cze 2026 · Ostatnia aktualizacja: 3 sie 2026 · Advanced
Języki

Interaction to następny Paint (INP) jest the Core Web Vital dla responsiveness. It watches każdy click, tap, i keyboard interaction w całym a visit i raporty the opóźnienie że (close to) wszystkie of them came in poniżej — measured at the 75th percentile in the pole. Good jest ≤200 ms, poor jest >500 ms. INP replaced opóźnienie pierwszego wejścia on March 12, 2024, ponieważ FID tylko timed the pierwszy interaction's input opóźnienie; INP measures the pełny opóźnienie (input opóźnienie + processing + presentation) of wszystkie of them. You fix it by breaking up long tasks, yielding to the main thread, doing mniej in event handlers, shrinking the DOM, i taming third-party scripts. It's a pole metric — Total Blocking Time jest jego lab proxy.

TL;DR — INP jest the Core Web Vital dla responsiveness. It observes the opóźnienie of wszystkie click, tap, i keyboard interactions w całym a visit i raporty the wartość at the 75th percentile (one outlier dropped per 50 interactions) — nie just the pierwszy input like FID zrobił. An interaction’s opóźnienie = input opóźnienie + processing duration + presentation opóźnienie. Good ≤ 200 ms, poor > 500 ms, judged on pole data at p75. It replaced FID on March 12, 2024 (FID fully removed z narzędzia September 2024). Fix it by breaking up long tasks, yielding to the main thread z scheduler.yield(), doing mniej in event handlers, shrinking the DOM, i deferring third-party scripts. It’s a pole metric — Total Blocking Time jest the lab proxy, i the two don’t zawsze agree.

co INP measures — i how it differs z FID

Google’s definition jest precise: INP “assesses a page’s overall responsiveness to user interactions by observing the latency of all click, tap, and keyboard interactions that occur throughout the lifespan of a user’s visit to a page.”

Evidence for this claim INP observes click, tap, and keyboard interaction latency throughout a page visit rather than measuring only the first input delay. Scope: Current web.dev INP definition and qualifying interaction types. Confidence: high · Verified: web.dev: Interaction to Next Paint

że “all interactions… throughout the lifespan” phrasing jest the whole story. INP jest a visit-level metric, nie a load-time one — i Google’s reasoning jest że the vast majority of a użytkownik’s time on a strona happens po it loads, so responsiveness podczas używać matters więcej niż the pierwszy impression alone.

The contrast z opóźnienie pierwszego wejścia jest the cleanest way to understand it: “FID only measured the input delay of the first interaction on a page. INP improves on FID by observing all interactions on a page, beginning from the input delay, to the time it takes to run event handlers.” FID timed one thing o one interaction — the wait przed jego handler started — i ignored oba how long the handler ran i how long the screen took to update. INP measures the pełny opóźnienie of każdy interaction.

One nuance worth getting right, ponieważ it’s a common myth: INP jest nie literally the worst interaction. To avoid punishing a strona dla a single random spike, the przeglądarka drops one outlier dla każdy 50 interactions, then raporty the wartość at the 75th percentile of strona views. On a niski-interaction visit, że lands on the slowest interaction; on a heavy one, a couple of outliers get excluded pierwszy.

co counts as an interaction jest również narrower than people assume. tylko clicks, taps, i keyboard presses są measured. Scrolling, hovering, i zooming są explicitly excluded. i a single gesture może fire several events — a tap produces pointerdown, pointerup, i click — który INP groups as one interaction, nie three. w że group, INP takes the longest individual event duration, nie the sum of wszystkie of them — so a fast pointerdown następny to a slow click nadal raporty as one interaction sized by the slow event. If a strona ma no qualifying interactions podczas a visit, INP simply isn’t reported dla it.

The three parts of an interaction’s opóźnienie

każdy interaction’s opóźnienie breaks do three sequential pieces. ten jest the model to zachować in twój head, ponieważ każdy part points at a różny fix:

Interaction latency = Input delay + Processing duration + Presentation delay

  1. Input opóźnienie — the time przed twój event handlers może even start running, zwykle ponieważ the main thread jest busy finishing a long task.
  2. Processing duration — the time it takes wszystkie of twój event handler callbacks to execute.
  3. Presentation opóźnienie — the time z gdy twój handlers finish until the przeglądarka paints the następny frame on screen.

The web-vitals attribution build exposes wszystkie three (inputDelay, processingDuration, presentationDelay) so you może see który part dominates on a rzeczywisty interaction. Per the Web Almanac’s 2024 data, presentation opóźnienie jest często the largest single piece at the median — ale processing duration jest gdzie the optymalizacja leverage zwykle lives, ponieważ it’s the part że balloons on poorly-built strony.

INP measures the whole interaction. Attribute the delay to the waiting, handler, or presentation phase before choosing a fix. Źródło: web.dev

The interaction begins with input delay while the event waits for the main thread. Processing duration follows while the event-handler callbacks execute. Presentation delay runs from the end of the handlers until the browser lays out and paints the next frame. Together these three sequential phases make up the interaction latency measured by INP.

© Patrick Stox LLC · CC BY 4.0 ·

The thresholds — i the p75 pole caveat

RatingINP wartośćMeasured at
Good≤ 200 ms75th percentile, pole
Needs improvement> 200 ms i ≤ 500 ms75th percentile, pole
Poor> 500 ms75th percentile, pole

Google Search Central states the target plainly — “an INP of less than 200 milliseconds” — i frames the whole program as: “We highly recommend site owners achieve good Core Web Vitals for success with Search.” The 200 ms budget jest genuinely tight gdy you remember the przeglądarka wants a frame każdy ~16,7 ms at 60 fps; wszystkie of twój handler działać plus renderowanie ma to fit.

Evidence for this claim INP is good at 200 milliseconds or less and poor above 500 milliseconds, assessed at the 75th percentile. Scope: Current web.dev INP thresholds for field measurement. Confidence: high · Verified: web.dev: Interaction to Next Paint

Why INP jest a pole metric (i lab data isn’t enough)

ten jest the trap że catches a lot of SEOs: a green Lighthouse score robi nie mean good INP. ale “Lighthouse can’t measure INP” needs three oddzielny cases, nie one, lub you’ll misread twój own tooling:

  1. A standard, noninteractive Lighthouse run raporty no INP at wszystkie. It tylko observes the strona ładowanie — it nigdy clicks, taps, lub types anything — so there’s no interaction to time. Lighthouse falls back on Total Blocking Time (TBT) as a load-time proxy instead. Google’s own framing: “Because TBT correlates well with INP, a page with a high TBT is a reasonable indicator that there may be high INP values during load.” The key words są “during load.” TBT says nothing o an interaction że goes bad ten seconds later gdy a lazy-załadowany widget runs — it’s a proxy, nigdy a substitute lub a conversion formula.
  2. A manually lub synthetically exercised interaction — clicking a rzeczywisty button in DevTools, lub scripting a click in a lab narzędzie — robi produce a rzeczywisty INP-style opóźnienie liczba dla że one interaction. że’s użyteczny dla reproducing a specific bug. ale it’s nadal one scripted path on one urządzenie: it może’t stand in dla the pole’s mix of rzeczywisty urządzenia, rzeczywisty użytkownicy, rzeczywisty interaction targets, i a pełny visit’s worth of strona lifetime. As Google puts it, the resulting wartość “will be dependent on what interactions are performed during the measurement period,” i rzeczywisty użytkownik behavior jest too variable dla a single lab run to represent it.
  3. The pole distribution jest the tylko thing INP actually jest. że’s why the authoritative źródło jest pole data: the Chrome doświadczenie użytkownika raport (CrUX), surfaced przez PageSpeed Insights i the Search Console Core Web Vitals raport. “Field data is the best source of information you can draw on when it comes to understanding which interactions are problematic for actual users.”

użyj lab (cases 1 i 2) to find i reproduce a slow interaction; użyj pole (case 3) to confirm whether it’s actually dragging down rzeczywisty visitors’ scores.

Why twój INP score jest poor

Almost każdy INP problem traces back to the main thread będąc blocked gdy a użytkownik interacts. The usual suspects:

  • Long tasks. dowolny main-thread task ponad 50 ms jest a long task; the amount ponad 50 ms jest jego “blocking period.” podczas gdy one runs, twój interaction może’t być handled. ten jest the single biggest cause.
  • Heavy event handlers. Doing too much synchronously inside a click/input handler inflates processing duration directly.
  • duży DOM size. Bigger DOMs cost więcej to render, który inflates oba input i presentation opóźnienie.
  • Third-party scripts. Per the Web Almanac, zgoda providers, znacznik managers, analytics, i chat widgets są top offenders — i they hit even prosty treść witryny. They’re the pierwszy place I look on a strona I didn’t build.
  • Post-load JavaScript. Just ponieważ a strona wyrenderowany doesn’t mean it finished ładowanie — scripts evaluating po pierwszy paint może blok early interactions.

How to fix it

The strategies, roughly in order of impact:

1. Break up long tasks. Google’s core advice on handlers jest to “do as little work as possible in them.” Split a big job do smaller tasks so the przeglądarka może interleave a użytkownik interaction. gdy tasks są broken up, “the browser can respond to higher-priority work much sooner — including user interactions.”

2. Yield to the main thread. The modern, recommended way jest scheduler.yield() (Chrome 129+, Firefox 142+): await scheduler.yield() pauses twój code, lets the przeglądarka handle pending działać, i resumes z priority — so other tasks won’t cut the wiersz ahead of twój continuation. The classic fallback jest setTimeout(..., 0), który nadal działa ale wysyła twój code to the back of the task queue (i przeglądarki enforce a 5 ms floor po several nested calls). One thing to stop doing: isInputPending() — Google now says “we no longer recommend using this API.” See the Scripts tab dla the pattern.

3. robić mniej in event handlers — defer the non-critical działać. Run tylko the visual update the następny frame needs synchronously; push everything else (saving, spell-sprawdzenie, analytics, word counts) behind requestAnimationFrame + setTimeout lub a yield. The użytkownik sees the odpowiedź immediately; the bookkeeping happens po.

4. Avoid layout thrashing. Reading layout właściwości right po writing styles in the same task forces the przeglądarka do synchronous layout it mógł otherwise mieć batched. Batch reads, then writes.

5. Reduce DOM size. Smaller trees render faster. content-visibility może lazily render off-screen elementy so they don’t cost you podczas load lub interaction.

6. Audit i defer third-party scripts. ten jest the highest-leverage SEO fix on rzeczywisty witryny. Load zgoda/znacznik/analytics scripts lazily, gate them on interaction, lub move them off the critical path. A “lightweight” treść strona może fail INP purely z powodu a heavy embedded widget.

robi INP affect rankings?

Yes — INP jest one of the three Core Web Vitals, i Core Web Vitals są part of Google’s strona-experience signals. ale it’s a lightweight signal: a tiebreaker między comparably relevant wyniki, nie a primary czynnik rankingowy. Don’t chase a perfect INP score at the expense of treść i relevance.

Two practical SEO points. pierwszy, mobilny jest the trudny liczba. In the 2024 Web Almanac, ~74% of mobilny witryny passed INP versus ~97% on komputer stacjonarny — i ponieważ Google indexes mobilny-pierwszy, the mobilny figure jest the one że counts. Second, complex witryny robić worse: tylko ~53% of the top 1 000 witryny passed, ponieważ funkcja-rich strony ship więcej JavaScript to blok the main thread. Heavy funkcja development jest an INP risk, i wysoki-interaction strony — strony produktów, realizacja zakupu, wyniki wyszukiwania, forms — są far więcej exposed than statyczny treść.

INP vs FID — the pełny picture

FID (retired)INP (current)
Interactionspierwszy tylkowszystkie, whole visit
co it timesInput opóźnienie tylkoInput opóźnienie + processing + presentation
Good threshold≤ 100 ms≤ 200 ms
StatusRemoved z narzędzia Sept 2024Core Web Vital since Mar 12, 2024

FID jest gone — removed z Search Console on the day INP launched i z CrUX’s BigQuery/API by September 2024. If a narzędzie lub audit nadal references FID, it’s stale.

Edge cases że make INP data disagree

A handful of lifecycle quirks wyjaśniać najbardziej “why doesn’t my RUM match CrUX” questions:

  • No interactions, no INP. If a visit nigdy gets a click, tap, lub key press — lub tylko gets excluded gestures like scrolling i hovering — there’s no INP wartość dla że strona view. ten jest normal on read-tylko treść strony i isn’t a bug in twój monitorowanie.
  • Iframes count toward the metric, ale twój own JavaScript może’t see inside them. An interaction inside an embedded iframe (an ad, a widget, an embedded form) contributes to the strona’s INP. ale a pierwszy-party RUM script może’t read events z a cross-origin iframe the way the przeglądarka’s own metric może — so CrUX i a same-origin RUM setup może legitimately disagree on strony z third-party embeds. Document ten gap zamiast treating a RUM/pole mismatch as a bug.
  • Back/forward pamięć podręczna restores reset INP to zero. A strona pulled z bfcache (the back button, na przykład) starts a fresh INP count — interactions z przed the navigation away don’t carry ponad.
  • Long-lived i backgrounded tabs nadal need to raport. ponieważ a tab może sit otwarty dla hours bez ever formally unloading — especially on mobilny, gdzie the OS może just kill it — INP powinien być captured gdy the strona becomes hidden, nie tylko on unload. RUM setups że tylko flush on unload będzie silently lose data z te visits.

gdzie ten sits

INP jest one piece of the Core Web Vitals picture, alongside Largest Contentful Paint (ładowanie) i Cumulative Layout Shift (visual stability). sprawdzenie it in PageSpeed Insights i the Search Console raport (pole), i debug it in Lighthouse / Chrome DevTools (lab, via the TBT proxy). The data behind wszystkie of it comes z CrUX.

Add an expert note

Pin an expert quote

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