219

How do I apply a style to an empty input field? If the user types something in the input field, the style should no longer be applied. Is this possible in CSS? I tried this:

input[value=""]
LukasKroess's user avatar
LukasKroess
4111 gold badge4 silver badges16 bronze badges
askedSep 1, 2010 at 10:21
Sjoerd's user avatar

15 Answers15

278

In modern browsers you can use:placeholder-shown to target the empty input (not to be confused with::placeholder).

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

In HTML you must set the placeholder attribute. Chrome browser requires at least a space character as value.

<input type="text" placeholder=" "> <!-- Do not remove placeholder -->
mb21's user avatar
mb21
40.3k8 gold badges130 silver badges158 bronze badges
answeredFeb 24, 2016 at 4:48
Berend's user avatar
Sign up to request clarification or add additional context in comments.

10 Comments

@TricksfortheWeb It does seem to require a placeholder attribute (with a value) to be present in the input tag. Tested in Chrome - not sure if this counts for all browsers.
Placeholder attribute have to be set. Anyway we can set placeholder attribute as whitespace.
Example of it in production usecodepen.io/fossprime/pen/BdWeNr?editors=1100 I used this in production while having graceful degradability... it looks and feels better if supported, but isn't a usability issue if it's not.
@Amanpreet According tocaniuse.com/#search=placeholder, this won't work in IE 11 either (or Edge).
Not supported in Microsoft browsers at all:caniuse.com/#feat=css-placeholder-shown
|
179

If only the field isrequired you could go withinput:valid

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

Seelive on jsFiddle

OR negate using#foo-thing:invalid (credit to @SamGoody)

Utkarsh Dubey's user avatar
Utkarsh Dubey
78412 silver badges33 bronze badges
answeredJun 26, 2012 at 14:37
lukmdo's user avatar

3 Comments

..or negate by using :invalid{}developer.mozilla.org/en-US/docs/Web/CSS/…
I want same thing, but my field is not required. is there any way to do so?
@ZahidulIslamRuhel of course, this answer should not be the top one. see the answer belowstackoverflow.com/a/35593489/11293716
34

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

works with:

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

But the style will not change as soon as someone will start typing (you need JS for that).

T.Todua's user avatar
T.Todua
57.1k22 gold badges261 silver badges266 bronze badges
answeredSep 1, 2010 at 10:30
Draco Ater's user avatar

2 Comments

Not reliable as the value attribute is not changed in DOM after a field edit. However, nice trick if you don't care about this - and works in latest Safari, Chrome, FF and IE...
To match the former, you can useinput[value=""], input:not([value]).
24

Updating the value of a field does not update its value attribute in the DOM so that's why your selector is always matching a field, even when it's not actually empty.

Instead use theinvalid pseudo-class to achieve what you want, like so:

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

answeredNov 30, 2015 at 15:24
Shaggy's user avatar

Comments

13

I realize this is a very old thread, but things have changed a bit since and it did help me find the right combination of things I needed to get my problem fixed. So I thought I'd share what I did.

The problem was I needed to have the same css applied for an optional input if it was filled, as I had for a filled required. The css used the psuedo class :valid which applied the css on the optional input also when not filled.

This is how I fixed it;

HTML

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

CSS

input:required:valid {    ....}input:optional::not(:placeholder-shown){    ....}
answeredNov 15, 2019 at 9:06
jessica's user avatar

2 Comments

What if I need to use it in multiple input fields with actual content in their respective placeholders?
Not entirely sure what you're asking, but if the only difference is that you want to have actual placeholders then just add that text instead of the empty string and it should work the same way (in theory, i haven't tested it)
11

If supporting legacy browsers is not needed, you could use a combination ofrequired,valid, andinvalid.

The good thing about using this is thevalid andinvalid pseudo-elements work well with the type attributes of input fields. For example:

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/>

For reference, JSFiddle here:http://jsfiddle.net/0sf6m46j/

answeredNov 30, 2015 at 15:46
My Stack Overfloweth's user avatar

Comments

9

This worked for me:

For the HTML, add therequired attribute to the input element

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

For the CSS, use the:invalid selector to target the empty input

input.my-input-element:invalid {}

Notes:

  • Aboutrequired fromw3Schools.com:"When present, it specifies that an input field must be filled out before submitting the form."
answeredApr 19, 2016 at 21:29
digiwand's user avatar

Comments

8
$('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. I added a class and styled with css.

.empty { background:none; }
answeredSep 22, 2014 at 16:30
Israel Morales's user avatar

Comments

6

It worked for me to add a class name to the input and then apply CSS rules to that:

<input type="text" name="product" /><style>input[value=""].product {    display: none;}</style>
answeredMar 27, 2020 at 18:02
DeFeNdog's user avatar

Comments

5

This question might have been asked some time ago, but as I recently landed on this topic looking for client-side form validation, and as the:placeholder-shownsupport is getting better, I thought the following might help others.

UsingBerend idea of using this CSS4 pseudo-class, I was able to create a form validation only triggered after the user is finished filling it.

Here is ademo and explanation on CodePen:https://codepen.io/johanmouchet/pen/PKNxKQ

answeredAug 2, 2017 at 9:12
Johan M.'s user avatar

Comments

4

If you're happy not not supporting IE or pre-Chromium Edge (which might be fine if you are using this for progressive enhancement), you can use:placeholder-shown as Berend has said. Note that for Chrome and Safari you actually need a non-empty placeholder for this to work, though a space works.

*, ::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>    <input type="text" placeholder=" ">    <span>Username</span>  </label>  <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>

answeredJan 7, 2020 at 5:22
Sora2455's user avatar

Comments

3

So I was playing around earlier with the new :where and :is clauses and conceived of this bit of fun, and after finding this post with the :invalid and :placeholder-shown bits, thought I might share this possibility for future reference

:required:where( input, textarea ):where( :placeholder-shown, :invalid ) {    border-color: var(--warning);}

which applies the:root { --warning: orange; } color to any required input or textarea, that is either empty or invalid. And that is just downrightsexy

answeredFeb 15, 2022 at 17:14
WebDragon's user avatar

Comments

2

While no browser currently (2021-10-01) supports it, there is a proposal for a:blank pseudo-class.

ref:https://developer.mozilla.org/en-US/docs/Web/CSS/:blank.Do note, this isexperimental, andno browser supports it as of now.

answeredSep 30, 2021 at 23:48
Samarth Ramesh's user avatar

Comments

2

This is how you can make it possible. don't forget to setplaceholder=" " andrequired attr to your inputs. you can change the props as you wish.

body{    display: flex;    justify-content: center;    align-items: center;}.input-gp {    margin-top: 150px;    position: relative;    }.input-gp input {    position: relative;    }.input-gp label{    position: absolute;    left: 5px;    bottom: 5px;    transition: all .4s ease;}.input-gp input:placeholder-shown + label{    left: 10px;    bottom: 5px;}.input-gp input:focus + label,.input-gp input + label{    bottom: 30px;    left: 10px;}
<body> <div><input  type="email" name="" placeholder=" "       required>   <label for="email"> Email</label>  </div>   </body>

answeredAug 27, 2022 at 21:24
Sam's user avatar

Comments

-1

I'm wondered by answers we have clear attribute to get empty input boxes, take a look at this code

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

UPDATE

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

More over for having a great look in the validation

 input, select, textarea {    &[aria-invalid="true"] {        border-color: amber !important;    }    &[aria-invalid="false"], &.valid {        border-color: green !important;    }}
answeredApr 27, 2015 at 9:37
Nasser Hadjloo's user avatar

8 Comments

:empty applies only to elements that have no children. Inputs can't have child nodes at all so your input will be always with red border. Also seethis comment
@NasserHadjloo have you tested this? Changing thevalue doesn't change the number of child nodes.
@jcuenod what do you mean by number of child nodes? I didn't get your point
In xml structures, nodes are nested (i.e.<parent><child></child></parent>). You just have<input></input> and as you type what's changing is not a<value> node inside<input> but a valueattribute:<input value='stuff you type'></input>
But that's not what the OP is trying to achieve.
|

Your Answer

Sign up orlog in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

By clicking “Post Your Answer”, you agree to ourterms of service and acknowledge you have read ourprivacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.