Signatur
Beschreibung
Die Eigenschaft in1 der Schnittstelle SVGFEDisplacementMapElement gibt ein SVGAnimatedString-Objekt zurück. Es spiegelt das Attribut in des Filterprimitivs <feDisplacementMap> wider. Dieses Attribut legt fest, welche Grafik verschoben wird, also die Eingabe, auf die die Verschiebungskarte angewendet wird.
Als Wert erlaubt sind die Schlüsselwörter SourceGraphic, SourceAlpha, BackgroundImage, BackgroundAlpha, FillPaint und StrokePaint sowie der Name eines result-Attributs aus einem vorherigen Filterprimitiv. Die Verschiebungskarte selbst (welche Pixel wie weit verschoben werden) kommt über das zweite Attribut in2, das über die Eigenschaft in2 erreichbar ist.
Schreibgeschützt ist nur die Eigenschaft selbst, also der Verweis auf das SVGAnimatedString-Objekt. Den Attributwert kannst du über in1.baseVal lesen und setzen. in1.animVal liefert den aktuellen Wert, auch während einer SMIL-Animation. Brauchbar ist das zum Beispiel, wenn du zur Laufzeit per Skript die Filterkette umbaust, etwa um zwischen Originalgrafik und einem Zwischenergebnis umzuschalten.
Rückgabewert
baseVal (Wert des in-Attributs, lesbar und schreibbar) und animVal (aktueller, eventuell animierter Wert, nur lesbar). Fehlt das Attribut, ist baseVal ein leerer String.Beispiele
Eingabequelle auslesen
// SVG im Dokument:
// <filter id="welle">
// <feTurbulence type="turbulence" baseFrequency="0.05" result="rauschen"/>
// <feDisplacementMap id="dm" in="SourceGraphic" in2="rauschen" scale="20"/>
// </filter>
const dm = document.getElementById('dm');
console.log(dm.in1.baseVal);
console.log(dm.in2.baseVal);
Filter komplett per Skript erzeugen
const NS = 'http://www.w3.org/2000/svg';
const svg = document.createElementNS(NS, 'svg');
const filter = document.createElementNS(NS, 'filter');
filter.id = 'verzerrt';
const turb = document.createElementNS(NS, 'feTurbulence');
turb.setAttribute('baseFrequency', '0.02');
turb.setAttribute('result', 'karte');
const dm = document.createElementNS(NS, 'feDisplacementMap');
dm.in1.baseVal = 'SourceGraphic'; // setzt das Attribut in="SourceGraphic"
dm.in2.baseVal = 'karte';
dm.scale.baseVal = 30;
filter.append(turb, dm);
svg.append(filter);
document.body.append(svg);
console.log(dm.getAttribute('in'));
Eingabe zur Laufzeit umschalten
const dm = document.querySelector('feDisplacementMap');
const button = document.querySelector('#umschalten');
button.addEventListener('click', () => {
// Zwischen Originalgrafik und Alpha-Kanal wechseln
dm.in1.baseVal = dm.in1.baseVal === 'SourceGraphic'
? 'SourceAlpha'
: 'SourceGraphic';
console.log(`Aktuelle Eingabe: ${dm.in1.animVal}`);
});
// Wichtig · Fallstricke
- Die Eigenschaft heißt
in1und nichtin, weilinin JavaScript ein reserviertes Wort (Operator) ist. Das zugehörige Attribut heißt trotzdemin, alsogetAttribute('in'). dm.in1 = 'SourceGraphic'hat keine Wirkung (im Strict Mode gibt es einenTypeError). Ändere stattdessen immerin1.baseVal.- Fehlt
inoder ist es leer, nimmt das Primitiv beim ersten FilterprimitivSourceGraphicals Eingabe, sonst das Ergebnis des vorherigen Primitivs.baseValbleibt in diesem Fall trotzdem ein leerer String. - Verweist
inauf einenresult-Namen, den es nicht gibt, gilt die Filterreferenz als ungültig. Je nach Browser wird das Element dann gar nicht oder ohne Filter gezeichnet. BackgroundImageundBackgroundAlphaunterstützen die gängigen Browser praktisch nicht.FillPaintundStrokePaintwerden ebenfalls kaum unterstützt.- Die Eigenschaft selbst funktioniert in allen modernen Browsern.
feDisplacementMapkann bei großen Flächen oder animierter Turbulenz aber viel Rechenzeit kosten.