Start · Sprachen · JavaScript · Referenz · SVGFESpotLightElement.limitingConeAngle

SVGFESpotLightElement.limitingConeAngle

Eigenschaft

Schreibgeschützte Eigenschaft, die das <code>limitingConeAngle</code>-Attribut eines <code>&lt;feSpotLight&gt;</code>-Elements als <code>SVGAnimatedNumber</code> liefert.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

SVGFESpotLightElement.limitingConeAngle

Beschreibung

Die Eigenschaft limitingConeAngle der Schnittstelle SVGFESpotLightElement spiegelt das gleichnamige SVG-Attribut des Elements <feSpotLight> wider. Das Attribut legt in Grad fest, wie weit sich der Lichtkegel eines Spotlichts um seine Hauptachse öffnen darf. Außerhalb dieses Kegels fällt kein Licht auf die beleuchtete Fläche.

Zurückgegeben wird ein SVGAnimatedNumber-Objekt. Die Eigenschaft selbst kann man nicht neu zuweisen. Den im Attribut stehenden Wert kann man aber über baseVal lesen und schreiben. animVal liefert den aktuell wirksamen Wert, also mit eventuellen SMIL-Animationen.

Gebraucht wird das vor allem bei dynamischen Lichteffekten mit <feDiffuseLighting> oder <feSpecularLighting>, etwa wenn der Kegel per Schieberegler oder Animation enger oder weiter werden soll. Ist das Attribut nicht gesetzt, gibt es keinen begrenzenden Kegel. Das Licht fällt dann nur durch specularExponent zum Rand hin ab.

Rückgabewert

Typ
SVGAnimatedNumber
Beschreibung
Ein Objekt mit baseVal (Attributwert in Grad, lesen und schreiben) und animVal (aktuell wirksamer Wert, nur lesen). Ohne gesetztes Attribut ist baseVal 0.

Beispiele

Kegelwinkel auslesen

const svgNS = 'http://www.w3.org/2000/svg';
const spot = document.createElementNS(svgNS, 'feSpotLight');
spot.setAttribute('limitingConeAngle', '30');

console.log(spot.limitingConeAngle.baseVal);
console.log(spot.limitingConeAngle.animVal);
30 30

Lichtkegel per Schieberegler steuern

// HTML: <input type="range" id="cone" min="5" max="90" value="20">
// SVG enthält <feSpotLight id="spot" ... limitingConeAngle="20"/>
const spot = document.getElementById('spot');
const slider = document.getElementById('cone');

slider.addEventListener('input', () => {
  spot.limitingConeAngle.baseVal = Number(slider.value);
  console.log(spot.getAttribute('limitingConeAngle'));
});
z. B. "45" nach Verschieben des Reglers

Kompletten Spotlight-Filter aufbauen und Kegel animieren

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

const filter = document.createElementNS(svgNS, 'filter');
filter.id = 'spotFilter';
const lighting = document.createElementNS(svgNS, 'feDiffuseLighting');
lighting.setAttribute('lighting-color', 'white');
const spot = document.createElementNS(svgNS, 'feSpotLight');
Object.entries({ x: 100, y: 100, z: 150, pointsAtX: 100, pointsAtY: 100, pointsAtZ: 0, limitingConeAngle: 10 })
  .forEach(([k, v]) => spot.setAttribute(k, v));

lighting.append(spot);
filter.append(lighting);
const rect = document.createElementNS(svgNS, 'rect');
rect.setAttribute('width', '200');
rect.setAttribute('height', '200');
rect.setAttribute('filter', 'url(#spotFilter)');
svg.append(filter, rect);
document.body.append(svg);

// Kegel pulsierend öffnen und schließen
const tick = (t) => {
  spot.limitingConeAngle.baseVal = 10 + 20 * (1 + Math.sin(t / 500)) / 2;
  requestAnimationFrame(tick);
};
requestAnimationFrame(tick);

// Wichtig · Fallstricke

  • Schreibgeschützt heißt nur die Referenz: spot.limitingConeAngle = 30 hat keine Wirkung. Setze stattdessen spot.limitingConeAngle.baseVal = 30 oder nutze setAttribute().
  • Den Wert von animVal kann man nicht schreiben. Er weicht von baseVal nur ab, solange eine SMIL-Animation (<animate>) läuft.
  • Der Wert ist ein Winkel in Grad. Negative Werte werden wie ihr Betrag behandelt. Ein fehlendes Attribut bedeutet, dass es keinen begrenzenden Kegel gibt. Das ist nicht dasselbe wie 0 im Attribut, obwohl baseVal in beiden Fällen 0 liefert. Ob das Attribut gesetzt ist, prüfst du mit hasAttribute('limitingConeAngle').
  • Der Rand des Kegels wird harter oder weicher dargestellt, je nach Browser. Manche glätten ihn, andere nicht.
  • Elemente musst du mit createElementNS() im SVG-Namensraum erzeugen, sonst gibt es die Eigenschaft nicht.
  • Alle aktuellen Browser unterstützen die Eigenschaft. Bei vielen Filtern, die in jedem Frame animiert werden, kann die Leistung spürbar sinken.