Start · Sprachen · JavaScript · Referenz · PaintSize.height

PaintSize.height

Eigenschaft

Die schreibgeschützte Eigenschaft <code>height</code> von <code>PaintSize</code> liefert die Höhe der Zeichenfläche (in CSS-Pixeln), die ein Paint-Worklet füllen soll.

seit JavaScript CSS Painting API Level 1 (Houdini) – nur Chromium- Kategorie: webapi

Signatur

PaintSize.height

Beschreibung

PaintSize.height gehört zur CSS Painting API (CSS Houdini). Ein PaintSize-Objekt wird als zweites Argument an die Methode paint(ctx, size, properties) einer mit registerPaint() registrierten Klasse übergeben. Über size.height erfährt das Worklet, wie hoch die Fläche ist, auf die es zeichnen soll – also die Höhe des Elementbereichs, für den die CSS-Funktion paint() verwendet wird (z. B. als background-image oder border-image).

Der Wert wird in CSS-Pixeln angegeben, nicht in Gerätepixeln. Der übergebene PaintRenderingContext2D ist bereits passend zur Pixeldichte skaliert, sodass man direkt mit size.width und size.height rechnen kann, ohne devicePixelRatio berücksichtigen zu müssen.

Typische Anwendungen sind responsive, generierte Hintergründe: Streifen, Verläufe, Rahmen, Sprechblasen oder Platzhalter-Muster, die sich automatisch an die Elementgröße anpassen. Ändert sich die Größe des Elements, ruft der Browser paint() erneut mit einem aktualisierten PaintSize-Objekt auf.

Rückgabewert

Typ
number
Beschreibung
Die Höhe der Zeichenfläche in CSS-Pixeln (schreibgeschützt, kann Nachkommastellen enthalten).

Beispiele

Worklet: horizontale Streifen passend zur Elementhöhe

// stripes-worklet.js – läuft im PaintWorkletGlobalScope
class StripesPainter {
  paint(ctx, size) {
    const stripeCount = 8;
    // Streifenhöhe dynamisch aus size.height berechnen
    const stripeHeight = size.height / stripeCount;

    for (let i = 0; i < stripeCount; i++) {
      ctx.fillStyle = i % 2 === 0 ? '#1e88e5' : '#bbdefb';
      ctx.fillRect(0, i * stripeHeight, size.width, stripeHeight);
    }
  }
}

registerPaint('stripes', StripesPainter);

Worklet laden und per CSS verwenden

// main.js – im Hauptdokument
if ('paintWorklet' in CSS) {
  CSS.paintWorklet.addModule('stripes-worklet.js');
} else {
  console.warn('CSS Painting API wird nicht unterstützt');
}

/* style.css
.box {
  width: 300px;
  height: 200px;
  background-color: #bbdefb; // Fallback
  background-image: paint(stripes);
}
*/

Vertikaler Verlauf und Mittellinie über size.height

// divider-worklet.js
class DividerPainter {
  static get inputProperties() {
    return ['--divider-color'];
  }

  paint(ctx, size, props) {
    const { width, height } = size;
    const color = props.get('--divider-color').toString().trim() || 'tomato';

    // Verlauf über die gesamte Höhe
    const gradient = ctx.createLinearGradient(0, 0, 0, height);
    gradient.addColorStop(0, '#fafafa');
    gradient.addColorStop(1, '#e0e0e0');
    ctx.fillStyle = gradient;
    ctx.fillRect(0, 0, width, height);

    // Linie exakt in der vertikalen Mitte
    ctx.strokeStyle = color;
    ctx.lineWidth = 2;
    ctx.beginPath();
    ctx.moveTo(0, height / 2);
    ctx.lineTo(width, height / 2);
    ctx.stroke();
  }
}

registerPaint('divider', DividerPainter);

// Wichtig · Fallstricke

  • Browser-Kompatibilität: Die CSS Painting API wird nur von Chromium-basierten Browsern (Chrome, Edge, Opera) unterstützt. Firefox und Safari unterstützen sie derzeit nicht – immer einen CSS-Fallback (z. B. background-color) angeben und per 'paintWorklet' in CSS prüfen.
  • PaintSize existiert ausschließlich im PaintWorkletGlobalScope; im Hauptskript lässt sich kein solches Objekt erzeugen oder abfragen.
  • Die Eigenschaft ist schreibgeschützt; Zuweisungen haben keine Wirkung. Die Größe der Zeichenfläche wird allein durch das Layout bestimmt.
  • Der Wert ist in CSS-Pixeln angegeben und kann Nachkommastellen haben – für pixelgenaue Linien ggf. mit Math.round() arbeiten.
  • Worklets erfordern einen sicheren Kontext (HTTPS oder localhost).
  • paint() kann bei jeder Größenänderung häufig aufgerufen werden – aufwendige Berechnungen vermeiden, da der Browser Instanzen jederzeit neu erzeugen darf und kein Zustand zwischen Aufrufen garantiert ist.