Start · Sprachen · JavaScript · Referenz · PaintSize.width

PaintSize.width

Eigenschaft

Schreibgeschützte Eigenschaft, die die Breite der Zeichenfläche in CSS-Pixeln zurückgibt, auf der ein Paint Worklet zeichnen soll.

seit JavaScript Chromium 65+ (CSS Painting API, experimentell); ni Kategorie: webapi

Signatur

PaintSize.width

Beschreibung

PaintSize.width gehört zur CSS Painting API (Teil von CSS Houdini). Ein PaintSize-Objekt wird als zweites Argument an die Methode paint(ctx, size, properties, args) eines registrierten Paint Worklets übergeben. Die Eigenschaft width gibt die Breite der Fläche an, die der Browser gerade zeichnen lässt, etwa den Hintergrund oder den Rahmen eines Elements.

Der Wert ist in CSS-Pixeln angegeben und entspricht der Breite des Bereichs, für den die paint()-Funktion aufgerufen wird. Bei background-image: paint(...) ist das normalerweise die Hintergrundfläche des Elements, also die Größe der background positioning area. Die Auflösung für Displays mit hoher Pixeldichte übernimmt der Browser selbst. Deshalb muss man width nicht mit devicePixelRatio multiplizieren.

Man braucht width (meistens zusammen mit height), um Zeichnungen an die Größe des Elements anzupassen, etwa zentrierte Formen, Muster über die ganze Breite oder Verläufe, die sich an Größenänderungen anpassen. Ändert sich die Größe des Elements, ruft der Browser paint() automatisch mit einem neuen PaintSize-Objekt auf.

Rückgabewert

Typ
number
Beschreibung
Die Breite der Zeichenfläche in CSS-Pixeln (Gleitkommazahl, schreibgeschützt).

Beispiele

Kreis in der Mitte des Elements zeichnen

// circle-worklet.js – läuft im PaintWorkletGlobalScope
registerPaint('centered-circle', class {
  paint(ctx, size) {
    const radius = Math.min(size.width, size.height) / 2;
    ctx.fillStyle = 'rebeccapurple';
    ctx.beginPath();
    ctx.arc(size.width / 2, size.height / 2, radius, 0, 2 * Math.PI);
    ctx.fill();
  }
});

// main.js – im Hauptdokument
if ('paintWorklet' in CSS) {
  CSS.paintWorklet.addModule('circle-worklet.js');
}

/* CSS:
.box { width: 300px; height: 150px; background-image: paint(centered-circle); }
*/

Streifenmuster über die volle Breite

// stripes-worklet.js
registerPaint('stripes', class {
  static get inputProperties() { return ['--stripe-width']; }

  paint(ctx, size, props) {
    const stripe = parseFloat(props.get('--stripe-width').toString()) || 20;
    // Anzahl der Streifen hängt von der aktuellen Breite ab
    const count = Math.ceil(size.width / stripe);
    for (let i = 0; i < count; i++) {
      ctx.fillStyle = i % 2 === 0 ? '#0af' : '#fff';
      ctx.fillRect(i * stripe, 0, stripe, size.height);
    }
  }
});

/* CSS:
.banner { --stripe-width: 25px; background-image: paint(stripes); }
*/

Fortschrittsbalken relativ zur Breite

// progress-worklet.js
registerPaint('progress', class {
  static get inputProperties() { return ['--progress']; }

  paint(ctx, size, props) {
    const value = Math.max(0, Math.min(1, parseFloat(props.get('--progress').toString()) || 0));
    ctx.fillStyle = '#ddd';
    ctx.fillRect(0, 0, size.width, size.height);
    ctx.fillStyle = '#2a2';
    ctx.fillRect(0, 0, size.width * value, size.height);
  }
});

// main.js: Wert ändern löst ein Neuzeichnen aus
document.querySelector('.bar').style.setProperty('--progress', '0.65');

// Wichtig · Fallstricke

  • Browser-Unterstützung: Die CSS Painting API gibt es nur in Chromium-basierten Browsern (Chrome, Edge, Opera). Firefox und Safari unterstützen sie nicht. Vor dem Einsatz mit 'paintWorklet' in CSS prüfen, ob die API vorhanden ist, und in CSS einen Fallback angeben, z. B. eine zusätzliche background-Deklaration davor.
  • Nur im Worklet verfügbar: PaintSize gibt es nur innerhalb von paint() im PaintWorkletGlobalScope. Im Hauptthread lässt sich kein solches Objekt erzeugen oder abrufen.
  • Einheit: Der Wert ist in CSS-Pixeln angegeben, nicht in Gerätepixeln. Den Kontext nicht selbst mit devicePixelRatio skalieren, das macht der Browser.
  • Kein Zustand: Der Browser kann paint() jederzeit und beliebig oft aufrufen, auch mit verschiedenen Instanzen. Deshalb size.width bei jedem Aufruf neu verwenden und nicht zwischenspeichern.
  • Die Eigenschaft ist schreibgeschützt. Zuweisungen haben keine Wirkung.
  • Nur HTTPS (sicherer Kontext): CSS.paintWorklet.addModule() funktioniert nur über HTTPS oder auf localhost.