JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdn.jsdelivr.net/jquery.validation/1.13.1/jquery.validate.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/css/bootstrap.min.css">
<div class="pre-login">
<form action="login" method="post" id="login">
<div class="form-group">
<input type="email" class="form-control" name="email" id="email" placeholder="Email Address" autofocus="autofocus" required />
</div>
<div class="form-group">
<input type="password" class="form-control" name="pass" id="pass" placeholder="Password" required />
</div>
<button type="submit" class="btn btn-success btn-block">Submit</button>
</form>
</div>
CSS
.pre-login {
width: 350px;
margin: 0 auto;
float: none;
margin-top: 100px;
}
.error-message {
padding: 10px 15px;
margin: 10px 0 8px 0;
border: 1px solid #ebccd1;
border-radius: 4px;
color: #a94442;
background-color: #f2dede;
display: block;
position: relative;
}
JavaScript
$(function () {
$.validator.setDefaults({
highlight: function (element) {
$(element).closest('.form-group').addClass('has-error');
},
unhighlight: function (element) {
$(element).closest('.form-group').removeClass('has-error');
},
errorElement: 'span',
errorClass: 'error-message',
errorPlacement: function (error, element) {
if (element.parent('.input-group').length) {
error.insertAfter(element.parent());
} else {
error.insertAfter(element);
}
}
});
$('#login').validate({
invalidHandler: function(form, validator) {
var errors = validator.numberOfInvalids();
if (errors) {
var firstInvalidElement = $(validator.errorList[0].element);
$('html,body').scrollTop(firstInvalidElement.offset().top);
firstInvalidElement.focus();
}
},
rules: {
email: {
required: true,
email: true
},
pass: {
required: true
}
}
});
});