Signatur
Beschreibung
Die Eigenschaft markerUnits der Schnittstelle SVGMarkerElement gibt den Inhalt des SVG-Attributs markerUnits als SVGAnimatedEnumeration zurück. Das Attribut legt fest, auf welches Koordinatensystem sich markerWidth, markerHeight und der Inhalt des Markers beziehen.
Es gibt zwei gültige Werte, die als numerische Konstanten auf SVGMarkerElement bereitstehen:
SVG_MARKERUNITS_UNKNOWN(0): Wert ist keiner der vordefinierten Typen.SVG_MARKERUNITS_USERSPACEONUSE(1): entsprichtmarkerUnits="userSpaceOnUse". Der Marker nutzt das Benutzerkoordinatensystem des Elements, das ihn referenziert. Seine Größe hängt nicht von der Strichstärke ab.SVG_MARKERUNITS_STROKEWIDTH(2): entsprichtmarkerUnits="strokeWidth"(Standard). Der Marker wird mit derstroke-widthdes referenzierenden Pfads skaliert.
Die Eigenschaft selbst ist schreibgeschützt, der Wert lässt sich aber über markerUnits.baseVal ändern. markerUnits.animVal liefert den aktuellen, ggf. durch SMIL-Animation veränderten Wert. Nützlich ist die Eigenschaft, wenn man z. B. Pfeilspitzen unabhängig von der Linienstärke konstant groß halten oder Marker-Konfigurationen per Skript auslesen möchte.
Rückgabewert
baseVal (beschreibbarer Grundwert, number) und animVal (schreibgeschützter, animierter Wert, number). Die Zahlen entsprechen den Konstanten SVG_MARKERUNITS_*.Beispiele
Marker-Einheit auslesen
// <svg><defs><marker id="pfeil" markerUnits="userSpaceOnUse" ...></marker></defs></svg>
const marker = document.getElementById('pfeil');
const { baseVal } = marker.markerUnits;
const namen = {
[SVGMarkerElement.SVG_MARKERUNITS_UNKNOWN]: 'unknown',
[SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE]: 'userSpaceOnUse',
[SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH]: 'strokeWidth'
};
console.log(baseVal, namen[baseVal]);
Standardwert ohne gesetztes Attribut
const svgNS = 'http://www.w3.org/2000/svg';
const marker = document.createElementNS(svgNS, 'marker');
// Kein markerUnits-Attribut gesetzt → Standard strokeWidth
console.log(marker.markerUnits.baseVal === SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH);
Pfeilspitzen unabhängig von der Linienstärke machen
// Alle Marker im Dokument auf userSpaceOnUse umstellen,
// damit dicke Linien keine riesigen Pfeilspitzen bekommen
const marker = document.querySelectorAll('marker');
for (const m of marker) {
if (m.markerUnits.baseVal !== SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE) {
m.markerUnits.baseVal = SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE;
}
}
console.log(document.querySelector('marker')?.getAttribute('markerUnits'));
// Wichtig · Fallstricke
- Schreibgeschützt ist nur die Eigenschaft selbst:
marker.markerUnits = 1hat keine Wirkung (im Strict Mode wird einTypeErrorgeworfen). Ändern Sie stattdessenmarker.markerUnits.baseVal. Das aktualisiert auch das Attribut im DOM. - Wenn Sie
baseValauf0(SVG_MARKERUNITS_UNKNOWN) oder einen ungültigen Wert setzen, wird laut SVG 2 einTypeErrorgeworfen. Ältere Browser verhalten sich hier teilweise anders. - Die Werte sind Zahlen, keine Zeichenketten. Für den Klartext lesen Sie
getAttribute('markerUnits')aus. - Bei
strokeWidthwird der Marker samtmarkerWidth/markerHeightmit der Strichstärke multipliziert. Das ist ein häufiger Grund für unerwartet große Pfeilspitzen. - Die Eigenschaft wird von allen modernen Browsern seit Langem unterstützt. Das Element muss mit
createElementNSim SVG-Namensraum erzeugt werden, sonst gibt esmarkerUnitsnicht.