Signatur
Beschreibung
Die Schnittstelle SVGFESpotLightElement gehört zum DOM-Objekt des SVG-Elements <feSpotLight>. Dieses Element beschreibt eine Lichtquelle, die wie ein Scheinwerfer von einem Punkt im Raum (x, y, z) in Richtung eines Zielpunkts (pointsAtX, pointsAtY, pointsAtZ) strahlt. Allein zeichnet es nichts, sondern muss als Kindelement eines <feDiffuseLighting>- oder <feSpecularLighting>-Filterprimitivs stehen.
Alle Eigenschaften sind schreibgeschützte animierbare Werte vom Typ SVGAnimatedNumber:
x,y,z: Position der Lichtquelle im Koordinatensystem, das überprimitiveUnitsdes Filters festgelegt ist.pointsAtX,pointsAtY,pointsAtZ: Punkt, auf den der Lichtkegel zeigt.specularExponent: Stärke der Bündelung zur Kegelmitte hin (Standard1).limitingConeAngle: halber Öffnungswinkel des Lichtkegels in Grad; außerhalb gibt es kein Licht.
Über baseVal liest oder setzt man den Attributwert, über animVal den aktuell (ggf. durch SMIL-Animation) wirksamen Wert. Damit lassen sich Lichteffekte per JavaScript dynamisch steuern, etwa ein Scheinwerfer, der dem Mauszeiger folgt.
Rückgabewert
document.createElementNS("http://www.w3.org/2000/svg", "feSpotLight") oder beim Parsen von SVG-Markup; ein eigener Konstruktor existiert nicht.Beispiele
Spotlight-Filter per JavaScript erzeugen
const SVG_NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(SVG_NS, 'svg');
svg.setAttribute('width', '300');
svg.setAttribute('height', '200');
const filter = document.createElementNS(SVG_NS, 'filter');
filter.id = 'spot';
const lighting = document.createElementNS(SVG_NS, 'feDiffuseLighting');
lighting.setAttribute('in', 'SourceGraphic');
lighting.setAttribute('lighting-color', '#ffe9a8');
const spot = document.createElementNS(SVG_NS, 'feSpotLight');
spot.x.baseVal = 150;
spot.y.baseVal = 20;
spot.z.baseVal = 200;
spot.pointsAtX.baseVal = 150;
spot.pointsAtY.baseVal = 150;
spot.limitingConeAngle.baseVal = 25;
spot.specularExponent.baseVal = 8;
lighting.append(spot);
filter.append(lighting);
const rect = document.createElementNS(SVG_NS, 'rect');
rect.setAttribute('width', '300');
rect.setAttribute('height', '200');
rect.setAttribute('fill', '#888');
rect.setAttribute('filter', 'url(#spot)');
svg.append(filter, rect);
document.body.append(svg);
console.log(spot instanceof SVGFESpotLightElement);
console.log(spot.getAttribute('limitingConeAngle'));
Scheinwerfer folgt der Maus
// Voraussetzung: <svg id="stage"> mit <feSpotLight id="light"> im Filter
const svg = document.getElementById('stage');
const light = document.getElementById('light');
svg.addEventListener('pointermove', (event) => {
const rect = svg.getBoundingClientRect();
light.pointsAtX.baseVal = event.clientX - rect.left;
light.pointsAtY.baseVal = event.clientY - rect.top;
});
Vorhandene Werte auslesen
const light = document.querySelector('feSpotLight');
const info = {
position: [light.x.baseVal, light.y.baseVal, light.z.baseVal],
ziel: [light.pointsAtX.baseVal, light.pointsAtY.baseVal, light.pointsAtZ.baseVal],
kegel: light.limitingConeAngle.baseVal,
exponent: light.specularExponent.animVal
};
console.log(info);
// Wichtig · Fallstricke
- SVG-Elemente müssen mit
createElementNS()und dem SVG-Namensraum erzeugt werden;document.createElement('feSpotLight')liefert einHTMLUnknownElementohne diese Eigenschaften. - Die Eigenschaften selbst sind schreibgeschützt:
spot.x = 10hat keine Wirkung, korrekt istspot.x.baseVal = 10odersetAttribute('x', '10'). - Attributnamen unterscheiden Groß-/Kleinschreibung (
pointsAtX,limitingConeAngle,specularExponent). - Die Koordinaten beziehen sich auf
primitiveUnitsdes Filters (StandarduserSpaceOnUse). BeiobjectBoundingBoxsind Werte zwischen 0 und 1 zu erwarten;zwird dabei browserabhängig unterschiedlich interpretiert. - Ohne
limitingConeAnglegibt es keine Kegelbegrenzung. Kanten wirken je nach Browser unterschiedlich weich. - Beleuchtungsfilter sind rechenintensiv; bei großen Flächen und häufigen Updates (z. B.
pointermove) mitrequestAnimationFramedrosseln. - Wird von allen modernen Browsern unterstützt; kleinere Unterschiede beim Rendering gibt es zwischen den Engines.