Signatur
Beschreibung
SVGRect beschreibt ein Rechteck durch die Koordinaten der oberen linken Ecke (x, y) und seine Ausdehnung (width, height). Seit SVG 2 ist SVGRect keine eigene Schnittstelle mehr, sondern nur noch ein Alias für DOMRect. Objekte, die SVG-APIs zurückgeben, sind in modernen Browsern also echte DOMRect-Instanzen und haben zusätzlich die abgeleiteten, schreibgeschützten Eigenschaften top, right, bottom und left.
Diese Rechtecke begegnen dir vor allem an zwei Stellen: SVGGraphicsElement.prototype.getBBox() liefert den Begrenzungsrahmen (Bounding Box) eines Elements im lokalen Benutzerkoordinatensystem. SVGSVGElement.viewBox.baseVal liefert die viewBox eines <svg>-Elements als Rechteck, das du auch ändern kannst.
Einsatzgebiete sind Layout-Berechnungen in SVG, zum Beispiel Text zentrieren, Hintergrundflächen passend zu einem Element zeichnen, Zoom und Pan über die viewBox oder Kollisionsprüfungen. Ein eigener Konstruktor new SVGRect() existiert nicht. Eigene Rechtecke erzeugst du mit new DOMRect(x, y, width, height) oder mit svgElement.createSVGRect().
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $x | number | 0 | x-Koordinate der oberen linken Ecke (bei new DOMRect() und als Eigenschaft). |
| $y | number | 0 | y-Koordinate der oberen linken Ecke. |
| $width | number | 0 | Breite des Rechtecks. Negative Werte sind bei DOMRect erlaubt, sie bedeuten ein gespiegeltes Rechteck. |
| $height | number | 0 | Höhe des Rechtecks. |
Rückgabewert
x, y, width und height. Die Eigenschaften top, right, bottom und left sind nur lesbar.Beispiele
Bounding Box eines Textes ermitteln und Hintergrund zeichnen
const NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(NS, 'svg');
svg.setAttribute('width', '300');
svg.setAttribute('height', '100');
document.body.append(svg);
const text = document.createElementNS(NS, 'text');
text.setAttribute('x', '20');
text.setAttribute('y', '50');
text.textContent = 'Hallo SVG';
svg.append(text);
// getBBox() liefert ein SVGRect bzw. DOMRect
const box = text.getBBox();
console.log(box instanceof DOMRect, box.width > 0);
// Hintergrund-Rechteck mit 4px Innenabstand
const bg = document.createElementNS(NS, 'rect');
const pad = 4;
bg.setAttribute('x', box.x - pad);
bg.setAttribute('y', box.y - pad);
bg.setAttribute('width', box.width + 2 * pad);
bg.setAttribute('height', box.height + 2 * pad);
bg.setAttribute('fill', '#ffe08a');
svg.insertBefore(bg, text);
viewBox auslesen und zum Zoomen verändern
// <svg id="karte" viewBox="0 0 400 200"> ... </svg>
const svg = document.querySelector('#karte');
const vb = svg.viewBox.baseVal; // SVGRect (live)
console.log(vb.x, vb.y, vb.width, vb.height);
// Um Faktor 2 hineinzoomen und dabei den Mittelpunkt beibehalten
const zoom = (factor) => {
const cx = vb.x + vb.width / 2;
const cy = vb.y + vb.height / 2;
vb.width /= factor;
vb.height /= factor;
vb.x = cx - vb.width / 2;
vb.y = cy - vb.height / 2;
};
zoom(2);
console.log(svg.getAttribute('viewBox'));
Rechtecke erzeugen und auf Überschneidung prüfen
const a = new DOMRect(10, 10, 100, 50);
const b = new DOMRect(80, 40, 60, 60);
const intersects = (r1, r2) =>
r1.left < r2.right && r1.right > r2.left &&
r1.top < r2.bottom && r1.bottom > r2.top;
console.log(a.right, a.bottom);
console.log(intersects(a, b));
// Alternative, ältere SVG-API:
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const r = svg.createSVGRect();
r.width = 20;
console.log(r.width, r.height);
// Wichtig · Fallstricke
- Kein Konstruktor:
new SVGRect()wirft einenTypeError. Verwende dafürnew DOMRect()oderSVGSVGElement.prototype.createSVGRect(). - Lokale Koordinaten:
getBBox()berücksichtigt keinetransform-Attribute und keine Strichbreite (stroke). Für Bildschirmkoordinaten brauchst dugetBoundingClientRect()oder eine Umrechnung mitgetScreenCTM(). - Nur für gerenderte Elemente: Bei Elementen, die nicht im DOM hängen oder mit
display: noneausgeblendet sind, liefertgetBBox()Nullwerte. Firefox wirft in diesem Fall sogar eine Ausnahme. - Live-Objekt:
viewBox.baseValist direkt mit dem Attribut verknüpft. Änderungen anx,y,widthundheightwirken also sofort auf die Darstellung. Hat das Element keinviewBox-Attribut, sind alle Werte 0. - Kompatibilität: Das globale
SVGRectgibt es in allen modernen Browsern als Alias fürDOMRect. In sehr alten Browsern (ältere Safari- und IE-Versionen) war es eine eigene Schnittstelle ohnetop/right/bottom/left. Prüfungen mitinstanceof DOMRectsind dort unzuverlässig.