Start · Sprachen · JavaScript · Referenz · PerformanceElementTiming.naturalWidth

PerformanceElementTiming.naturalWidth

Eigenschaft

Schreibgeschützte Eigenschaft, die die intrinsische (natürliche) Breite eines per Element Timing beobachteten Bildes in Pixeln liefert; bei Textknoten ist sie <code>0</code>.

seit JavaScript Chromium-Browser (Chrome/Edge 77+); nicht in Firef Kategorie: webapi

Signatur

PerformanceElementTiming.naturalWidth

Beschreibung

Die Eigenschaft naturalWidth eines PerformanceElementTiming-Eintrags gibt die intrinsische Breite der gemessenen Bildressource als vorzeichenlose Ganzzahl in Pixeln zurück. Das ist die tatsächliche Breite der Bilddatei. Sie hängt nicht von CSS, den Attributen width/height oder dem Darstellungsmaßstab ab.

Element-Timing-Einträge entstehen für Elemente mit dem Attribut elementtiming, zum Beispiel <img>, <image> in SVG, Elemente mit CSS-Hintergrundbild oder Textknoten. Bei Bildern enthält naturalWidth die Breite der Bilddatei, bei Text-Einträgen (name === "text-paint") ist der Wert immer 0.

Praktisch ist die Eigenschaft für das Performance-Monitoring: Vergleicht man naturalWidth mit der tatsächlich dargestellten Breite aus intersectionRect oder getBoundingClientRect(), findet man zu große Bilder. Solche Bilder verlängern die Ladezeit (loadTime/renderTime), ohne dass man sie schärfer sieht.

Rückgabewert

Typ
number
Beschreibung
Vorzeichenlose 32-Bit-Ganzzahl: die intrinsische Breite des Bildes in Pixeln. Bei Text-Einträgen ist der Wert 0.

Beispiele

Intrinsische Bildbreite beobachten

// HTML: <img src="hero.jpg" elementtiming="hero-bild" alt="">
const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    console.log(`${entry.identifier}: ${entry.naturalWidth} × ${entry.naturalHeight} px`);
  }
});

observer.observe({ type: 'element', buffered: true });
hero-bild: 1920 × 1080 px

Zu große Bilder erkennen

const observer = new PerformanceObserver((list) => {
  for (const entry of list.getEntries()) {
    if (entry.naturalWidth === 0) continue; // Text-Eintrag überspringen

    const dargestellt = entry.element?.getBoundingClientRect().width ?? entry.intersectionRect.width;
    const faktor = entry.naturalWidth / (dargestellt * devicePixelRatio);

    if (faktor > 1.5) {
      console.warn(
        `"${entry.identifier}" ist ${faktor.toFixed(1)}× zu groß ` +
        `(${entry.naturalWidth}px geladen, ${Math.round(dargestellt)}px angezeigt)`
      );
    }
  }
});

observer.observe({ type: 'element', buffered: true });
"produkt-foto" ist 3.2× zu groß (2400px geladen, 375px angezeigt)

Text- und Bild-Einträge unterscheiden

// HTML: <h1 elementtiming="titel">Willkommen</h1>
const observer = new PerformanceObserver((list) => {
  list.getEntries().forEach((entry) => {
    const art = entry.name === 'text-paint' ? 'Text' : 'Bild';
    console.log(art, entry.identifier, 'naturalWidth =', entry.naturalWidth);
  });
});

observer.observe({ type: 'element', buffered: true });
Text titel naturalWidth = 0 Bild hero-bild naturalWidth = 1920

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die Element Timing API gibt es nur in Chromium-basierten Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen sie nicht. Vorher prüfen: PerformanceObserver.supportedEntryTypes.includes('element').
  • Einträge entstehen nur für Elemente mit dem Attribut elementtiming. Ohne dieses Attribut liefert der Observer nichts.
  • Bei Text-Einträgen ist naturalWidth immer 0. Deshalb nach entry.name filtern ("image-paint" oder "text-paint"), bevor man rechnet oder durch den Wert teilt.
  • Der Wert beschreibt die Bilddatei, nicht die Darstellung. Für den Vergleich mit der angezeigten Größe muss man devicePixelRatio einrechnen, sonst wirken Bilder für hochauflösende Bildschirme fälschlich zu groß.
  • Bei Bildern von fremden Ursprüngen ohne Timing-Allow-Origin-Header ist renderTime 0. naturalWidth wird trotzdem gesetzt.