Start · Sprachen · JavaScript · Referenz · SVGSVGElement.currentTranslate

SVGSVGElement.currentTranslate

Eigenschaft

Liefert einen Punkt mit der aktuellen Verschiebung (Pan) des äußersten <code>&lt;svg&gt;</code>-Elements, die der Nutzer oder ein Skript zusätzlich zu <code>viewBox</code> angewendet hat.

seit JavaScript SVG 1.1 / SVG 2 – Baseline: alle modernen Browser Kategorie: webapi

Signatur

SVGSVGElement.currentTranslate

Beschreibung

Die Eigenschaft currentTranslate von SVGSVGElement gibt einen Punkt (x, y) zurück, der die aktuelle Verschiebung des Inhalts beschreibt. Zusammen mit currentScale bildet sie die „Benutzer-Transformation“, die ein SVG-Viewer beim Zoomen und Verschieben (Pan) anwendet. Sie wirkt zusätzlich zu viewBox und preserveAspectRatio und wird vor allen anderen Transformationen auf den Inhalt angewendet.

Die Eigenschaft selbst ist schreibgeschützt: Du kannst ihr kein neues Objekt zuweisen. Das zurückgegebene Punkt-Objekt ist jedoch „live“ – in allen gängigen Browsern kannst du seine Eigenschaften x und y direkt setzen und verschiebst damit die Darstellung sofort. Beim wiederholten Lesen erhältst du immer dasselbe Objekt ([SameObject]).

Sinnvoll ist currentTranslate vor allem für einfache Pan-/Zoom-Funktionen in eigenständigen SVG-Dokumenten oder großen Inline-Grafiken (Karten, Diagramme), wenn man den viewBox nicht manipulieren möchte. Wichtig: Die Eigenschaft hat nur für das äußerste <svg>-Element Wirkung; bei verschachtelten <svg>-Elementen bleibt sie ohne Effekt.

Rückgabewert

Typ
DOMPointReadOnly (in Browsern praktisch SVGPoint bzw. DOMPoint)
Beschreibung
Ein Punkt-Objekt mit den Eigenschaften x und y (Standard: 0, 0), das die aktuelle Verschiebung in Bildschirm-Einheiten (CSS-Pixel) angibt. Änderungen an x/y verschieben die Darstellung des äußersten <svg>-Elements.

Beispiele

Aktuelle Verschiebung auslesen

const svg = document.querySelector('svg');
const { x, y } = svg.currentTranslate;
console.log(`Verschiebung: ${x}, ${y}`);
console.log(svg.currentTranslate === svg.currentTranslate);
Verschiebung: 0, 0 true

Grafik per Skript verschieben

const svg = document.querySelector('svg');

// Das Objekt selbst ist nicht ersetzbar, aber x/y sind änderbar
svg.currentTranslate.x = 50;
svg.currentTranslate.y = -20;

console.log(svg.currentTranslate.x, svg.currentTranslate.y);
50 -20

Pan mit der Maus (Drag) umsetzen

const svg = document.querySelector('svg');
let start = null;

svg.addEventListener('pointerdown', (e) => {
  start = {
    x: e.clientX - svg.currentTranslate.x,
    y: e.clientY - svg.currentTranslate.y,
  };
  svg.setPointerCapture(e.pointerId);
});

svg.addEventListener('pointermove', (e) => {
  if (!start) return;
  svg.currentTranslate.x = e.clientX - start.x;
  svg.currentTranslate.y = e.clientY - start.y;
});

svg.addEventListener('pointerup', () => { start = null; });

Zoom um den Mauszeiger mit currentScale kombinieren

const svg = document.querySelector('svg');

svg.addEventListener('wheel', (e) => {
  e.preventDefault();
  const oldScale = svg.currentScale;
  const newScale = Math.min(10, Math.max(0.2, oldScale * (e.deltaY < 0 ? 1.1 : 0.9)));
  const rect = svg.getBoundingClientRect();
  const mx = e.clientX - rect.left;
  const my = e.clientY - rect.top;
  const t = svg.currentTranslate;

  // Punkt unter dem Mauszeiger soll an Ort und Stelle bleiben
  t.x = mx - (mx - t.x) * (newScale / oldScale);
  t.y = my - (my - t.y) * (newScale / oldScale);
  svg.currentScale = newScale;
}, { passive: false });

// Wichtig · Fallstricke

  • Nur äußerstes <svg>: Bei verschachtelten <svg>-Elementen hat eine Änderung keine sichtbare Wirkung.
  • Keine Zuweisung: svg.currentTranslate = {x: 10, y: 10} wird ignoriert (im Strict Mode ggf. TypeError). Ändere stattdessen x und y des zurückgegebenen Objekts.
  • Einheiten: Die Werte sind in Bildschirm-/CSS-Pixeln, nicht in viewBox-Benutzereinheiten. Für Koordinatenumrechnungen besser getScreenCTM() nutzen, die die Benutzer-Transformation bereits berücksichtigt.
  • Typ je Browser: Ältere Engines liefern ein SVGPoint, neuere ein DOMPoint (SVG 2 macht SVGPoint zum Alias). Der Zugriff auf x/y funktioniert überall gleich.
  • Für Inline-SVG in HTML ist die Manipulation von viewBox oder eines transform auf einer Wurzel-<g> oft robuster und besser vorhersagbar als currentTranslate/currentScale.