Form Steps macht aus einem gewöhnlichen Webflow-Formular ein Formular mit mehreren Schritten. Das Formular bleibt ein Webflow-Formular: Submit, Erfolgs- und Fehlermeldung, Zapier, Make und alle Integrationen laufen unverändert weiter. Neu ist nur, was zwischen dem ersten Feld und dem Absenden passiert.
Verzweigung: Die Antwort in Schritt 2 entscheidet, welche Schritte danach überhaupt vorkommen.
Eigene Fehlertexte statt der Browser-Sprechblase, pro Feld oder pro Formular.
Pflichtfelder gelten schrittweise: Weiter geht erst, wenn der sichtbare Schritt vollständig ist.
1
Dieses <script> in den Custom Code deines Projekts
Einmal pro Projekt genügt, auch wenn du die Lösung auf mehreren Seiten nutzt: Project Settings → Custom Code → Footer Code. Das Skript lädt verzögert und startet nur, wenn es auf der Seite ein data-fpu-Attribut findet.
Jeder Schritt ist ein gewöhnlicher Div-Block im Formular. Du baust alle Schritte untereinander im Designer — sichtbar wird immer nur einer. Zwei Wege sind üblich:
Linear — jeder Schritt kommt dran
Empfohlen zum Start
Form Block data-fpu-form-element="form"
└─ Form
├─ Div Schritt 1 data-fpu-form-element="step"
├─ Div Schritt 2 data-fpu-form-element="step"
├─ Div Schritt 3 data-fpu-form-element="step"
└─ Div Knopfleiste
├─ Button data-fpu-form-element="prev"
├─ Button data-fpu-form-element="next"
└─ Submit
Drei bis fünf Schritte in fester Reihenfolge. Zwei Attribute und zwei Knöpfe, mehr braucht es nicht.
Verzweigt — die Antwort entscheidet
Für Funnels
Div Wer bist du? data-fpu-form-element="step"
data-fpu-form-step-id="art"
Div Firmendaten data-fpu-form-element="step"
data-fpu-form-step-if="kundenart=firma"
Div Privatdaten data-fpu-form-element="step"
data-fpu-form-step-if="kundenart=privat"
Div Absenden data-fpu-form-element="step"
Jeder Schritt bekommt eine ID und eine Bedingung. Wer „Firma“ wählt, sieht die Firmen-Schritte; wer „Privat“ wählt, überspringt sie. Fortschritt und Zähler rechnen automatisch mit dem kürzeren Weg.
3
Diese nötigen Attribute an die Elemente hängen
Auf das Formular
Form Block oder Form
AttributWertBeschreibung
data-fpu-form-elementformSchaltet die Lösung für dieses Formular ein. Darf am Form Block oder am Form selbst hängen. Pflicht.
Auf jeden Schritt
Div-Block im Formular
AttributWertBeschreibung
data-fpu-form-elementstepMacht den Div-Block zu einem Schritt. Die DOM-Reihenfolge ist die Reihenfolge der Schritte. Pflicht.
data-fpu-form-step-nameKontaktAnzeigename des Schritts. Erscheint in {name} und in Elementen mit step-name.
data-fpu-form-step-idkontaktStabile ID. Nötig für Sprünge und Bedingungen, empfohlen, sobald sich die Reihenfolge noch ändern kann.
Auf die Knöpfe
Button · Link Block · Submit
AttributWertBeschreibung
data-fpu-form-elementnextWeiter. Prüft vorher den sichtbaren Schritt und bleibt stehen, wenn etwas fehlt. Pflicht.
data-fpu-form-elementprevZurück. Ohne Prüfung, und folgt dem tatsächlich gegangenen Weg — auch nach einem Sprung.
data-fpu-form-elementsubmitAbsenden. Nur im letzten Schritt aktiv. Ohne dieses Attribut übernimmt die Lösung den nativen Submit-Button des Formulars.
Verzweigen: welche Schritte nach welcher Antwort kommen
Zwei Wege führen zum Ziel, und sie lassen sich mischen. Eine Bedingung am Schritt entscheidet, ob der Schritt überhaupt zum Weg gehört. Ein Sprungziel an der Antwort schickt direkt zu einem bestimmten Schritt. Übersprungene Schritte zählen weder im Fortschritt noch im Zähler, werden nicht geprüft und ihre Felder werden abgeklemmt — sie landen also auch nicht im Submit.
Am Schritt
Bedingung und Sprungziel
AttributWertBeschreibung
data-fpu-form-step-ifkundenart=firmaDer Schritt gehört nur zum Weg, wenn der Ausdruck wahr ist. Feldname links, Wert rechts.
data-fpu-form-step-idfirmaZiel-ID für Sprünge. Ohne ID zählt die Position des Schritts.
data-fpu-form-gotodankeStandard-Ziel nach diesem Schritt. Wird von einem Ziel am Knopf oder an der Antwort überstimmt.
An der Antwort
Radio · Checkbox · Option · Weiter-Knopf
AttributWertBeschreibung
data-fpu-form-gotofirmaIst diese Antwort gewählt, geht Weiter direkt zu dem Schritt mit dieser ID. Am Weiter-Knopf gilt das Ziel immer.
Ausdrücke in step-if
gleiche Syntax wie data-fpu-condition
AttributBeschreibung
plan=proGleichheit, Groß- und Kleinschreibung egal, Zahlen werden als Zahlen verglichen.
plan!=basicUngleichheit.
plan=basic|proMehrere erlaubte Werte für dasselbe Feld.
menge>=5Zahlvergleich, auch mit <, > und <=. „19,99“ wird verstanden.
newsletterNur der Feldname: wahr, sobald das Feld angehakt oder gefüllt ist.
plan=pro && menge>=5UND — beide Teile müssen stimmen.
plan=pro || plan=teamODER — bindet schwächer als UND, klammert also die UND-Gruppen.
Drei Antworten, drei Wege
<!-- Schritt 2: die Auswahl -->
<div data-fpu-form-element="step" data-fpu-form-step-id="auswahl">
<label><input type="radio" name="ziel" value="website"> Website</label>
<label><input type="radio" name="ziel" value="shop"> Onlineshop</label>
<label><input type="radio" name="ziel" value="support"> Support</label>
</div>
<!-- Danach kommt nur, was zur Antwort passt -->
<div data-fpu-form-element="step" data-fpu-form-step-if="ziel=website">…</div>
<div data-fpu-form-element="step" data-fpu-form-step-if="ziel=shop">…</div>
<div data-fpu-form-element="step" data-fpu-form-step-if="ziel=support">…</div>
<!-- Immer am Ende -->
<div data-fpu-form-element="step" data-fpu-form-step-id="absenden">…</div>
5
Eigene Fehlertexte statt der Browser-Sprechblase
Ohne Zutun prüft die Lösung beim Weiter alle sichtbaren Felder des Schritts und zeigt die Browser-Sprechblase. Sobald du irgendwo im Formular ein Fehler-Element setzt, wandert der Text dorthin — gestaltet im Designer, sichtbar nur im Fehlerfall. Was geprüft wird, kommt weiter aus den gewohnten Webflow-Feldeinstellungen (Required, Typ, Muster, Länge).
Wann geprüft wird
Am Formular oder am einzelnen Schritt
AttributWertStandardBeschreibung
data-fpu-form-validatestepstepBeim Klick auf Weiter wird der sichtbare Schritt geprüft.
data-fpu-form-validateliveZusätzlich beim Verlassen eines Felds — der Fehler steht sofort, nicht erst am Schrittende.
data-fpu-form-validatesubmitErst beim Absenden, dafür über alle Schritte des gegangenen Wegs.
data-fpu-form-validatenoneKeine eigene Prüfung. Sinnvoll für einen einzelnen Zwischenschritt ohne Felder.
Wo der Fehler steht
Text-Block im Formular
AttributWertBeschreibung
data-fpu-form-elementerrorTrägt den Fehlertext. Ist von sich aus versteckt und bekommt im Fehlerfall die Klasse fpu-form-error-visible.
data-fpu-form-error-fore-mailBindet das Element an ein bestimmtes Feld (dessen name oder id) oder an eine Gruppe. Ohne Angabe gilt das nächstgelegene Feld im selben Wrapper.
data-fpu-form-elementfieldOptionaler Wrapper um Label, Feld und Fehler. Bekommt im Fehlerfall fpu-form-field-invalid — praktisch für einen roten Rahmen.
data-fpu-form-elementsummaryZusammenfassung oben im Schritt: eine Liste aller Fehler, jeder Eintrag springt zum Feld.
Was der Fehler sagt
Am Feld, sonst am Formular
AttributWertBeschreibung
data-fpu-form-message-requiredWir brauchen deinen Namen.Pflichtfeld ist leer. Platzhalter {label} setzt den Feldnamen ein.
data-fpu-form-message-emailDa fehlt das @.Auch -url, -tel, -number und -pattern gibt es. Am Formular gesetzt gelten sie für alle Felder.
data-fpu-form-message-minlengthMindestens {min} Zeichen.Dazu -maxlength, -min, -max und -step. {min} und {max} setzen die Grenze ein.
data-fpu-form-messageBitte prüf das noch mal.Eine Meldung für jeden Fehler dieses Felds — praktisch, wenn ein Feld nur einen Fehlerfall hat.
data-fpu-form-labelE-Mail-AdresseKlartextname für {label}. Ohne das Attribut wird das Label, sonst der Platzhalter, sonst der Feldname genommen.
Ein Feld mit eigenem Fehlertext
<div data-fpu-form-element="field">
<label for="mail">E-Mail</label>
<input id="mail" name="e-mail" type="email" required
data-fpu-form-label="deine E-Mail"
data-fpu-form-message-required="Ohne {label} können wir nicht antworten."
data-fpu-form-message-email="Da fehlt noch das @.">
<div data-fpu-form-element="error" data-fpu-form-error-for="e-mail"></div>
</div>
6
Projekt veröffentlichen und das Formular auf der Live-Site durchklicken
Attribute wirken erst auf der veröffentlichten Seite — im Designer bleibt der Stapel aus Schritten sichtbar, das ist richtig so. Passiert nichts, hilft data-fpu-form-logging=„true“ am Formular: die Konsole meldet dann in einer Zeile, wie viele Schritte gefunden wurden und wie viele davon gerade zum Weg gehören.
OptionalBrauchst du nur, wenn du es brauchst — aufklappen
OptionalFortschritt, Zähler und IndikatorenBalken, „Schritt 2 von 4“, Punktleiste
Alle drei rechnen mit dem aktuellen Weg: Fällt ein Schritt durch eine Verzweigung weg, zählt er nirgends mit. Die Elemente dürfen auch außerhalb des Formulars liegen — dann verbindet sie data-fpu-form-instance mit dem richtigen Formular.
Anzeige-Elemente
AttributWertElementBeschreibung
data-fpu-form-elementprogressDiv BlockFortschrittsbalken. Die Breite wird in Prozent gesetzt, den Rest macht dein Styling.
data-fpu-form-elementstep-countText BlockZähler-Text. Standard „Schritt {current} von {total}“.
data-fpu-form-count-template{current}/{total} · {name}Text BlockEigenes Zähler-Format. Am Zähler-Element oder am Formular. Platzhalter: {current}, {total}, {name}.
data-fpu-form-elementstep-nameText BlockZeigt den Namen des aktuellen Schritts (data-fpu-form-step-name).
data-fpu-form-elementindicatorDiv BlockEin Punkt bzw. Reiter je Schritt, in DOM-Reihenfolge. Klickbar, aber nur zu bereits besuchten Schritten. Klassen: fpu-form-indicator-active, -visited, -locked.
data-fpu-form-indicator-forfirmaDiv BlockBindet einen Indikator fest an eine Step-ID. Ohne diese Bindung zählt die Position, und überzählige Indikatoren werden ausgeblendet.
Webflow kann Radios und Checkboxen gestalten, aber nicht als ganze Kachel klickbar machen und nicht „mindestens eine Auswahl“ erzwingen. Genau das ergänzt diese Lösung. Für gestaltete Dropdowns bleibt das native Select das Formularfeld — kombiniere es mit data-fpu-select (Custom Form Select); Fokus und Fehlermarkierung landen dann automatisch auf dem sichtbaren Auslöser.
Auswahl-Kachel
Div-Block mit Radio oder Checkbox darin
AttributWertBeschreibung
data-fpu-form-elementchoiceDie ganze Fläche wird klickbar. Bei ausgewählter Antwort trägt sie fpu-form-choice-selected — dein Styling für den gewählten Zustand. Ist der Input optisch versteckt, übernimmt die Kachel Fokus und Tastatur.
Gruppe aus Radios oder Checkboxen
Div-Block um alle Antworten
AttributWertBeschreibung
data-fpu-form-elementgroupFasst die Antworten zu einer Einheit zusammen. Erst dann kann eine Auswahl Pflicht sein und einen eigenen Fehlertext bekommen.
data-fpu-form-requiredtrueMindestens eine Auswahl. Weiter geht erst danach.
data-fpu-form-min2Mindestzahl an Haken bei Checkbox-Gruppen.
data-fpu-form-max3Höchstzahl an Haken bei Checkbox-Gruppen.
data-fpu-form-groupinteressenName der Gruppe. Ein Fehler-Element mit data-fpu-form-error-for=„interessen“ zeigt dann deren Meldung.
data-fpu-form-message-group-requiredSuch dir eins aus.Eigener Text für die Gruppe. Dazu -group-min und -group-max mit {min} und {max}.
data-fpu-form-auto-nexttrueNach der Radio-Auswahl automatisch weiter. Auch am Schritt erlaubt. Das Typeform-Muster.
data-fpu-form-auto-next-delay260Verzögerung in Millisekunden, damit die Auswahl noch kurz sichtbar bleibt.
OptionalWeitere EinstellungenZwischenspeichern, Scrollen, mehrere Formulare
Am Formular
AttributWertStandardBeschreibung
data-fpu-form-persisttrue · falsefalseEingaben und den erreichten Schritt in der Sitzung sichern und beim Zurückkommen wiederherstellen. Passwörter, Dateien und versteckte Felder werden nie gespeichert; nach erfolgreichem Absenden wird alles gelöscht.
data-fpu-form-scrolltrue · falsefalseBei jedem Schrittwechsel an den Anfang des Formulars scrollen. Bei langen Schritten fast immer richtig.
data-fpu-form-instance2Verbindet Elemente außerhalb des Formulars — Fortschritt, Zähler, Indikatoren, Knöpfe — mit genau diesem Formular. Nur nötig, wenn zwei Formulare auf einer Seite stehen.
data-fpu-form-loggingtrue · falsefalseEine Zeile in der Konsole beim Start: Version, Anzahl Schritte, Prüfmodus.
Globale Standards für alle Formulare
<script>
window.fpuFormStepsConfig = {
persist: true,
scroll: true,
validate: "live",
countTemplate: "Schritt {current} von {total}",
messages: {
required: "Das brauchen wir noch.",
email: "Bitte eine gültige E-Mail.",
},
};
</script>
OptionalTastatur, Klassen und Eventsfür Animationen und eigenes Skript
Enter in einem Feld heißt Weiter statt Absenden, außer im letzten Schritt. Alt+Pfeil rechts und links blättern, solange der Fokus nicht in einem Textfeld oder Dropdown liegt. Nach jedem Wechsel springt der Fokus auf das erste Feld des neuen Schritts.
Klassen, die du stylen kannst
AttributBeschreibung
fpu-form-step-activeDer gerade sichtbare Schritt.
fpu-form-step-skippedEin Schritt, der durch eine Verzweigung gerade nicht zum Weg gehört.
fpu-form-invalidAm fehlerhaften Feld.
fpu-form-field-invalidAm Feld-Wrapper und an der Gruppe.
fpu-form-choice-selectedAn der gewählten Auswahl-Kachel.
fpu-form-btn-disabledAn Knöpfen, die im aktuellen Schritt nichts tun können.
fpu:form-validWenn ein Absenden die Prüfung bestanden hat und durchgelassen wird.
Mehr MöglichkeitenZusätzliche Features
Webflow-Submit bleibt unangetastet
Die Prüfung läuft vor Webflows eigenem Handler. Ungültige oder verfrühte Absendeversuche erreichen Webflow nie — Erfolgsmeldung, Fehlermeldung und alle angebundenen Dienste verhalten sich wie immer.
Zurück folgt dem echten Weg
Nach einem Sprung führt Zurück dorthin, wo man tatsächlich herkam, nicht zum vorherigen Element im Designer.
Aufräumbar
window.fpuFormSteps.destroyAll() nimmt alle Listener, Klassen und ARIA-Attribute zurück und stellt den Ausgangszustand her — für Seitenübergänge und Single-Page-Umgebungen.
Barrierefrei von Haus aus
Schritte sind Gruppen mit Namen, inaktive Schritte sind inert und für Screenreader weg, der Fortschritt ist eine Progressbar, Fehler werden als Alert angekündigt und mit aria-describedby ans Feld gehängt.