Diese Anleitung beschreibt den Effekt aus text-animation-green.html:
- Text wird pro Wort gestaffelt animiert
opacity+ leichtery-Move beim Reinscrollen- Farbe wechselt mit Delay von Hatom-Grün (
#7ec242) zu Schwarz - Effekt triggert bei jedem Reinscrollen erneut
- WordPress Seite/Beitrag mit
Custom HTMLBlock - Internetzugriff auf CDN (
jsdelivr) für Motion
<p class="js-scroll-text">
We create digital experiences that move brands and people forward.
</p>Du kannst mehrere Elemente mit .js-scroll-text auf einer Seite verwenden.
.js-scroll-text {
--hatom-green-local: #7ec242;
color: #000;
}
.js-word {
display: inline-block;
opacity: 0;
color: var(--hatom-green-local);
transform: translateY(6px);
will-change: transform, opacity, color;
}<script type="module">
import { inView, animate, stagger } from "https://cdn.jsdelivr.net/npm/motion@latest/+esm";
document.querySelectorAll(".js-scroll-text").forEach((el) => {
const originalText = el.textContent.trim();
const tokens = originalText.split(/(\s+)/);
const fragment = document.createDocumentFragment();
const words = [];
el.setAttribute("aria-label", originalText);
el.textContent = "";
tokens.forEach((token) => {
if (/^\s+$/.test(token)) {
fragment.appendChild(document.createTextNode(token));
return;
}
const span = document.createElement("span");
span.className = "js-word";
span.textContent = token;
span.setAttribute("aria-hidden", "true");
words.push(span);
fragment.appendChild(span);
});
el.appendChild(fragment);
inView(
el,
() => {
animate(
words,
{ opacity: [0, 1], y: [6, 0] },
{
duration: 0.42,
delay: stagger(0.03),
easing: "ease-out",
}
);
animate(
words,
{ color: ["#7ec242", "#000000"] },
{
duration: 1,
delay: stagger(0.03, { startDelay: 0.22 }),
easing: "ease-out",
}
);
// Re-trigger: Beim Verlassen zurücksetzen
return () => {
animate(
words,
{ opacity: 0, y: 6, color: "#7ec242" },
{ duration: 0.18, easing: "linear" }
);
};
},
{ amount: 0.45 }
);
});
</script>Custom HTMLBlock einfügen.- HTML +
<style>+<script type="module">in denselben Block setzen. - Speichern und Frontend testen.
Optional sauberer:
- CSS in den Customizer (
Zusätzliches CSS). - JS über Theme/Child-Theme laden.
- Im Content nur das HTML (
.js-scroll-text) lassen.
- Mehr Grün-Zeit:
startDelayerhöhen, z. B.0.35- oder Farb-
durationerhöhen, z. B.1.2
- Schnellere Wort-Kaskade:
stagger(0.03)auf0.02
- Dezentere Bewegung:
y: [6, 0]aufy: [4, 0]
- Früher/später triggern:
amount: 0.45(kleiner = früher, größer = später)
- Durch
aria-labelbleibt der Satz für Screenreader als normaler Text lesbar. - Die Word-
spans sind mitaria-hidden="true"markiert.
Wenn du Motion+ (z. B. splitText) nutzen willst, brauchst du die gebaute Datei aus plus-2.7.1 (siehe BUILD-WORDPRESS.md). Einmal bauen, dann die statische motion-plus-dom.js im Theme/Plugin ablegen und per wp_enqueue_script() nach Motion laden. Auf dem WordPress-Server wird kein Node/npx benötigt.
- Effekt läuft gar nicht:
- Prüfen, ob
type="module"gesetzt ist. - Prüfen, ob der CDN Import geblockt wird (CSP/Plugin).
- Prüfen, ob
- Script wird in WordPress entfernt:
- Manche Setups filtern
<script>im Editor. - Dann JS im Theme/Child-Theme oder per Snippet-Plugin einbinden.
- Manche Setups filtern
- Zu viel Stottern auf Mobile:
ykleiner setzen (4),durationreduzieren, weniger große Textblöcke animieren.