Signatur
Beschreibung
Die Eigenschaft patternUnits spiegelt das gleichnamige Attribut eines <pattern>-Elements wider. Das Attribut legt fest, in welchem Koordinatensystem die Attribute x, y, width und height der Musterkachel gelesen werden. Es bestimmt also, wo die Kachel liegt und wie groß sie ist.
Zurückgegeben wird ein SVGAnimatedEnumeration-Objekt. Dessen baseVal enthält den im Markup gesetzten Wert, animVal den aktuell animierten Wert. Beide sind Zahlen, die den Konstanten aus SVGUnitTypes entsprechen:
SVG_UNIT_TYPE_UNKNOWN(0): unbekannter oder ungültiger WertSVG_UNIT_TYPE_USERSPACEONUSE(1):userSpaceOnUse, das heißt Werte in Benutzereinheiten des Elements, das auf das Muster verweistSVG_UNIT_TYPE_OBJECTBOUNDINGBOX(2):objectBoundingBox, das heißt Werte als Bruchteile bzw. Prozente der Bounding-Box des gefüllten Elements (Standardwert)
Die Eigenschaft selbst ist schreibgeschützt: Du kannst ihr kein neues Objekt zuweisen. Über patternUnits.baseVal lässt sich der Wert aber ändern, und das Attribut wird dabei automatisch aktualisiert. Das ist praktisch, wenn Muster dynamisch zwischen relativer Kachelgröße (skaliert mit der Form) und absoluter Kachelgröße (feste Pixelgröße) umgeschaltet werden sollen.
Rückgabewert
baseVal (änderbar, Zahl 0–2) und animVal (schreibgeschützt). Die Werte entsprechen den Konstanten von SVGUnitTypes. Fehlt das Attribut, ist der Wert 2 (objectBoundingBox).Beispiele
Wert eines vorhandenen Musters auslesen
// HTML: <svg><defs><pattern id="punkte" patternUnits="userSpaceOnUse" width="20" height="20"><circle cx="10" cy="10" r="4"/></pattern></defs></svg>
const pattern = document.getElementById('punkte');
console.log(pattern.patternUnits.baseVal);
console.log(pattern.patternUnits.baseVal === SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE);
Standardwert bei fehlendem Attribut
const SVG_NS = 'http://www.w3.org/2000/svg';
const pattern = document.createElementNS(SVG_NS, 'pattern');
// Kein Attribut gesetzt, daher gilt objectBoundingBox
console.log(pattern.getAttribute('patternUnits'));
console.log(pattern.patternUnits.baseVal);
Zwischen relativer und absoluter Kachelgröße umschalten
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(SVG_NS, 'svg');
svg.innerHTML = `
<defs>
<pattern id="raster" width="0.25" height="0.25">
<rect width="10" height="10" fill="tomato"/>
</pattern>
</defs>
<rect width="200" height="100" fill="url(#raster)"/>`;
document.body.append(svg);
const pattern = svg.querySelector('#raster');
const setzeAbsolut = (px) => {
pattern.patternUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE;
pattern.setAttribute('width', px);
pattern.setAttribute('height', px);
};
setzeAbsolut(20);
console.log(pattern.getAttribute('patternUnits'));
Zahlenwert in lesbaren Namen umwandeln
const einheitName = (wert) => ({
[SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE]: 'userSpaceOnUse',
[SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX]: 'objectBoundingBox'
}[wert] ?? 'unbekannt');
document.querySelectorAll('pattern').forEach((p) => {
console.log(`${p.id}: ${einheitName(p.patternUnits.animVal)}`);
});
// Wichtig · Fallstricke
- Nicht mit
patternContentUnitsverwechseln:patternUnitsgilt nur fürx,y,widthundheightder Kachel. Für den Inhalt des Musters istpatternContentUnitszuständig, und dessen Standardwert istuserSpaceOnUse, also genau umgekehrt. - Beim Standardwert
objectBoundingBoxbedeutetwidth=\"20\"„20-fache Bounding-Box“ und nicht 20 Pixel. Genau das führt häufig zu Mustern, die scheinbar nicht angezeigt werden. - Die Eigenschaft ist schreibgeschützt: Eine Zuweisung wie
pattern.patternUnits = 1wird ignoriert bzw. wirft im Strict Mode einenTypeError. Ändere stattdessenbaseValoder nutzesetAttribute('patternUnits', …). - Wird
baseValauf0(SVG_UNIT_TYPE_UNKNOWN) oder einen ungültigen Wert gesetzt, werfen aktuelle Browser einenTypeError. - Über
xlink:href/hrefreferenzierte Muster erbenpatternUnits. Die DOM-Eigenschaft zeigt aber nur das Attribut des eigenen Elements an und nicht den geerbten Wert. - Kompatibilität: Die Eigenschaft wird in allen modernen Browsern seit Langem unterstützt.