Start · Sprachen · JavaScript · Referenz · CanvasRenderingContext2D.lineDashOffset

CanvasRenderingContext2D.lineDashOffset

Eigenschaft

Legt fest, um wie viele Einheiten das mit <code>setLineDash()</code> definierte Strichmuster entlang der Linie verschoben wird (Phase des Musters).

seit JavaScript Baseline: alle modernen Browser (seit ca. 2015) Kategorie: webapi

Signatur

CanvasRenderingContext2D.lineDashOffset

Beschreibung

Die Eigenschaft lineDashOffset des 2D-Canvas-Kontexts bestimmt, an welcher Stelle das Strichmuster einer gestrichelten Linie beginnt. Das Muster selbst wird mit setLineDash() festgelegt; lineDashOffset verschiebt es entlang des Pfades. Standardwert ist 0.0.

Ein positiver Wert verschiebt das Muster rückwärts, also in Richtung Pfadanfang: Der Strich scheint „nach hinten“ zu wandern. Ein negativer Wert verschiebt es in Zeichenrichtung nach vorn. Der Versatz wird in Einheiten des Koordinatensystems angegeben und ist damit von der aktuellen Transformation (z. B. scale()) abhängig.

Typischer Einsatzzweck ist der sogenannte „Marching Ants“-Effekt – ein animierter, laufender Auswahlrahmen, wie man ihn aus Bildbearbeitungsprogrammen kennt. Außerdem lässt sich damit ein Strichmuster exakt an Ecken oder Startpunkten ausrichten, oder ein „Zeichnen“-Effekt für Linien animieren.

Die Eigenschaft wirkt nur auf Konturen, also auf stroke(), strokeRect() und strokeText() – nicht auf Füllungen. Sie gehört zum Zeichenzustand und wird von save()/restore() gesichert bzw. wiederhergestellt.

Parameter

Name Typ Default Beschreibung
$value number 0 Versatz des Strichmusters in Koordinateneinheiten (Gleitkommazahl). Infinity, -Infinity und NaN werden ignoriert.

Rückgabewert

Typ
number
Beschreibung
Der aktuelle Versatz des Strichmusters als Gleitkommazahl; standardmäßig 0.

Beispiele

Strichmuster mit und ohne Versatz vergleichen

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');

ctx.setLineDash([20, 10]);
ctx.lineWidth = 4;

// Ohne Versatz
ctx.beginPath();
ctx.moveTo(10, 30);
ctx.lineTo(300, 30);
ctx.stroke();

// Mit Versatz: Muster beginnt 10 Einheiten später im Zyklus
ctx.lineDashOffset = 10;
ctx.strokeStyle = 'crimson';
ctx.beginPath();
ctx.moveTo(10, 60);
ctx.lineTo(300, 60);
ctx.stroke();

console.log(ctx.lineDashOffset);
10

„Marching Ants“ – animierter Auswahlrahmen

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
let offset = 0;

const draw = () => {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.setLineDash([6, 4]);
  ctx.lineDashOffset = -offset; // negativ = Muster läuft vorwärts
  ctx.strokeRect(20, 20, 200, 120);
};

const tick = () => {
  offset = (offset + 0.5) % 10; // 10 = Summe des Musters (6 + 4)
  draw();
  requestAnimationFrame(tick);
};

requestAnimationFrame(tick);

Linie „zeichnen“ lassen (Draw-on-Effekt)

const canvas = document.querySelector('canvas');
const ctx = canvas.getContext('2d');
const length = 400; // Länge der Linie
let progress = 0;

const animate = () => {
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  // Ein Strich und eine Lücke, jeweils so lang wie die Linie
  ctx.setLineDash([length, length]);
  ctx.lineDashOffset = length - progress;
  ctx.lineWidth = 3;
  ctx.beginPath();
  ctx.moveTo(20, 100);
  ctx.lineTo(20 + length, 100);
  ctx.stroke();

  if (progress < length) {
    progress += 4;
    requestAnimationFrame(animate);
  }
};

animate();

// Wichtig · Fallstricke

  • Ohne Strichmuster keine Wirkung: Solange setLineDash() nicht mit einem nicht-leeren Array aufgerufen wurde, hat lineDashOffset keinen sichtbaren Effekt.
  • Richtung beachten: Positive Werte verschieben das Muster zum Pfadanfang hin, negative in Zeichenrichtung – bei Animationen wirkt das oft „falsch herum“.
  • Ungültige Werte: NaN und ±Infinity werden stillschweigend ignoriert, es wird kein Fehler geworfen.
  • Wertüberlauf bei Animationen: Den Versatz per Modulo auf die Musterlänge (Summe der Array-Einträge von setLineDash()) begrenzen, damit die Zahl nicht unbegrenzt wächst und Genauigkeit verliert.
  • Transformationen: Der Versatz wird in lokalen Koordinaten interpretiert; nach scale() verändert sich die sichtbare Verschiebung entsprechend.
  • Kompatibilität: In allen modernen Browsern sowie in OffscreenCanvasRenderingContext2D verfügbar. Internet Explorer unterstützt es erst ab Version 11.