Abgleichen eines leeren Eingabefelds mit CSS

141

Wie wende ich einen Stil auf ein leeres Eingabefeld an? Wenn der Benutzer etwas in das Eingabefeld eingibt, sollte der Stil nicht mehr angewendet werden. Ist das in CSS möglich? Ich habe es versucht:

input[value=""]
Sjoerd
quelle

Antworten:

159

Wenn nur das Feld ist required, könnten Sie mit geheninput:valid

#foo-thing:valid + .msg { visibility: visible!important; }      
 <input type="text" id="foo-thing" required="required">
 <span class="msg" style="visibility: hidden;">Yay not empty</span>

Sehen Sie live auf jsFiddle

ODER negieren mit #foo-thing:invalid(Gutschrift an @SamGoody)

lukmdo
quelle
14
..oder negieren mit: invalid {} developer.mozilla.org/en-US/docs/Web/CSS/…
SamGoody
6
Ich möchte dasselbe, aber mein Feld ist nicht erforderlich. Gibt es eine Möglichkeit, dies zu tun?
Zahidul Islam Ruhel
1
Das ist genial :)
kriskodzi
@ZahidulIslamRuhel natürlich sollte diese Antwort nicht die oberste sein. Siehe die Antwort unten stackoverflow.com/a/35593489/11293716
sijanec
149

In modernen Browsern können Sie :placeholder-showndie leere Eingabe als Ziel festlegen (nicht zu verwechseln ::placeholder).

input:placeholder-shown {
    border: 1px solid red; /* Red border only if the input is empty */
}

Weitere Informationen und Browserunterstützung: https://css-tricks.com/almanac/selectors/p/placeholder-shown/

Berend
quelle
4
Das ist großartig! Sehr hilfreich :)
Unbreak
1
@TricksfortheWeb Es scheint erforderlich zu sein, dass ein Platzhalterattribut (mit einem Wert) im Eingabe-Tag vorhanden ist. In Chrome getestet - nicht sicher, ob dies für alle Browser gilt.
Berend
9
Platzhalterattribut muss gesetzt werden. Auf jeden Fall können wir das Platzhalterattribut als Leerzeichen festlegen.
Barcelonczyk
2
@Amanpreet Laut caniuse.com/#search=placeholder funktioniert dies auch in IE 11 (oder Edge) nicht.
Tim Malone
4
Wird
Lounge9
44

In CSS gibt es keinen Selektor, der dies tut. Attributselektoren stimmen mit Attributwerten überein, nicht mit berechneten Werten.

Sie müssten JavaScript verwenden.

QUentin
quelle
3
Für alle, die diese Antwort später finden: Quentin hat Recht mit berechneten Werten, es gibt jedoch den leeren Selektor, der hier verwendet werden kann und angemessene Unterstützung bietet (alle Browser außer IE8 und älter gemäß: w3schools.com/cssref/sel_empty.asp
Cohen
35
:emptySelektor nur Arbeit zu leeren Elementen, dh nur auf Elemente , die das Öffnen und Schließen - Tag haben , die zwischendurch , und einzelnen Tag Elemente leer ist , die immer als leer, beispielsweise , so dass es nicht auf Eingabeelemente außer verwendet werden kanntextarea
am05mhz
7
Nicht wahr. Siehe Lukmos Antwort unten. Durch die Kombination des erforderlichen Attributs und der: gültigen oder: ungültigen Pseudoselektoren wird genau dies erreicht.
Voidstate
2
Dies war die richtige Antwort zum Zeitpunkt der Frage. Das erforderliche Attribut war nur in Chrome und Firefox im Jahr 2011 verfügbar. Diese Antwort stammt aus dem Jahr 2010. Die Zeiten haben sich jedoch geändert und dies ist nicht mehr die "beste" Antwort. Daher habe ich sie als akzeptiert markiert.
Sjoerd
18

Durch das Aktualisieren des Werts eines Felds wird das Wertattribut im DOM nicht aktualisiert. Daher stimmt Ihr Selektor immer mit einem Feld überein, auch wenn es nicht wirklich leer ist.

Verwenden Sie stattdessen die invalidPseudoklasse , um das zu erreichen, was Sie wollen:

input:required {
  border: 1px solid green;
}
input:required:invalid {
  border: 1px solid red;
}
<input required type="text" value="">

<input required type="text" value="Value">

Zottelig
quelle
15

input[value=""], input:not([value])

arbeitet mit:

<input type="text" />
<input type="text" value="" />

Der Stil ändert sich jedoch nicht, sobald jemand mit der Eingabe beginnt (dafür benötigen Sie JS).

Draco Ater
quelle
1
Nicht zuverlässig, da das Wertattribut nach einer Feldbearbeitung im DOM nicht geändert wird. Allerdings ein schöner Trick, wenn Sie sich nicht darum kümmern - und funktioniert in den neuesten Versionen von Safari, Chrome, FF und IE ...
Dunc
9
Um dem ersteren zu entsprechen, können Sie verwenden input[value=""], input:not([value]).
Schism
10

Wenn unterstützt ältere Browser nicht benötigt wird, können Sie eine Kombination aus verwenden required, validund invalid.

Die gute Sache über diese Verwendung ist validund invalidPseudoelemente arbeiten gut mit den Typeigenschaften Eingabefelder ein . Beispielsweise:

input:invalid, textarea:invalid { 
    box-shadow: 0 0 5px #d45252;
    border-color: #b03535
}

input:valid, textarea:valid {
    box-shadow: 0 0 5px #5cd053;
    border-color: #28921f;
}
<input type="email" name="email" placeholder="[email protected]" required />
<input type="url" name="website" placeholder="http://johndoe.com"/>
<input type="text" name="name" placeholder="John Doe" required/>

Als Referenz JSFiddle hier: http://jsfiddle.net/0sf6m46j/

Mein Stapel läuft über
quelle
7
$('input#edit-keys-1').blur(function(){
    tmpval = $(this).val();
    if(tmpval == '') {
        $(this).addClass('empty');
        $(this).removeClass('not-empty');
    } else {
        $(this).addClass('not-empty');
        $(this).removeClass('empty');
    }
});

in jQuery. Ich habe eine Klasse hinzugefügt und mit CSS gestylt.

.empty { background:none; }
Israel Morales
quelle
6

Das hat bei mir funktioniert:

Fügen Sie für den HTML-Code das requiredAttribut zum Eingabeelement hinzu

<input class="my-input-element" type="text" placeholder="" required />

Verwenden Sie für das CSS den :invalidSelektor, um auf die leere Eingabe zu zielen

input.my-input-element:invalid {

}

Anmerkungen:

  • Info requiredvon w3Schools.com : "Wenn vorhanden, wird angegeben, dass vor dem Absenden des Formulars ein Eingabefeld ausgefüllt werden muss."
Ariella
quelle
2

Diese Frage wurde vielleicht vor einiger Zeit gestellt, aber als ich kürzlich auf der Suche nach einer clientseitigen Formularvalidierung auf dieses Thema gestoßen bin und der :placeholder-shown Support immer besser wird, dachte ich, dass das Folgende anderen helfen könnte.

Mit der Idee von Berend , diese CSS4-Pseudoklasse zu verwenden, konnte ich eine Formularvalidierung erstellen, die erst ausgelöst wurde, nachdem der Benutzer das Ausfüllen abgeschlossen hatte.

Hier finden Sie Ademo und Erklärungen zu CodePen: https://codepen.io/johanmouchet/pen/PKNxKQ

Johan M.
quelle
1

Wenn Sie glücklich sind, IE oder Pre-Chromium Edge nicht zu unterstützen (was in Ordnung sein kann, wenn Sie dies für die progressive Verbesserung verwenden), können Sie es verwenden, :placeholder-shownwie Berend gesagt hat. Beachten Sie, dass Sie für Chrome und Safari tatsächlich einen nicht leeren Platzhalter benötigen, damit dies funktioniert, obwohl ein Leerzeichen funktioniert.

*,
 ::after,
 ::before {
  box-sizing: border-box;
}

label.floating-label {
  display: block;
  position: relative;
  height: 2.2em;
  margin-bottom: 1em;
}

label.floating-label input {
  font-size: 1em;
  height: 2.2em;
  padding-top: 0.7em;
  line-height: 1.5;
  color: #495057;
  background-color: #fff;
  background-clip: padding-box;
  border: 1px solid #ced4da;
  border-radius: 0.25rem;
  transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
}

label.floating-label input:focus {
  color: #495057;
  background-color: #fff;
  border-color: #80bdff;
  outline: 0;
  box-shadow: 0 0 0 0.2rem rgba(0, 123, 255, 0.25);
}

label.floating-label input+span {
  position: absolute;
  top: 0em;
  left: 0;
  display: block;
  width: 100%;
  font-size: 0.66em;
  line-height: 1.5;
  color: #495057;
  border: 1px solid transparent;
  border-radius: 0.25rem;
  transition: font-size 0.1s ease-in-out, top 0.1s ease-in-out;
}

label.floating-label input:placeholder-shown {
  padding-top: 0;
  font-size: 1em;
}

label.floating-label input:placeholder-shown+span {
  top: 0.3em;
  font-size: 1em;
}
<fieldset>
  <legend>
    Floating labels example (no-JS)
  </legend>
  <label class="floating-label">
    <input type="text" placeholder=" ">
    <span>Username</span>
  </label>
  <label class="floating-label">
    <input type="Password" placeholder=" ">
    <span>Password</span>
  </label>
</fieldset>
<p>
  Inspired by Bootstrap's <a href="https://getbootstrap.com/docs/4.0/examples/floating-labels/">floating labels</a>.
</p>

Sora2455
quelle
1

Es hat bei mir funktioniert, der Eingabe einen Klassennamen hinzuzufügen und dann CSS-Regeln darauf anzuwenden:

<input type="text" name="product" class="product" />

<style>
input[value=""].product {
    display: none;
}
</style>
DeFeNdog
quelle
0

Ich frage mich, welche Antworten wir haben, um leere Eingabefelder zu erhalten. Schauen Sie sich diesen Code an

/*empty input*/
input:empty{
    border-color: red;
}
/*input with value*/
input:not(:empty){
    border-color: black;
}

AKTUALISIEREN

input, select, textarea {
    border-color: @green;
    &:empty {
        border-color: @red;
    }
}

Mehr dazu für einen guten Blick in die Validierung

 input, select, textarea {
    &[aria-invalid="true"] {
        border-color: amber !important;
    }

    &[aria-invalid="false"], &.valid {
        border-color: green !important;
    }
}
Nasser Hadjloo
quelle
7
:emptygilt nur für Elemente, die keine Kinder haben. Eingaben können überhaupt keine untergeordneten Knoten haben, daher wird Ihre Eingabe immer mit einem roten Rand versehen. Siehe auch diesen Kommentar
Zhegan
2
@NasserHadjloo hast du das getestet? Durch Ändern von valuewird die Anzahl der untergeordneten Knoten nicht geändert.
Jcuenod
@jcuenod was meinst du mit Anzahl der untergeordneten Knoten? Ich habe Ihren Standpunkt nicht verstanden
Nasser Hadjloo
In XML-Strukturen sind Knoten verschachtelt (dh <parent><child></child></parent>). Sie haben gerade <input></input>und wie Sie schreiben , was zu ändern ist kein <value>Knoten innerhalb , <input>sondern ein Wert Attribut :<input value='stuff you type'></input>
jcuenod
2
Aber das ist nicht das, was das OP erreichen will.
Jcuenod
0

Mir ist klar, dass dies ein sehr alter Thread ist, aber die Dinge haben sich seitdem ein wenig geändert und es hat mir geholfen, die richtige Kombination von Dingen zu finden, die ich brauchte, um mein Problem zu beheben. Also dachte ich, ich würde teilen, was ich getan habe.

Das Problem war, dass ich für eine optionale Eingabe das gleiche CSS anwenden musste, wenn es gefüllt war, wie für eine gefüllte Eingabe. Das CSS verwendete die Pseudo-Klasse: valid, die das CSS auch dann auf die optionale Eingabe anwendete, wenn es nicht gefüllt war.

So habe ich es behoben;

HTML

<input type="text" required="required">
<input type="text" placeholder="">

CSS

input:required:valid {
    ....
}
input:optional::not(:placeholder-shown){
    ....
}
jessica
quelle