:valid, :invalid, and :required CSS Pseudo Classes

By  on  

Let's be honest, form validation with JavaScript can be a real bitch.  On a real basic level, however, it's not that bad.  HTML5 has jumped in to some extent, providing a few attributes to allow us to mark fields as required or only valid if matching a given regular expression.  What some people don't know is that you can style elements base on their required, valid, or invalid values.  Here's how!

The CSS

Each state is colon-separated from the element it's associated with:

/* basics */
input:required {
	border: 1px solid blue;
}
input:valid {
	border: 1px solid green;
}
input:invalid {
	border: 1px solid red;
}

These pseudo classes are straight forward and useful. Here we're changing only borders, but you could use :before and :after to place text or an image next to each field, representing their state.

Being able to style elements based on invalid or valid information is something we've shimmed forever with JavaScript, but now we can do so (to some degree) with pure CSS!

Recent Features

  • By
    Creating Scrolling Parallax Effects with CSS

    Introduction For quite a long time now websites with the so called "parallax" effect have been really popular. In case you have not heard of this effect, it basically includes different layers of images that are moving in different directions or with different speed. This leads to a...

  • By
    Page Visibility API

    One event that's always been lacking within the document is a signal for when the user is looking at a given tab, or another tab. When does the user switch off our site to look at something else? When do they come back?

Incredible Demos

  • By
    Link Nudging with CSS3 Animations

    One of the more popular and simple effects I've featured on this blog over the past year has been linking nudging.  I've created this effect with three flavors of JavaScript:  MooTools, jQuery, and even the Dojo Toolkit.  Luckily CSS3 (almost) allows us to ditch...

  • By
    dat.gui:  Exceptional JavaScript Interface Controller

    We all love trusted JavaScript frameworks like MooTools, jQuery, and Dojo, but there's a big push toward using focused micro-frameworks for smaller purposes. Of course, there are positives and negatives to using them.  Positives include smaller JS footprint (especially good for mobile) and less cruft, negatives...

Discussion

  1. A small note: :before and :after only works with elements that have content. inputs doesn’t, so these pseudo-elements won’t work.

  2. Amazing post, so in your example you are testing it with input text and email address is that all ?!

  3. “now we can do so (to some degree) with pure CSS!”

    could you please go into more detail about that degree? Browser support? Is this CSS3 only?

  4. @Sumit – I can’t find any references on caniuse.com or anything similar. From my testing it works on: latest Chrome, latest Firefox, lateset Safari and IE10+. It doesn’t work on IE9 or below.

  5. The :before and :after pseudo-elements elements interact with other boxes… as if they were real elements inserted just inside their associated element. More… http://www.corelangs.com/css/basics/pseudo.html CSS pseudo-elements

    Eric

  6. Diego Leme

    Bug in IE usign pseudo-elements
    http://codepen.io/diegoleme/pen/cJyjF

  7. A pseudo-class is similar to a class in HTML, but it’s not specified explicitly in the markup. Some pseudo-classes are dynamic — they’re applied as a result of user interaction with the document.
    for full implementation of pseudo class to refer here:
    http://www.mindstick.com/blog/711/CSS%20Pseudo%20Class

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!