DEV Community

Cover image for Form input validation WITHOUT JavaScript
JoelBonetR πŸ₯‡
JoelBonetR πŸ₯‡

Posted on • Updated on

Form input validation WITHOUT JavaScript

I promised it and here it is,


Quick Explanation

We need 2 things here:

  1. The pattern html attribute
  2. Some CSS pseudos like :valid and :invalid


The pattern attribute allows us to specify a regular expression that the inputted value must match in order to be considered valid.

!important: You must avoid using the pattern attribute on fields that have a validation by default like <input type="email"> as the browser will validate the input according to the RFC5322 and cast to :valid or :invalid consequently) on its own.

:valid, :invalid

When used in an input, CSS considers it :valid when the regex set in the pattern attribute matches the user input on it. Otherwise it's considered :invalid.

Basic Usage


  <label for="choose">Would you prefer tea or coffee?</label>
  <input id="choose" name="i_like" required pattern="[Tt]ea|[Cc]offee">
Enter fullscreen mode Exit fullscreen mode


input:valid { color: green }
input:invalid { color: red }
Enter fullscreen mode Exit fullscreen mode

In this example, because the pattern regex [Tt]ea|[Cc]offee only those 4 words will be valid:

  • Tea
  • tea
  • Coffee
  • coffee

If you type any of those, the color will change to "green" on the other hand if you type anything else, it will be "red" and any attempts to submit the form will lead to a browser message.


If you try to submit (thats why I left that button in the codepen) while any input in the form is not valid, it will show you a message in YOUR language. Without the need of i18n or anything else, the browser will handle that for you.

I feel this a nice approach for UX; whenever you need to give a quick feedback to the user.

You can design it your way and extend your creativity adding other CSS pseudos like:

And last but not least, you can also edit the label or another element by using the adjacent sibling selector +, which is the reason I've set the label after the input in my first codepen, check the CSS! 😁

Also bookmark this for reference whenever you need it:

Till the next one!


Top comments (8)

j3ffjessie profile image

Please be advised that use of the #discuss tag doesn’t fit this post. This post isn’t for discussion but more of a follow up post to a previous post. Please only use #discuss tag for posts where discussion is imperative to the posts content.

joelbonetr profile image
JoelBonetR πŸ₯‡ • Edited

Agree, my bad
I planned to set a question for those awesome UX engineers around here to discuss about that but maybe a new post with proper questions around the topic will suit better, thank you for pointing it out! 😁

sem1colons profile image
Youssef Abdulaziz

But is it usable in real product ? I mean I could just inspect it , change the pattern to whatever and submit my arbitrary input right?

joelbonetr profile image
JoelBonetR πŸ₯‡ • Edited

Yes sure!
The same way you can disable JS in your browser, send a request using Postman directly to the endpoint or anything else.

Client code is loaded and running inside third party machines, hence you can't rely in frontend validations in any app. You'll need to re-validate the whole in backend anyway.

Validations in the frontend have 2 purposes:

  1. Give feedback to the user as soon as possible.
  2. Avoid requests to your server if the data that the user is about to send is not valid.

So yes, it's usable in a real product. If you do that and submit wrong data, the backend will throw an error about that and we should be good πŸ˜‚

sem1colons profile image
Youssef Abdulaziz

Wow, listening to experience is far more useful than to my rookie mind πŸ˜‚πŸ˜‚πŸ˜‚...thanks very much.

Thread Thread
joelbonetr profile image
JoelBonetR πŸ₯‡

πŸ˜‚ No problem, we all have to walk -almost- the same road! 😁

bwca profile image
Volodymyr Yepishev

That's actually amazing :)

joelbonetr profile image
JoelBonetR πŸ₯‡

Thank you! 😁