Core Web Vitals Optimalizálás

Mi az a Core Web Vitals és miért fontos?

A Core Web Vitals a Google három legfontosabb felhasználói élmény metrikája, amelyek azt mérik, hogy egy weboldal mennyire gyorsan tölt be, mennyire interaktív, és mennyire stabil vizuálisan. Ezek a metrikák 2021 óta hivatalos Google ranking faktorok, ami azt jelenti, hogy közvetlenül befolyásolják a keresési eredményekben való helyezésedet.

Core Web Vitals három metrikája: LCP, FID/INP és CLS áttekintés küszöbértékekkel

A Core Web Vitals három metrikából áll:

LCP (Largest Contentful Paint): A legnagyobb tartalmi elem betöltési ideje. Ez méri, hogy a legfontosabb tartalom (általában egy nagy kép vagy szövegblokk) mennyi idő alatt válik láthatóvá. A jó érték: kevesebb mint 2.5 másodperc.

FID (First Input Delay): Az első interakció késleltetése. Ez azt méri, hogy mennyi időbe telik, mire a böngésző reagál a felhasználó első kattintására, gombnyomására vagy érintésére. A jó érték: kevesebb mint 100 milliszekundum. (2024 márciusától az FID-t felváltja az INP - Interaction to Next Paint.)

CLS (Cumulative Layout Shift): Az összesített elrendezés-eltolódás. Ez méri a váratlan layout változásokat oldal betöltés közben (pl. amikor egy kép megjelenik és eltol egy gombot). A jó érték: kevesebb mint 0.1.

Ezek a metrikák kritikusak, mert:

  • Ranking faktor: A Google figyelembe veszi őket a keresési helyezésnél
  • Felhasználói élmény: Jobb metrikák = elégedettebb látogatók = alacsonyabb bounce rate
  • Konverzió: Gyorsabb oldalak magasabb konverziós arányt eredményeznek
  • Mobil SEO: Különösen fontos mobilon, ahol a felhasználók elvárják a gyors betöltést

Hogyan működnek a Core Web Vitals metrikák?

LCP - Largest Contentful Paint

LCP Timeline: a böngésző betöltési folyamata TTFB-től FCP-n át LCP-ig vizualizálva

Az LCP azt méri, hogy a viewport legnagyobb látható tartalmi eleme mennyi idő alatt töltődik be. Ez az elem lehet:

  • <img> tag
  • <image> elem egy <svg>-n belül
  • <video> tag (a poster kép)
  • URL-lel betöltött háttérkép (background-image)
  • Szöveget tartalmazó blokk szintű elem (<h1>, <p>, stb.)

Jó LCP érték elérése:

<!-- 1. Képek optimalizálása és preload -->
<link rel="preload" as="image" href="/hero-image.webp">

<img 
  src="/hero-image.webp" 
  alt="Hero kép"
  width="1200" 
  height="600"
  loading="eager"
  fetchpriority="high"
>
<!-- 2. Kritikus CSS inline, többi defer -->
<style>
  /* Kritikus above-the-fold CSS */
  .hero { display: flex; }
</style>

<link rel="preload" href="/styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/styles.css"></noscript>
// 3. Lazy loading nem-kritikus képekre
document.addEventListener('DOMContentLoaded', function() {
  const lazyImages = document.querySelectorAll('img[loading="lazy"]');
  
  if ('IntersectionObserver' in window) {
    const imageObserver = new IntersectionObserver((entries, observer) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src;
          img.classList.remove('lazy');
          imageObserver.unobserve(img);
        }
      });
    });

    lazyImages.forEach(img => imageObserver.observe(img));
  }
});
# 4. Szerver válaszidő javítása (nginx config)
http {
    # Gzip tömörítés
    gzip on;
    gzip_vary on;
    gzip_min_length 1024;
    gzip_types text/css application/javascript image/svg+xml;

    # Cache headers
    location ~* \.(jpg|jpeg|png|webp|svg|woff2)$ {
        expires 1y;
        add_header Cache-Control "public, immutable";
    }
}

FID/INP - First Input Delay / Interaction to Next Paint

Az FID azt méri, hogy mennyi idő telik el a felhasználó első interakciója (kattintás, tap) és a böngésző válasza között. 2024 márciusától az INP (Interaction to Next Paint) veszi át az FID helyét, amely minden interakciót mér, nem csak az elsőt.

Jó FID/INP érték elérése:

<!-- 1. JavaScript defer/async használata -->
<!-- Defer: HTML parsing után fut, sorrend megmarad -->
<script defer src="/main.js"></script>

<!-- Async: amint letöltődik, fut (sorrend nem garantált) -->
<script async src="/analytics.js"></script>
// 2. Long tasks felosztása
// Rossz példa: blokkoló long task
function processLargeArray(items) {
  items.forEach(item => {
    // Időigényes művelet
    processItem(item);
  });
}

// Jó példa: felosztás kisebb taskokra
async function processLargeArrayOptimized(items) {
  const chunkSize = 100;
  
  for (let i = 0; i < items.length; i += chunkSize) {
    const chunk = items.slice(i, i + chunkSize);
    
    // Feldolgozás
    chunk.forEach(item => processItem(item));
    
    // Yield vissza a main thread-nek
    await new Promise(resolve => setTimeout(resolve, 0));
  }
}
// 3. requestIdleCallback használata nem kritikus feladatokra
function sendAnalytics(data) {
  if ('requestIdleCallback' in window) {
    requestIdleCallback(() => {
      fetch('/analytics', {
        method: 'POST',
        body: JSON.stringify(data)
      });
    }, { timeout: 2000 });
  } else {
    // Fallback régebbi böngészőkre
    setTimeout(() => {
      fetch('/analytics', {
        method: 'POST',
        body: JSON.stringify(data)
      });
    }, 1000);
  }
}
// 4. Event handler optimalizálás
// Rossz példa: szinkron, lassú handler
button.addEventListener('click', (e) => {
  // Szinkron, blokkoló művelet
  const result = heavyComputation();
  updateUI(result);
});

// Jó példa: nem blokkoló handler
button.addEventListener('click', async (e) => {
  // Immediate feedback
  button.classList.add('loading');
  
  // Async művelet
  const result = await heavyComputationAsync();
  
  // UI update
  requestAnimationFrame(() => {
    button.classList.remove('loading');
    updateUI(result);
  });
});

CLS - Cumulative Layout Shift

CLS vizuális példa: layout shift probléma és megoldás összehasonlítása

A CLS méri a váratlan layout eltolódásokat. Minden alkalommal, amikor egy látható elem pozíciója megváltozik, az hozzájárul a CLS pontszámhoz.

CLS problémák okai és megoldásai:

<!-- 1. Képeknek MINDIG add meg a méretet! -->
<!-- Rossz példa: méret nélküli kép -->
<img src="/image.jpg" alt="Kép">

<!-- Jó példa: explicit width/height -->
<img 
  src="/image.jpg" 
  alt="Kép"
  width="800" 
  height="600"
>

<!-- Vagy CSS aspect-ratio használata -->
<style>
  .responsive-img {
    width: 100%;
    height: auto;
    aspect-ratio: 16 / 9;
  }
</style>
<img src="/image.jpg" alt="Kép" class="responsive-img">
<!-- 2. Reklámok és beágyazások számára hely foglalása -->
<div class="ad-container" style="min-height: 250px;">
  <!-- Reklám betöltődik ide -->
  <div id="ad-slot"></div>
</div>

<style>
  .ad-container {
    min-height: 250px;
    background: #f0f0f0;
    display: flex;
    align-items: center;
    justify-content: center;
  }
  
  .ad-container::before {
    content: 'Hirdetés betöltése...';
    color: #999;
  }
</style>
/* 3. Font loading optimalizálás - FOUT/FOIT elkerülése */
@font-face {
  font-family: 'CustomFont';
  src: url('/fonts/custom.woff2') format('woff2');
  font-display: swap; /* Fallback font azonnal, custom font swap */
  font-weight: 400;
  font-style: normal;
}

/* Vagy font-display: optional a CLS 0 értékért */
@font-face {
  font-family: 'OptionalFont';
  src: url('/fonts/optional.woff2') format('woff2');
  font-display: optional; /* Ha nem tölt be 100ms-en belül, fallback marad */
}
<!-- 4. Preload kritikus fontokra -->
<link 
  rel="preload" 
  href="/fonts/custom.woff2" 
  as="font" 
  type="font/woff2" 
  crossorigin
>
/* 5. Animációk transform/opacity használatával (nem layout tulajdonságok) */
/* Rossz példa: CLS okozó animáció */
.bad-animation {
  animation: slideIn 0.3s;
}

@keyframes slideIn {
  from {
    margin-top: -100px; /* Layout shift! */
  }
  to {
    margin-top: 0;
  }
}

/* Jó példa: transform használata */
.good-animation {
  animation: slideInGood 0.3s;
}

@keyframes slideInGood {
  from {
    transform: translateY(-100px); /* Nincs layout shift */
  }
  to {
    transform: translateY(0);
  }
}
// 6. Dinamikus tartalom betöltése helyőrzővel
// Rossz példa: tartalom hirtelen megjelenik
fetch('/api/content')
  .then(res => res.json())
  .then(data => {
    document.getElementById('container').innerHTML = data.html;
  });

// Jó példa: placeholder, smooth transition
const container = document.getElementById('container');
container.innerHTML = '<div class="skeleton-loader"></div>'; // Placeholder

fetch('/api/content')
  .then(res => res.json())
  .then(data => {
    // Méret már ismert a placeholder miatt
    container.style.minHeight = container.offsetHeight + 'px';
    container.innerHTML = data.html;
  });

Core Web Vitals mérése és monitoring

1. Google PageSpeed Insights

A legegyszerűbb módszer a Core Web Vitals mérésére:

# Parancssori használat (ha API key-ed van)
curl "https://www.googleapis.com/pagespeedonline/v5/runPagespeed?url=https://example.com&key=YOUR_API_KEY"

Fontos megérteni:

  • Lab Data: Szimulált, laboratóriumi körülmények (Lighthouse)
  • Field Data: Valós felhasználói adatok (Chrome User Experience Report - CrUX)

A Field Data fontosabb, mert azt méri, amit a felhasználók ténylegesen tapasztalnak.

2. Chrome DevTools Performance Panel

// Performance mérés JavaScript-ben
performance.mark('start-task');

// ... valamilyen művelet ...

performance.mark('end-task');
performance.measure('task-duration', 'start-task', 'end-task');

const measures = performance.getEntriesByType('measure');
console.log(measures[0].duration); // milliszekundum

3. Web Vitals JavaScript Library

<!-- NPM: npm install web-vitals -->
<script type="module">
  import {onCLS, onFID, onLCP} from 'https://unpkg.com/web-vitals@3?module';

  function sendToAnalytics({name, value, id}) {
    // Küldés analytics rendszerbe
    gtag('event', name, {
      value: Math.round(name === 'CLS' ? value * 1000 : value),
      metric_id: id,
      metric_value: value,
      metric_delta: value,
    });
  }

  onCLS(sendToAnalytics);
  onFID(sendToAnalytics);
  onLCP(sendToAnalytics);
</script>

4. PerformanceObserver API

// LCP mérése PerformanceObserver-rel
const observer = new PerformanceObserver((list) => {
  const entries = list.getEntries();
  const lastEntry = entries[entries.length - 1];
  
  console.log('LCP:', lastEntry.renderTime || lastEntry.loadTime);
  console.log('LCP element:', lastEntry.element);
});

observer.observe({type: 'largest-contentful-paint', buffered: true});

// CLS mérése
let clsValue = 0;
const clsObserver = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (!entry.hadRecentInput) {
      clsValue += entry.value;
    }
  }
  console.log('Current CLS:', clsValue);
});

clsObserver.observe({type: 'layout-shift', buffered: true});

5. Google Search Console

A Search Console “Core Web Vitals” jelentése mutatja a Field Data-t URL csoportok szerint:

  • Jó URL-ek (zöld)
  • Javítandó URL-ek (sárga)
  • Rossz URL-ek (piros)

Hozzáférés: Search Console → Élmény → Core Web Vitals

Gyakori Core Web Vitals problémák és megoldások

LCP javítása

Probléma 1: Lassú szerver válaszidő (TTFB)

# Nginx cache konfiguráció
http {
    # FastCGI cache PHP-hoz
    fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=PHPCACHE:100m inactive=60m;
    fastcgi_cache_key "$scheme$request_method$host$request_uri";
    
    server {
        location ~ \.php$ {
            fastcgi_cache PHPCACHE;
            fastcgi_cache_valid 200 60m;
            add_header X-Cache-Status $upstream_cache_status;
        }
    }
}

Probléma 2: Render-blocking resources

<!-- Kritikus CSS inline -->
<style>
  /* Above-the-fold critical CSS */
  body { margin: 0; font-family: sans-serif; }
  .header { display: flex; padding: 1rem; }
</style>

<!-- Nem-kritikus CSS async betöltése -->
<link rel="preload" href="/styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="/styles.css"></noscript>

Probléma 3: Optimalizálatlan képek

<!-- Modern image formátumok és responsive -->
<picture>
  <source 
    srcset="/image-800.webp 800w, /image-1200.webp 1200w" 
    type="image/webp"
    sizes="(max-width: 600px) 100vw, 800px"
  >
  <img 
    src="/image-800.jpg" 
    alt="Responsive kép"
    width="800"
    height="600"
    loading="eager"
    decoding="async"
  >
</picture>

FID/INP javítása

Probléma: Long JavaScript tasks

// Code splitting - csak a szükséges kód betöltése
// Webpack/Vite automatikus code splitting
const HeavyComponent = () => import('./HeavyComponent.js');

// Lazy loading komponensek (React példa)
const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <Suspense fallback={<div>Betöltés...</div>}>
      <LazyComponent />
    </Suspense>
  );
}

CLS javítása

Probléma: Banner/announcement bar dinamikus betöltése

/* Rossz: nincs hely foglalva */
.announcement {
  background: #ff0;
  padding: 1rem;
}

/* Jó: előre lefoglalt hely */
body {
  padding-top: 50px; /* Announcement bar magassága */
}

.announcement {
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 50px;
  background: #ff0;
  z-index: 1000;
}

Core Web Vitals optimalizálási checklist

Core Web Vitals optimalizálási checklist: LCP, FID/INP és CLS teendők vizuális összefoglalója

LCP Checklist

  • Szerver válaszidő < 600ms (TTFB)
  • CDN használata statikus tartalmakhoz
  • Képek WebP/AVIF formátumban
  • Kritikus erőforrások preload-ja
  • Render-blocking JS/CSS eltávolítása vagy defer
  • Lazy loading nem-kritikus tartalmakra
  • Browser cache megfelelő beállítása

FID/INP Checklist

  • JavaScript bundle < 100KB (gzipped)
  • Third-party scriptek async/defer
  • Code splitting használata
  • Long tasks felosztása
  • Passzív event listenerek használata
  • Service Worker cache stratégia

CLS Checklist

  • Képek width/height attribútuma
  • Font-display: swap vagy optional
  • Ad slots előre lefoglalt helye
  • Skeleton loaderek dinamikus tartalomhoz
  • Transform használata margin/top helyett
  • Sticky elemek megfelelő pozicionálása

Összegzés

A Core Web Vitals nem csak ranking faktorok, hanem a felhasználói élmény alapvető mutatói. A három metrika (LCP, FID/INP, CLS) optimalizálása:

  1. Javítja a keresési helyezést - A Google figyelembe veszi őket
  2. Csökkenti a bounce rate-et - Gyorsabb oldal = elégedettebb felhasználók
  3. Növeli a konverziót - Jobb élmény = több vásárlás/regisztráció
  4. Növeli a mobil teljesítményt - Különösen kritikus mobilon

Kezdd a mérésekkel (PageSpeed Insights, Search Console), azonosítsd a problémákat, és kövesd a fenti optimalizálási technikákat. A legtöbb weboldal 75%-os javulást érhet el ezekkel a módszerekkel.

Következő lépések:

  • Mérd meg a jelenlegi értékeket
  • Azonosítsd a legnagyobb problémákat
  • Implementáld a javításokat prioritás szerint (LCP → FID → CLS)
  • Monitor-ozd az eredményeket
  • Folyamatosan optimalizálj

A Core Web Vitals optimalizálás nem egyszeri feladat, hanem folyamatos munka. De az eredmények megérik: gyorsabb oldal, jobb felhasználói élmény, és magasabb keresési helyezések.

Kapcsolódó Videók

Google Hivatalos - Core Web Vitals Bemutatás

Forrás: Google Search Central | Hossz: ~5 perc | Nyelv: Angol (magyar felirat elérhető)

Web.dev - Core Web Vitals Deep Dive

Forrás: Google Chrome Developers | Nyelv: Angol

Gyakran Ismételt Kérdések – Core Web Vitals

Mi az a Core Web Vitals?

A Core Web Vitals a Google három legfontosabb felhasználói élmény metrikája: LCP (Largest Contentful Paint) a betöltési sebességet, FID (First Input Delay) az interaktivitást, és CLS (Cumulative Layout Shift) a vizuális stabilitást méri. Ezek a metrikák 2021 óta a Google ranking faktorai.

Milyen értékek számítanak jónak a Core Web Vitals-ban?

Jó értékek: LCP < 2.5 másodperc, FID < 100 milliszekundum, CLS < 0.1. A Google azt ajánlja, hogy az oldalak legalább 75%-a érje el ezeket az értékeket mobilon és desktopon is.

Hogyan mérhetem a Core Web Vitals értékeket?

Használd a Google PageSpeed Insights-ot, Chrome DevTools-t, Lighthouse-t vagy a Search Console Core Web Vitals jelentését. A valós felhasználói adatokhoz (Field Data) használd a Chrome User Experience Report-ot (CrUX).

Hogyan javíthatom az LCP értéket?

Optimalizáld a képeket (WebP formátum, lazy loading), használj CDN-t, csökkentsd a szerver válaszidőt, töltsd be előre a kritikus erőforrásokat (preload, preconnect), és távolítsd el a render-blocking JavaScript-et és CSS-t.

Mi okozza a magas CLS értéket?

Főbb okok: képek és videók méret nélkül, dinamikusan betöltött tartalom (hirdetések, beágyazások), webfontok villogása (FOIT/FOUT), és DOM módosítások animációk nélkül. Mindig add meg a width és height attribútumokat!

A Core Web Vitals mennyire fontos a SEO-ban?

A Core Web Vitals hivatalos ranking faktor, de a tartalom minősége továbbra is fontosabb. Két hasonló minőségű oldal esetén a jobb Core Web Vitals értékek előnyt jelenthetnek. A gyorsabb oldalak jobb felhasználói élményt adnak, ami csökkenti a bounce rate-et.

Frissítve: