Dieses Muster hast du wahrscheinlich schon oft gesehen. Es ist ein Eingabefeld, das aussieht, als hätte es Platzhaltertext, aber wenn du darauf klickst/tippst, verschwindet dieser Text und du kannst dort tippen. Ich finde das ziemlich clever. Brad Frost hat einen wirklich guten Beitrag dazu, in dem die Vor- und Nachteile usw. detailliert beschrieben werden.
Viele der Demos, die ich gesehen habe, beinhalten JavaScript. Neulich habe ich beim Auschecken bei Nest.com deren Technik dafür gesehen und mir eine Möglichkeit überlegt, wie ich das ohne JavaScript umsetzen könnte. Also hier sind wir.
So sieht die Nest.com-Version aus

Und hier ist mein Ansatz
Es ist nicht ganz so schick wie die Nest-Versionen, bei denen der Text ausblendet, während das Label hochgleitet. Sicherlich mit etwas JavaScript möglich, aber wir bleiben hier bei reinem CSS. Könnte aber trotzdem möglich sein. Diese Herausforderung überlasse ich dir.
Einige schnelle Erinnerungen
Es gibt zwei Gründe, warum du dies in Betracht ziehen könntest
- Es könnte Platz sparen. Da Eingabefeld und Label kombiniert sind, nimmt es weniger Platz ein. Wenn ein Eingabefeld im Fokus ist, musst du immer noch sowohl das Label als auch das Eingabefeld anzeigen, aber du kannst diesen Platz entweder nutzen, indem du einen Teil des bereits genutzten Platzes verwendest, oder indem du den Bereich vorübergehend nur für das fokussierte Eingabefeld vergrößerst.
- Es macht das Eingabefeld zu einem großen Button. Nicht, dass Eingabefelder nicht schon wären, und nicht, dass Labels es nicht wären, wenn sie ein richtiges
for-Attribut haben, aber es hat etwas Schönes an einem großen Rechteck, das dir sagt, was es will, und das du anklickst/antippst. Könnte besonders auf Mobilgeräten ein schönes Erlebnis sein.
Ich würde sagen, im Allgemeinen sind immer sichtbare Labels wahrscheinlich "besser" – aber das ist eine clevere Idee und richtig gemacht, gelegentlich nützlich. Es besteht immer das Risiko, dies zu vermasseln und die Zugänglichkeit zu beeinträchtigen, also sei vorsichtig. Ein Nachteil dieses Musters: Wir können placeholder nicht zusätzlich zum Label verwenden, was hilfreich sein kann (z. B. ein Label "Telefonnummer" und ein Platzhalterhinweis "(555) 555-5555").
Der Trick (1 von 3) – Das Label ist der Platzhalter
Es gibt ein <div>, das sowohl das <label> als auch das <input> enthält (was du sowieso tun musst, da Eingabefelder in Formularen in Block-Level-Elementen sein müssen), das relativ positioniert ist. Das ermöglicht eine absolute Positionierung darin, was bedeutet, dass wir das Label und das Eingabefeld übereinander positionieren können. Wenn wir das Eingabefeld oben platzieren, aber mit einem transparenten Hintergrund, kannst du das Label direkt darunter sehen und trotzdem darauf klicken.
<div>
<input id="name" name="name" type="text" required>
<label for="name">Your Name</label>
</div>
form > div {
position: relative;
}
form > div > label {
position: absolute;
}
Der Trick (2 von 3) – Der :focus-Zustand und der benachbarte Geschwisterselektor
Die Quellreihenfolge von <label> und <input> wäre hier nicht sehr wichtig, da sie semantisch mit dem for-Attribut verbunden sind. Aber wenn wir das Eingabefeld zuerst platzieren, können wir seinen :focus-Zustand und einen benachbarten Geschwisterselektor (+) nutzen, um das Label zu beeinflussen, wenn es fokussiert ist. Ähnlich im Konzept wie der Checkbox-Hack.
input:focus + label {
/* do something with the label */
}
Mit dem Label kannst du machen, was du willst. Finde einfach einen coolen Platz, um es zu verschieben und zu stylen, damit es beim Tippen im Eingabefeld nicht stört. Mein Beispiel hatte zwei Möglichkeiten: eine war, es kleiner zu machen und zum unteren Rand des Eingabefelds zu verschieben, die andere war, es zur rechten Seite zu bewegen.
form.go-bottom label {
position: absolute;
top: 0;
bottom: 0;
left: 0;
width: 100%;
transition: 0.2s;
}
form.go-bottom input:focus + label
top: 100%;
margin-top: -16px;
}
Der Trick (3 von 3) – der :valid-Zustand
Sobald das Eingabefeld tatsächlichen Text enthält und wieder aus dem Fokus gerät, wäre es sehr seltsam (schlecht), wenn Label und Eingabetext übereinander liegen. Glücklicherweise gibt es in CSS einen :valid-Selektor, der auf Eingabefelder funktioniert, wenn sie sich in einem gültigen Zustand befinden. Dieser gültige Zustand kann "beliebiger Text" sein, vorausgesetzt, das Einzige, was ihn gültig macht, ist das Vorhandensein eines beliebigen Wertes, was wie folgt erreicht werden kann:
<input type="text" required>
Denk daran, dass du das Label überhaupt nur sehen konntest, weil das Eingabefeld einen transparenten Hintergrund hatte. Um es zu verbergen, können wir stattdessen einen undurchsichtigen Hintergrund verwenden
form input:valid {
background: white;
}
Der Rest ist nur Feinarbeit an Design-Details, bis du es so hast, wie du es möchtest.
Mehr
Die Idee stammt ursprünglich von Matt D. Smith, mit diesem Design

- Denke daran, Brad Frosts Artikel zu lesen, der die Vor- und Nachteile gut behandelt.
- Einige Leute haben dies mit JavaScript angegangen: Jeremy Fields, Jim Nielsen und maman
- Als ich nach Links suchte, um sie hier einzufügen, entdeckte ich, dass David Bushell ziemlich genau das getan hat, was ich hier getan habe.
- Hier ist eine Sammlung von Float Label Beispielen auf CodePen.
Update 2018 – Verwendung von :placeholder-shown
Der Selektor :placeholder-shown existierte nicht, als dieser Artikel ursprünglich geschrieben wurde. Emil Björklund beleuchtet das Thema neu, da er jetzt existiert.
GENIAL!!!
Das ist wirklich beeindruckend… wenn es nur auf allen Browsern vollständig unterstützt würde
Das kann man von fast jeder relativ neuen CSS-Funktion sagen!
Davon abgesehen ist das eine ziemlich gute Ergänzung zu Platzhaltertexten.
Auch wenn es nicht funktioniert, ist kein Schaden entstanden.
Schön! Eine Anmerkung: Anstatt
:validzu überladen, was du vielleicht für Feldvalidierungen verwenden möchtest, kannst du den:empty-Selektor verwenden…Alex, ich glaube nicht, dass der :empty-Selektor in diesem Fall funktionieren würde. Wählt der :empty-Selektor nicht einfach ein Element ohne Kindelemente aus? In diesem Fall müssen wir den Wert des Eingabefelds prüfen – und nicht, ob es Kindelemente hat.
Eingabefelder werden laut HTML-Spezifikation immer als :empty betrachtet – http://codepen.io/chriscoyier/pen/oiKwD
Der Punkt ist, dass
input-Elemente gemäß der HTML-Spezifikation "leere" Elemente sind (genau wie Bilder), sodass sie niemals Kindknoten haben können.Auch ohne Effekte ist dies ein besserer Ansatz als die Verwendung von Platzhaltern als Labels, da diese völlig unterschiedliche Semantiken haben und nicht als solche verwendet werden sollten.
https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-placeholder
Ja, das war auch mein erster Gedanke.
Jonathan Snook war schneller – http://snook.ca/archives/html_and_css/floated-label-pattern-css
Ich habe ein [ähnliches Beispiel]((http://codepen.io/Wakkos/pen/hCquc), um visuell zu "validieren" (emotionale Validierung =P), aber ich habe ein Problem gefunden: Ich (Wir alle) brauchen einen nicht[:focus]:invalid-input-aber-nicht-leer-Selektor, um schöne Dinge damit zu machen.
Da ich versucht habe, eine Farbe zu geben, wenn der Benutzer ungültigen Text eingibt, aber den Fokus vom Feld nimmt = (
http://codepen.io/Wakkos/pen/hCquc
Das ist großartig!
Es wäre schön, wenn es einen CSS-Selektor gäbe, der die Beziehung zwischen den
input- undlabel-Elementen erkennt. So könnten wir etwas sagen wieinput:focus:label. Dies würde wahrscheinlich noch mehr Kreativität ermöglichen, weil wir daslabelnicht sofort nach deminputim DOM brauchen. Nur ein Gedanke.Pure Genialität. Ich glaube, ich werde das auf einem neuen Webprojekt verwenden, das ich für einen Kunden mache.
Vielen Dank.
Ich habe tatsächlich einen Pen dazu gemacht, nicht lange her!
Es ist immer noch ein gut durchdachtes, geniales Konzept.
Eine Sache, die ich an Matts (dem Original, auf das du dich bezogen hast) mag, ist, dass das Feldlabel immer noch existiert, nachdem man das Feld verlassen hat. Gibt es eine Möglichkeit, das visuelle Label bei dir beizubehalten? Ich mag das Verhalten wirklich. Ich mag auch, dass keine JS beteiligt ist.
Bin ich es oder ist es einfach ZU sexy?
Es ist ein schöner Trick und ich habe versucht, etwas Ähnliches zu tun, indem ich einen z-index zum Eingabefeld hinzugefügt und den fokussierten Zustand des Eingabefelds verwendet habe, damit das Label immer noch zugänglich platziert werden kann. Es ist schade, dass der Trick erfordert, dass alle Felder erforderlich sind, damit er funktioniert.
Was auch schön wäre, ist, hier zusätzliche Validierung einzubauen. So bleibt alles im selben Eingabefeld.
Ja… ich benutze das jetzt, danke.
Was mich hier wirklich begeistert, ist die Verwendung des benachbarten Geschwisterselektors. Ich muss mich jedoch schämen zu sagen, dass ich diesen Selektor überhaupt nicht verwendet habe. Das wird sich ändern.
Auch wenn du noch nichts von ihnen gehört hast, kannst du anhand der Browserkompatibilität – IE7 – erkennen, dass benachbarte Geschwisterselektoren schon eine Weile existieren. Lol. Scherz beiseite, sie sind sehr nützlich! Ich wünsche dir viel Glück! ;)
Für die Labels auf der rechten Seite sorgt ein
padding-rightbeiinput:focusundtextarea:focus, das größer oder gleich der Breite des Labels (40% im Demo) ist, dafür, dass dein Eingabefeld beim Tippen nicht unter das Label rutscht.Der Kompromiss ist, dass sich das Padding nach dem Fokus, aber bevor der Cursor gesetzt wird, ändert, wenn du deinen Cursor manuell durch Klicken setzt. Es ist also etwas unvorhersehbar.
(Auf Codepen: Label Pattern mit nur CSS + padding-right)
Schön, schön und schön!
In einem Wort, „GENIAL“
Hatte Spaß damit. Das komplexe macht mehr Browser kaputt, wie z.B. Opera Presto.
http://codepen.io/Merri/full/boDgs
Hallo, ich bin der Entwickler hinter Nests Version von Float Labels. Ich freue mich, dass es dir gefallen hat! Kurz bevor es in Produktion ging, habe ich darüber gepostet, wie ich es gemacht habe, mit Beispielcode und einer abgespeckten Demo. Ich war auch unzufrieden damit, dass es JavaScript benötigte, und habe an einem ähnlichen rein CSS-basierten Ansatz gearbeitet, der hoffentlich bald auf der Website landen wird. Der Originalbeitrag: http://mozmonkey.com/2013/12/good-ux-for-placeholders-as-field-labels/
Das ist ein sehr cooles Form-Konzept.
Ich werde das definitiv in mein aktuelles Projekt einbauen. Sehr, sehr nett!!
Auch großes Lob an Jeremy Gillick da oben für die Verlinkung zu seinem Originalbeitrag.
Was mir wirklich gefallen hat, ist, wie er auf die Benutzerfreundlichkeit eingeht, wenn die Felder im *fokussierten* Zustand sind. Ist mir überhaupt nicht eingefallen. Gar nicht! Wirklich nett.
Sehr cool!
Schön! Lass mich wissen, wie ich hier Formularvalidierung anzeigen kann?
Ich würde gerne eine Demo dazu sehen. Da der Hauptpunkt dieser Technik die Platzersparnis ist, müsste man wohl kreativ werden, wo man die Fehlermeldungen hinzufügt, sodass sie 1) offensichtlich 2) leicht verständlich und 3) immer noch platzsparend sind.
Gestylte Tooltips wären nicht so schwer.
Die Nest-Formulare zeigen Fehler an, indem sie eine schwebende rote Blase über dem Feld erstellen. Ich habe ein einfaches Beispiel auf Codepen erstellt
http://codepen.io/jgillick/pen/JKwlq?asdfasdf
Schön. Danke.
Ich habe ein Mailchimp-Anmeldeformular mit Validierung hier erstellt: http://mattdsmith.com/float-label-demo/ Danke für den Artikel Chris!
Ich würde dies ein wenig aktualisieren, um Labels standardmäßig anzuzeigen, wenn ein Browser Platzhalter nicht unterstützt (IE 8/9)
Und etwas jQuery-basiertes JavaScript, das in reines JavaScript konvertiert oder zu deinen Modernizr-Tests hinzugefügt werden sollte
$( ‘html’ ).addClass( ‘placeholder’ in document.createElement( ‘input’ ) ? ‘placeholder’ : ‘no-placeholder’ );
Ich würde gerne sehen, wie das Select-Label damit funktioniert. Ich würde erwarten, dass die vertikale Verschiebung vom Pfeil weg und die Rechtsverschiebung den Pfeil abdecken muss.
Chris, du hast es wieder getan.
Es sieht so aus, als müsste ich mein Drupal-Modul aktualisieren, um dieses neueste und beste zu verwenden: Label Trash Modul
Das ist genial. Ich kann es kaum erwarten, es in meinem nächsten Projekt zu verwenden.
Großartig, aber in IE8 und darunter nicht so schön.
Das ist großartig!
Ich habe auch eine Implementierung davon gemacht und die Validierung (Status) durch Hervorhebung des Labels oben hinzugefügt. Mein Konzept ist anders: Das Label ist semantisch für die Eingabe erforderlich.
Schau es dir an und sag mir deine Meinung.
Habe so einen Ansatz schon vor einiger Zeit versucht, er hat Probleme, wenn das Feld nicht leer, aber ungültig ist.
Screen
Man könnte immer noch Platzhalter verwenden, wenn man das Label aus dem Weg bewegen kann. Ich weiß nicht, wie das aussehen würde.
Eine andere Option ist, die Platzhalter zu "verstecken", bis man das Feld fokussiert – http://codepen.io/zaus/pen/gKnhl
Toller Artikel Chris. Hat mich inspiriert, eine Bootstrap-Implementierung und ein Remix von Look and Feel zu erstellen. Schau es dir auf meinem Blog an: http://mattlambert.ca/blog/animate-bootstrap-form-labels-using-css3-transitions/
Vielen Dank! Sehr informativ. Mach weiter so!
Genial. Was für eine großartige Möglichkeit, eine neue Benutzererfahrung für Formulare zu schaffen. Es sind nette Details wie diese, die den Unterschied machen.
Hm.. ich verstehe es nicht.. Der Effekt des Einfliegens von unten kann auch mit reinem CSS erreicht werden. (Keyframe-Animation) … http://codepen.io/pixelass/pen/nujKD
Das ist clever. Aber die Animation lenkt beim Tippen etwas ab. Abgesehen davon ist es eine großartige Möglichkeit, Platz zu sparen und das Formular modern aussehen zu lassen.
Das ist eine ziemlich clevere Idee. Viele Dinge wurden im Laufe der Jahre mit CSS3 und jQuery aufgehübscht, aber Formulare wurden meist ignoriert… wahrscheinlich, weil die meisten Leute es hassen, Formulare zu erstellen :P. Ich mag, wie das Platz spart und Formularen etwas Coolness verleiht. Ich werde es vielleicht für ein aktuelles Projekt implementieren, nur um mein ansonsten langweiliges Kontaktformular aufzupeppen. IE8-Kompatibilität ist ein Problem, aber mit dem \9 CSS-Trick denke ich, dass dieses Konzept machbar ist. Vielleicht erstelle ich bald ein kleines Formular-Framework. Danke.
Wie hast du diese animierten Bilder gemacht, auf denen du zeigst, wie die Formulare funktionieren?
Ich denke, es wäre schlecht für die Benutzerfreundlichkeit, wenn das Label verloren geht, nachdem es Informationen enthält. Daher würde ich auch eine Regel hinzufügen, damit es mit dem
:valid-Zustand desinputsichtbar bleibt.Ich habe ein Problem mit Firefox und IE. Die Labels werden nicht in das Eingabefeld eingerückt, sie sind rechts davon. Sieht in Chrome, Safari und Opera aber großartig aus. Ist das schon jemandem aufgefallen oder bin nur ich das?
Perfekt, wenn sich die Label-Farbe ändert, wenn das Feld gültig ist.
wie hier http://caldev.io/a mit Icon-Status (Asterisk oder Häkchen)
powered by angularjs
Ich habe ein Formular genau wie das letzte Beispiel erstellt.
http://codepen.io/jzilg/full/mujzo
ziemlich erstaunlich
Dynamisch und großartig. Funktioniert gut in Firefox, aber wenn AdSense-Anzeigen kommen, verschwindet es (abhängig von der Anzeigenbreite). Ich wäre dankbarer, wenn du eine Lösung dafür anbieten könntest. Danke im Voraus & warte auf deine Antwort.
Ich frage mich, wie es kommt, dass niemand nicht-Eingabe-UI-Elemente erwähnt hat. Wie wendet man das auf Select-Boxen, Checkboxen, Radio-Buttons, Autocompletes usw. an?
Denn ohne vollständige UI-Unterstützung ist das nur eine Prototyp-Idee. Meiner Meinung nach ist es nicht in Ordnung, Textfelder mit UI-Mustern zu versehen, aber andere Typen nicht.
Das ist schön, aber ich habe dasselbe Problem wie Chris B. oben. Die Labels sind einfach rechts von den Feldern, und beim Fokussieren passiert nichts außer der Änderung der Rahmenfarbe. Dies ist in einer Datei, die nichts anderes enthält als den kopierten Code aus diesem CSS-Tricks-Beispiel für Formular und Stil. Ich habe dann meinen Doctype usw. zu HTML5 geändert, in der Annahme, dass es etwas sein könnte, das von früheren Versionen nicht behandelt wird, aber offenbar ist es das nicht.
Ich würde jeden Rat sehr schätzen. Ich habe bisher nicht viel mit CSS gemacht, außer den Grundlagen (obwohl ich seit Jahren als Hobby programmiere), aber normalerweise funktioniert es, wenn ich das Beispiel von jemandem schlicht verwende und sonst nichts.
Um hinzuzufügen: Jeremy S.s Version setzt einen Platzhalter in das Feld, der beim Fokussieren "verschwindet", aber das Label am unteren Rand des Feldes wird trotzdem nicht angezeigt (in keinem Browser). Seid ihr sicher, dass es keinen erforderlichen Head-Tag oder JavaScript für die Seite gibt, damit dies funktioniert, was ihr vielleicht für selbstverständlich haltet?