Internet staje się coraz bardziej interaktywny, a szybkość reakcji stron na działania użytkownika jest kluczowa dla pozytywnych doświadczeń online. Interaction to Next Paint (INP) to nowa metryka wydajności wprowadzona przez Google, która zmienia sposób oceny responsywności stron internetowych. W tym artykule dowiesz się, czym dokładnie jest INP, dlaczego staje się tak ważna i jak optymalizować swoją stronę pod kątem tej metryki.
Spis treści
ToggleCzym jest Interaction to Next Paint?
Interaction to Next Paint to wskaźnik mierzący czas, jaki upływa od momentu interakcji użytkownika ze stroną (np. kliknięcia przycisku) do momentu, gdy przeglądarka wyświetli odpowiedź wizualną na tę interakcję. Jest to jedna z najnowszych metryk Core Web Vitals, która zostanie oficjalnie wprowadzona w marcu 2024 roku, zastępując starszą metrykę First Input Delay (FID).
W przeciwieństwie do FID, która mierzyła tylko opóźnienie pierwszej interakcji, INP analizuje wszystkie interakcje podczas sesji użytkownika, dając pełniejszy obraz rzeczywistej responsywności strony. Co istotne, Google wybiera percentyl 75% najwolniejszych interakcji jako wartość finalną, co oznacza, że nawet pojedyncze wolne reakcje mogą znacząco wpłynąć na wynik.
Interaction to Next Paint uwzględnia trzy główne typy interakcji:
- Kliknięcia myszą lub dotknięcia ekranu
- Naciśnięcia klawiszy
- Interakcje z formularzami
Co ciekawe, przewijanie strony (scroll) nie jest uwzględniane w pomiarach INP, ponieważ przeglądarki przetwarzają je na osobnym wątku, zapewniając zwykle płynność tego działania.
Dlaczego Interaction to Next Paint jest ważne?
Znaczenie tej metryki trudno przecenić – zarówno z perspektywy użytkownika, jak i właściciela strony internetowej. Zrozumienie jej wpływu na różne aspekty obecności online jest kluczowe.
Wpływ na doświadczenia użytkownika
Badania pokazują, że ludzki mózg jest wyjątkowo wrażliwy na opóźnienia w reakcji interfejsu. Opóźnienia dłuższe niż 100 ms są zauważalne, a przekraczające 300 ms powodują wyraźną frustrację. Dobre wyniki INP przekładają się bezpośrednio na:
- Wyższy poziom zadowolenia użytkowników
- Dłuższy czas spędzony na stronie
- Niższy współczynnik odrzuceń
- Lepszą konwersję
Wyobraź sobie sklep internetowy, w którym kliknięcie przycisku „Dodaj do koszyka” powoduje sekundowe opóźnienie przed jakąkolwiek reakcją. Taka sytuacja może wywołać niepewność u klienta („Czy to działa?”) i często prowadzi do wielokrotnych kliknięć lub porzucenia procesu zakupowego.
Znaczenie dla SEO i widoczności w Google
Google oficjalnie potwierdził, że od marca 2024 roku Interaction to Next Paint stanie się pełnoprawnym czynnikiem rankingowym, zastępując FID w zestawie Core Web Vitals. Oznacza to, że strony z słabym INP mogą doświadczyć spadku pozycji w wynikach wyszukiwania.
To szczególnie istotne w kontekście Mobile-First Indexing, gdzie Google priorytetowo traktuje wydajność na urządzeniach mobilnych, na których problemy z responsywnością są zwykle bardziej widoczne.
Jak działa Interaction to Next Paint?
Aby zrozumieć, jak optymalizować INP, warto poznać proces przetwarzania interakcji przez przeglądarkę. Kiedy użytkownik wchodzi w interakcję ze stroną, uruchamiany jest złożony łańcuch zdarzeń:
- Input delay – czas oczekiwania, zanim przeglądarka może rozpocząć przetwarzanie zdarzenia
- Processing time – czas potrzebny do wykonania kodu obsługującego zdarzenie
- Presentation delay – czas potrzebny do wyrenderowania zmian na ekranie
INP mierzy całkowity czas od rozpoczęcia interakcji do momentu wyświetlenia odpowiedzi wizualnej. Google definiuje trzy poziomy wydajności dla tej metryki:
- Dobry: poniżej 200 ms
- Wymaga poprawy: 200-500 ms
- Słaby: powyżej 500 ms

Jak mierzyć Interaction to Next Paint?
Pomiar INP jest pierwszym krokiem w procesie optymalizacji. Na szczęście istnieje kilka dostępnych narzędzi, które ułatwiają tę pracę.
Narzędzia do diagnostyki INP
- Chrome DevTools – W najnowszych wersjach Chrome możesz znaleźć metryki INP w panelu Performance i w zakładce Web Vitals. Kliknij prawym przyciskiem myszy na wykresie wydajności i włącz opcję „Web Vitals”, aby zobaczyć interakcje wraz z ich czasami.
- PageSpeed Insights – To oficjalne narzędzie Google do analizy wydajności stron. Pokazuje zarówno dane laboratoryjne, jak i rzeczywiste (z Chrome UX Report) dla Twojej strony, włączając INP.
- Google Search Console – W raportach Core Web Vitals znajdziesz informacje o wydajności INP dla całej Twojej witryny, wraz z identyfikacją problematycznych stron.
- web-vitals.js – Ta lekka biblioteka JavaScript pozwala na monitorowanie INP bezpośrednio na Twojej stronie:
javascriptCopyimport {onINP} from 'web-vitals';
onINP(({value}) => {
console.log(`INP: ${value}`);
// Możesz wysłać tę wartość do swojego systemu analitycznego
});
Analiza danych INP
Podczas analizy wyników INP warto zwrócić uwagę na:
- Czas trwania poszczególnych interakcji
- Wzorce występujące przy wolnych interakcjach (np. konkretne elementy strony)
- Długie zadania blokujące główny wątek
- Różnice między urządzeniami (desktop vs mobile)
Pamiętaj, że same dane liczbowe to dopiero początek. Kluczowa jest interpretacja tych danych i identyfikacja konkretnych problemów do rozwiązania.
Główne przyczyny słabego INP
Zanim przejdziemy do technik optymalizacji, warto zrozumieć, co najczęściej powoduje wysokie (czyli słabe) wartości INP:
Blokowanie głównego wątku
Przeglądarka używa jednego głównego wątku do przetwarzania JavaScript, obliczania stylów, układu strony i renderowania. Jeśli wątek jest zajęty wykonywaniem długiego zadania, nie może reagować na interakcje użytkownika.
Najczęstsze powody blokowania głównego wątku to:
- Duże operacje przetwarzania danych
- Złożone obliczenia w JavaScript
- Nadmierne manipulacje DOM
- Zbyt wiele zapytań do serwerów w trakcie interakcji
Nieefektywne handlery zdarzeń
Kod obsługujący interakcje użytkownika może być sam w sobie przyczyną opóźnień:
- Zbyt złożona logika biznesowa wykonywana synchronicznie
- Nadmierna liczba nasłuchiwanych zdarzeń
- Brak debouncing/throttling dla częstych zdarzeń
- Blokujące wywołania API
Problemy z renderowaniem
Nawet jeśli kod JavaScript działa szybko, problemy z renderowaniem mogą nadal powodować opóźnienia:
- Skomplikowane przeliczanie układu strony (layout)
- Złożone efekty wizualne wymagające dużej mocy obliczeniowej
- Nieoptymalne animacje CSS/JS
- Problemy z warstwami kompozycji (composition layers)
Strategie optymalizacji Interaction to Next Paint
Optymalizacja INP wymaga kompleksowego podejścia, koncentrującego się na różnych aspektach wydajności strony.
Optymalizacja kodu JavaScript
JavaScript jest często głównym winowajcą słabego INP, dlatego warto skupić się na jego optymalizacji:
- Dzielenie długich zadań
Długie zadania JavaScript (trwające ponad 50 ms) można podzielić na mniejsze fragmenty, aby odblokować główny wątek:
javascriptCopy// Przed: długie zadanie blokujące główny wątek
function processLargeArray(array) {
for (let i = 0; i < array.length; i++) {
// Kosztowne operacje
}
}
// Po: podzielenie na mniejsze porcje
function processLargeArray(array) {
let index = 0;
function processChunk() {
const end = Math.min(index + 100, array.length);
for (let i = index; i < end; i++) {
// Kosztowne operacje
}
index = end;
if (index < array.length) {
setTimeout(processChunk, 0);
}
}
processChunk();
}
- Wykorzystanie Web Workers
Web Workers pozwalają na wykonywanie ciężkich obliczeń w oddzielnym wątku, bez blokowania głównego interfejsu:
javascriptCopy// Główny skrypt
const worker = new Worker('heavy-calculations.js');
worker.onmessage = function(e) {
const result = e.data;
updateUI(result); // Aktualizacja UI bez blokowania
};
worker.postMessage(dataToProcess);
// heavy-calculations.js
self.onmessage = function(e) {
const data = e.data;
const result = performHeavyCalculations(data);
self.postMessage(result);
};
Efektywna obsługa zdarzeń
Sposób, w jaki obsługujesz zdarzenia, ma ogromny wpływ na INP:
- Delegacja zdarzeń
Zamiast dodawać nasłuchiwacze do wielu elementów, użyj delegacji zdarzeń na elemencie nadrzędnym:
javascriptCopy// Przed: każdy przycisk ma własny nasłuchiwacz
document.querySelectorAll('.button').forEach(button => {
button.addEventListener('click', handleClick);
});
// Po: jeden nasłuchiwacz dzięki delegacji zdarzeń
document.addEventListener('click', e => {
if (e.target.matches('.button')) {
handleClick(e);
}
});
- Debouncing i throttling
Ogranicz częstotliwość wywoływania funkcji przy intensywnych zdarzeniach:
javascriptCopy// Debouncing - wykonuje funkcję tylko po zakończeniu serii zdarzeń
function debounce(func, wait) {
let timeout;
return function(...args) {
clearTimeout(timeout);
timeout = setTimeout(() => func.apply(this, args), wait);
};
}
const optimizedResize = debounce(() => {
// Kod wykonywany po zakończeniu zmiany rozmiaru okna
}, 200);
window.addEventListener('resize', optimizedResize);
- Natychmiastowa informacja zwrotna
Zapewnij użytkownikowi natychmiastowe wskazanie, że jego interakcja została zarejestrowana, nawet jeśli pełne przetwarzanie zajmie więcej czasu:
javascriptCopybutton.addEventListener('click', async () => {
// Natychmiastowa wizualna informacja zwrotna
button.classList.add('loading');
try {
// Asynchroniczne operacje (mogą trwać długo)
const data = await fetchData();
updateUI(data);
} finally {
button.classList.remove('loading');
}
});
Optymalizacja renderowania
Szybkie renderowanie zmian jest kluczowe dla dobrego INP:
- Minimalizacja zmian układu (layout)
Każda zmiana, która wymusza przeliczenie układu strony (layout), może być kosztowna:
javascriptCopy// Nieoptymalne: wymusza wielokrotne przeliczanie układu
function animateHeight(element, toHeight) {
for (let h = 0; h <= toHeight; h++) {
element.style.height = h + 'px';
}
}
// Optymalne: używa właściwości transform, która nie wymusza przeliczania układu
function animateHeight(element, scale) {
element.style.transform = `scaleY(${scale})`;
}
- Używanie właściwości wydajnych do animacji
Niektóre właściwości CSS są znacznie wydajniejsze do animowania:
cssCopy/* Słaba wydajność - wymusza layout */
.slow-animation {
transition: width 300ms, height 300ms, top 300ms, left 300ms;
}
/* Dobra wydajność - używa GPU */
.fast-animation {
transition: transform 300ms, opacity 300ms;
}
- Stosowanie
will-change
Poinformuj przeglądarkę o planowanych zmianach, aby mogła się przygotować:
cssCopy.menu {
will-change: transform, opacity;
}
Praktyczne przykłady optymalizacji INP
Zobaczmy, jak optymalizacja INP wygląda w praktyce, na przykładzie trzech typowych elementów stron internetowych.
Optymalizacja menu nawigacyjnego
Menu to jeden z najczęściej używanych elementów interfejsu, dlatego jego responsywność bezpośrednio wpływa na wrażenia użytkownika.
Problem: Złożone menu rozwijane z animacjami powoduje zauważalne opóźnienia przy kliknięciu.
Rozwiązanie:
- Przeniesienie logiki rozwijania menu z JavaScript do CSS:
cssCopy.dropdown {
opacity: 0;
transform: translateY(-10px);
pointer-events: none;
transition: opacity 150ms ease-out, transform 150ms ease-out;
}
.dropdown-trigger:hover .dropdown,
.dropdown-trigger:focus .dropdown,
.dropdown-trigger.active .dropdown {
opacity: 1;
transform: translateY(0);
pointer-events: auto;
}
- Wstępne renderowanie podmenu zamiast tworzenia ich dynamicznie podczas kliknięcia
- Optymalizacja obrazów w menu poprzez lazy loading i odpowiednie formaty
Rezultat: Zmniejszenie INP dla interakcji z menu z 350 ms do 120 ms.
Poprawa wydajności formularzy
Formularze często zawierają skomplikowaną logikę walidacji, która może negatywnie wpływać na INP.
Problem: Walidacja formularza w czasie rzeczywistym powoduje zauważalne opóźnienia.
Rozwiązanie:
- Zastosowanie debouncing dla zdarzeń input:
javascriptCopyconst validateInput = debounce((input) => {
const value = input.value;
const isValid = validateEmail(value);
if (isValid) {
input.classList.remove('error');
input.classList.add('valid');
} else {
input.classList.remove('valid');
input.classList.add('error');
}
}, 300);
emailInput.addEventListener('input', (e) => validateInput(e.target));
- Wizualne wskazówki dla użytkownika przed zakończeniem pełnej walidacji
- Przeniesienie złożonej walidacji (np. sprawdzanie unikalności nazwy użytkownika) do wykonania po utracie fokusu, a nie w czasie rzeczywistym
Rezultat: Zmniejszenie INP dla interakcji z formularzem z 450 ms do 150 ms.
Optymalizacja karuzeli i sliderów
Karuzele są często problematyczne pod względem wydajności ze względu na złożone animacje i duże obrazy.
Problem: Przełączanie slajdów w karuzeli powoduje zauważalne opóźnienia i przycięcia.
Rozwiązanie:
- Preloadowanie tylko sąsiednich slajdów, nie wszystkich naraz
- Wykorzystanie techniki FLIP (First, Last, Invert, Play) dla wydajnych animacji
javascriptCopyfunction animateSliderFLIP(slider, newPosition) {
// First: zapisz początkową pozycję
const first = slider.getBoundingClientRect();
// Last: ustaw docelową pozycję bezpośrednio (bez animacji)
slider.style.transform = `translateX(${newPosition}px)`;
// Invert: oblicz różnicę i ustaw odwrotną transformację
const last = slider.getBoundingClientRect();
const delta = first.left - last.left;
slider.style.transform = `translateX(${delta}px)`;
// Play: uruchom animację do pozycji docelowej
requestAnimationFrame(() => {
slider.style.transition = 'transform 300ms ease-out';
slider.style.transform = `translateX(${newPosition}px)`;
});
}
- Optymalizacja obrazów w karuzeli (odpowiednie rozmiary, formaty WebP/AVIF)
Rezultat: Zmniejszenie INP dla interakcji ze sliderem z 380 ms do 140 ms.

Błędy do uniknięcia przy optymalizacji INP
Przy optymalizacji Interaction to Next Paint łatwo wpaść w pułapki, które mogą przynieść więcej szkody niż pożytku.
Nadmierna optymalizacja
Poświęcanie zbyt dużo czasu na mikrooptymalizacje, które dają marginalne korzyści, może być marnotrawstwem zasobów. Lepiej skupić się na najpoważniejszych problemach, które mają największy wpływ na INP.
Pomijanie testów na rzeczywistych urządzeniach
Testowanie wydajności INP tylko na mocnych komputerach deweloperskich może dawać fałszywy obraz rzeczywistej wydajności. Zawsze testuj na średniej klasy urządzeniach mobilnych, które lepiej reprezentują doświadczenia rzeczywistych użytkowników.
Ignorowanie różnic między przeglądarkami
Różne przeglądarki mogą inaczej obsługiwać te same interakcje. Typowym błędem jest testowanie tylko w Chrome i ignorowanie innych przeglądarek, które mogą mieć inne problemy z wydajnością.
Nadużywanie ciężkich bibliotek
Poleganie na ciężkich bibliotekach JavaScript dla prostych interakcji to częsty problem. Czasami lepszym rozwiązaniem jest napisanie prostego, dedykowanego kodu zamiast importowania całej biblioteki:
javascriptCopy// Zamiast importować całą bibliotekę dla prostej animacji
import { animate } from 'heavy-animation-library'; // 300KB
animate(element, { opacity: 1, duration: 300 });
// Lepiej napisać prosty kod
function fadeIn(element, duration = 300) {
element.style.opacity = 0;
element.style.transition = `opacity ${duration}ms`;
requestAnimationFrame(() => element.style.opacity = 1);
}
Przyszłość Interaction to Next Paint
Wraz z oficjalnym wprowadzeniem INP do Core Web Vitals w marcu 2024, możemy spodziewać się kilku istotnych zmian w ekosystemie webowym.
Wpływ na frameworki i biblioteki
Możemy oczekiwać, że popularne frameworki JavaScript (React, Vue, Angular) wprowadzą zmiany w swoich implementacjach, aby lepiej optymalizować INP. Już teraz widać prace nad:
- Lepszym planowaniem aktualizacji UI
- Priorytetyzacją renderowania
- Mechanizmami puli zadań (task scheduling)
Ewolucja narzędzi deweloperskich
Wraz ze wzrostem znaczenia INP, narzędzia deweloperskie będą rozwijać funkcje dedykowane do diagnostyki i optymalizacji tej metryki:
- Bardziej szczegółowe profile interakcji
- Sugestie optymalizacji w czasie rzeczywistym
- Automatyczne wykrywanie problematycznych wzorców kodu
Jak przygotować się na nadchodzące zmiany?
Aby być gotowym na przyszłość z INP, warto:
- Wdrożyć monitoring – Dodaj śledzenie INP do swoich narzędzi analitycznych, aby mieć dane historyczne i obserwować trendy.
- Ustalić budżet wydajnościowy – Zdefiniuj maksymalne dopuszczalne wartości INP dla różnych części Twojej strony i monitoruj ich przestrzeganie.
- Zaktualizować proces code review – Dodaj sprawdzanie potencjalnego wpływu na INP jako część procesu przeglądu kodu.
- Edukować zespół – Upewnij się, że wszyscy członkowie zespołu rozumieją znaczenie INP i podstawowe techniki jego optymalizacji.
Podsumowanie
Interaction to Next Paint to więcej niż tylko kolejna metryka technologiczna – to rzeczywisty miernik jakości doświadczeń użytkownika. Strony z dobrym INP są bardziej przyjazne, profesjonalne i skuteczne w realizacji swoich celów biznesowych.
Optymalizacja INP wymaga holistycznego podejścia, obejmującego JavaScript, CSS i architekturę aplikacji. Kluczowe jest zrozumienie, że każda interakcja ma znaczenie, a optymalizacja to proces ciągły, nie jednorazowe zadanie.
Wraz z nadchodzącym włączeniem INP do Core Web Vitals, inwestycja w tę metrykę staje się nie tylko kwestią UX, ale i pozycjonowania. Strony, które już teraz zadbają o optymalizację Interaction to Next Paint, zyskają przewagę nad konkurencją i będą lepiej przygotowane na przyszłość internetu.
Najwyższy czas rozpocząć pracę nad poprawą tej kluczowej metryki – Twoi użytkownicy i algorytmy wyszukiwarek z pewnością to docenią.

Jestem Łukasz Wesołowski i od około 2016 roku zajmuję się SEO, pomagając stronom osiągać wyższe pozycje w wyszukiwarkach. Po godzinach zgłębiam tajniki sztucznej inteligencji i uczenia maszynowego oraz tego jaki ma wpływ na działania SEO – wierzę, że AI to game changer w wielu aspektach.