Start · Sprachen · JavaScript · Referenz · SVGFilterElement

SVGFilterElement

Schnittstelle

Stellt ein SVG-<code>&lt;filter&gt;</code>-Element im DOM dar und gibt per Skript Zugriff auf Filterbereich (<code>x</code>, <code>y</code>, <code>width</code>, <code>height</code>) und Koordinatensysteme.

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

Signatur

interface SVGFilterElement extends SVGElement

Beschreibung

SVGFilterElement ist die DOM-Schnittstelle des SVG-Elements <filter>. Ein Filter fasst mehrere Filterprimitive wie <feGaussianBlur>, <feColorMatrix> oder <feOffset> zusammen. Über das Attribut bzw. die CSS-Eigenschaft filter: url(#id) wird er auf SVG-Formen oder sogar HTML-Elemente angewendet.

Die Schnittstelle erbt von SVGElement und enthält ausschließlich schreibgeschützte, animierbare Eigenschaften: x, y, width und height (jeweils SVGAnimatedLength) legen den Filterbereich fest, filterUnits und primitiveUnits (SVGAnimatedEnumeration) bestimmen das Koordinatensystem, und href (SVGAnimatedString, aus SVGURIReference) verweist auf einen anderen Filter, von dem geerbt wird. Die Objekte selbst lassen sich nicht ersetzen, ihre baseVal-Werte aber schon.

Man nutzt die Schnittstelle, wenn Filter dynamisch erzeugt oder angepasst werden sollen, etwa um den Filterbereich für große Schatten- oder Weichzeichnereffekte zu vergrößern, damit nichts abgeschnitten wird, oder um Filter zur Laufzeit für Diagramme und Visualisierungen zu bauen. Die Standardwerte lauten x="-10%", y="-10%", width="120%", height="120%", filterUnits="objectBoundingBox" und primitiveUnits="userSpaceOnUse".

Parameter

Name Typ Default Beschreibung
$x SVGAnimatedLength -10% Schreibgeschützte Eigenschaft: x-Koordinate des Filterbereichs (Attribut x).
$y SVGAnimatedLength -10% Schreibgeschützte Eigenschaft: y-Koordinate des Filterbereichs (Attribut y).
$width SVGAnimatedLength 120% Schreibgeschützte Eigenschaft: Breite des Filterbereichs.
$height SVGAnimatedLength 120% Schreibgeschützte Eigenschaft: Höhe des Filterbereichs.
$filterUnits SVGAnimatedEnumeration 2 (objectBoundingBox) Koordinatensystem für x, y, width und height. Werte aus SVGUnitTypes: 1 = userSpaceOnUse, 2 = objectBoundingBox.
$primitiveUnits SVGAnimatedEnumeration 1 (userSpaceOnUse) Koordinatensystem für Längenangaben innerhalb der Filterprimitive.
$href SVGAnimatedString Verweis (href bzw. xlink:href) auf einen anderen <filter>, dessen Attribute und Primitive geerbt werden.

Beispiele

Weichzeichnungsfilter dynamisch erzeugen und anwenden

const SVG_NS = "http://www.w3.org/2000/svg";
const svg = document.createElementNS(SVG_NS, "svg");
svg.setAttribute("width", "200");
svg.setAttribute("height", "120");

const defs = document.createElementNS(SVG_NS, "defs");
const filter = document.createElementNS(SVG_NS, "filter");
filter.id = "weich";

const blur = document.createElementNS(SVG_NS, "feGaussianBlur");
blur.setAttribute("stdDeviation", "4");
filter.append(blur);
defs.append(filter);

const rect = document.createElementNS(SVG_NS, "rect");
rect.setAttribute("x", "40");
rect.setAttribute("y", "30");
rect.setAttribute("width", "120");
rect.setAttribute("height", "60");
rect.setAttribute("fill", "teal");
rect.setAttribute("filter", "url(#weich)");

svg.append(defs, rect);
document.body.append(svg);

console.log(filter instanceof SVGFilterElement);
true

Filterbereich und Einheiten auslesen

const filter = document.querySelector("filter#weich");

const unitNames = {
  [SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE]: "userSpaceOnUse",
  [SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX]: "objectBoundingBox"
};

console.log(unitNames[filter.filterUnits.baseVal]);
console.log(unitNames[filter.primitiveUnits.baseVal]);
console.log(filter.width.baseVal.valueAsString);
objectBoundingBox userSpaceOnUse 120%

Filterbereich für großen Schatten vergrößern

const filter = document.querySelector("filter#weich");
const { SVG_LENGTHTYPE_PERCENTAGE } = SVGLength;

// Bereich großzügig erweitern, damit der Effekt nicht abgeschnitten wird
filter.x.baseVal.newValueSpecifiedUnits(SVG_LENGTHTYPE_PERCENTAGE, -50);
filter.y.baseVal.newValueSpecifiedUnits(SVG_LENGTHTYPE_PERCENTAGE, -50);
filter.width.baseVal.valueAsString = "200%";
filter.height.baseVal.valueAsString = "200%";

console.log(filter.getAttribute("x"), filter.getAttribute("width"));
-50% 200%

Koordinatensystem auf Benutzerraum umstellen

const filter = document.querySelector("filter#weich");

// filterUnits.baseVal ist beschreibbar (Zahl aus SVGUnitTypes)
filter.filterUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE;
filter.x.baseVal.valueAsString = "0";
filter.y.baseVal.valueAsString = "0";
filter.width.baseVal.valueAsString = "200";
filter.height.baseVal.valueAsString = "120";

console.log(filter.getAttribute("filterUnits"));
userSpaceOnUse