HTML5 Tutorial: Login Page with HTML5 Forms

HTML5 brings many features and improvements to web forms, there are new attributes and input types that were introduced mainly to make the lives of web developers easier and provide better experience to web users.

So, in this post we are going to create a login page using HTML5 forms to see how the new added features work.

HTML5 Input

Let’s take a look at the following markup.

<section class="loginform cf">
  <form name="login" action="index_submit" method="get" accept-charset="utf-8">
        <label for="usermail">Email</label>
        <input type="email" name="usermail" placeholder="" required>
        <label for="password">Password</label>
        <input type="password" name="password" placeholder="password" required>
        <input type="submit" value="Login">

If you have been working with HTML forms before, this will look familiar. But, you’ll also notice differences there. The inputs have placeholder and required attributes, which are new attributes in HTML5.


The placeholder attribute allows us to give initial text in the input that will disappear when it is in a focus state or being filled in. Previously, we used to do it with JavaScript, but now it becomes a lot easier with this new attribute.

Required Attribute

The required attribute will set the field to be mandatory and thus should not be left blank before the form is submitted, so when the user hasn’t filled in the field, the following error will appear.

New selector is also introduced in CSS3, :required to target fields with required attribute. Here is an example;

 input:required {
 border: 1px solid red;

Email Input Type

The first input type is email which is actually a new field type added in HTML5 as well. The email type will give basic email address validation in the field. When the user doesn’t fill the field with an email address, the browser will show the following notification;

Using email input types can also give better experience for mobile users, like iPhone and Android users, where it will show the email-optimized on-screen keyboard with a dedicated “@” button to help type email address faster.

The Downsides

The new form features offered in HTML5 are powerful and easy to implement, but they are still lack in some areas. For instance;

The placeholder attribute, is only supported in modern browsers — Firefox 3.7+, Safari 4+, Chrome 4+ and Opera 11+. So, should you need it to work in unsupported browsers, you can use this polyfills in conjunction with Modernizr.

The same thing goes with the required attribute. The error notification cannot be personalized, the error will remain “Please fill out this field” rather than “Please fill out your First Name”, this attribute support is also limited to the latest browsers.

So, using JavaScript to validate the required field is (so far) a better option.

function validateForm() {
  var x = document.forms["login"]["username"].value;
  if (x == null || x == "") {
    alert("Please fill out the username");
    return false;

Styling the Forms

Alright, now let’s decorate our login form with CSS. First we will give the background a wood pattern in the html tag.

html {
  background: url('wood_pattern.png');
  font-size: 10pt;

Then, we need to remove the default padding and margin in ul tag that wraps the entire inputs and floats the li to the left, so the inputs will be displayed horizontally, side by side.

.loginform ul {
  padding: 0;
  margin: 0;

.loginform li {
  display: inline;
  float: left;

Since we float the li, the parents will collapse, so we need to clear things around the parent with the clearfix hack.

label {
  display: block;
  color: #999;

.cf:after {
  content: "";
  display: table;

.cf:after {
  clear: both;

.cf {
  *zoom: 1;

:focus {
  outline: 0;

In CSS3 we have the negation selector. So, we will use it to target inputs other than the submit type, which in this case will target the email and password input;

.loginform input:not([type=submit]) {
  padding: 5px;
  margin-right: 10px;
  border: 1px solid rgba(0, 0, 0, 0.3);
  border-radius: 3px;
  box-shadow: inset 0px 1px 3px 0px rgba(0, 0, 0, 0.1), 0px 1px 0px 0px rgba(250, 250, 250, 0.5);

Lastly, we will give a little style decoration for the Submit button, as follows.

.loginform input[type=submit] {
  border: 1px solid rgba(0, 0, 0, 0.3);
  background: #64c8ef;
  /* Old browsers */
  background: -moz-linear-gradient(top, #64c8ef 0%, #00a2e2 100%);
  /* FF3.6+ */
  background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #64c8ef), color-stop(100%, #00a2e2));
  /* Chrome,Safari4+ */
  background: -webkit-linear-gradient(top, #64c8ef 0%, #00a2e2 100%);
  /* Chrome10+,Safari5.1+ */
  background: -o-linear-gradient(top, #64c8ef 0%, #00a2e2 100%);
  /* Opera 11.10+ */
  background: -ms-linear-gradient(top, #64c8ef 0%, #00a2e2 100%);
  /* IE10+ */
  background: linear-gradient(to bottom, #64c8ef 0%, #00a2e2 100%);
  /* W3C */
  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#64c8ef', endColorstr='#00a2e2', GradientType=0);
  /* IE6-9 */
  color: #fff;
  padding: 5px 15px;
  margin-right: 0;
  margin-top: 15px;
  border-radius: 3px;
  text-shadow: 1px 1px 0px rgba(0, 0, 0, 0.3);

That’s it, now you can try the login form from the following links.

Final Words

In this tutorial we looked into a few new features in HTML5 forms:placeholder, required and email input types to create a simple login page. We have also come through the downsides of the attributes, so we can decide a better approach to be applied.

In the next post we will look into another new HTML5 form features, so stay tuned.