Advertisement
  1. Web Design
  2. UX/UI
  3. Forms

Pon al día tus formularios con validación de CSS3 y HTML5

Scroll to top
Read Time: 16 min

() translation by (you can also view the original English article)

Veamos como crear formularios que validan la información del usuario en el lado del cliente. Una vez hecho, veremos como embellecerlo usando CSS. ¡Incluyendo un poco de CSS3!

Paso 1: Conceptualización y Funcionalidad

Primero debemos conceptualizar como se verá y funcionará nuestro formulario. Por ejemplo, crearemos un simple formulario de contacto que pregunte por la siguiente información del usuario:

  • Nombre
  • Correo Electrónico
  • Sitio Web
  • Mensaje

Queremos estar seguros que el usuario ingrese la información correcta. Para conseguir esto usaremos las nuevas técnicas de validación en el lado del cliente de HTML5. ¿Qué hay sobre los usuarios que no tengan capacidades de HTML5? Podemos simplemente usar validación en el lado del servidor, pero eso va mas allá del ámbito de este artículo.

Paso 2: Conceptualizacion del Formulario

Hagamos una idea de como queremos que se vea nuestro formulario creando un bosquejo rápido.

Como pueden ver, nuestro formulario esta hecho de las siguientes partes:

  • Encabezado del formulario Notificación de los campos requeridos
  • Nombres de Campos de texto
  • Campos de texto Texto de Referencia (Placeholder Text)
  • Instrucciones de campos (Form Field Hints)
  • Botón de envío

Ahora que hemos especificado de que elementos esta hecho nuestro formulario, podemos crear el HTML.

Paso 3: Código Inicial HTML

Crearemos nuestro básico marcado HTML del bosquejo creado.

1
<!DOCTYPE html>
2
<html>
3
<head>
4
	<meta charset="utf-8">
5
	<title>HTML5 Contact Form</title>
6
	<link rel="stylesheet" media="screen" href="styles.css" >
7
</head>
8
<body>
9
</body>
10
</html>

Hasta este punto, nuestro archivo HTML aparecerá en blanco en el buscador. Este es simplemente código para comenzar una página con HTML5.

Paso 4: Formulario HTML

Crearemos el código HTML del formulario (dejaremos el método action en blanco por ahora, ya que validación en el servidor no sera cubierta en este tutorial):

1
<form class="contact_form" action="" method="post" name="contact_form">
2
</form>

Paso 5: Elementos del formulario HTML

Para mantener el contenido de nuestro formulario organizado, mantendremos los elementos (label, input, etc) en una lista. Comenzaremos creando el encabezado del formulario y nuestro primer campo de entrada:

1
<ul>
2
    <li>
3
         <h2>Contact Us</h2>
4
         <span class="required_notification">* Denotes Required Field</span>
5
    </li>
6
    <li>
7
        <label for="name">Name:</label>
8
        <input type="text" name="name" />
9
    </li>
10
</ul>

Instrucciones de campos

Como visto en nuestro bosquejo, tendremos instrucciones de formato para los campos de "Correo" y "Sitio Web". Entonces agregaremos las instrucciones bajo el campo de entrada (input) cuando sea necesario, y le daremos una clase para poder estilizarlos después.

1
<li>
2
	<label for="email">Email:</label>
3
	<input type="text" name="email" />
4
	<span class="form_hint">Proper format "name@something.com"</span>
5
</li>

El resto de Elementos Input

Crearemos el resto de elementos, recordando envolver cada uno en un elemento de lista (li).

1
<li>
2
	<label for="website">Website:</label>
3
	<input type="text" name="website" />
4
	<span class="form_hint">Proper format "https://someaddress.com"</span>
5
</li>
6
<li>
7
	<label for="message">Message:</label>
8
	<textarea name="message" cols="40" rows="6" >
9
</li>
10
<li>
11
	<button class="submit" type="submit">Submit Form</button>
12
</li>

Paso 6: Agregando el Texto de Referencia

Una de las primeras mejoras que HTML5 nos trae a formularios (una con la cual probablemente ya se ha familiarizado) es la habilidad para crear textos de referencia (placeholder text). El texto de referencia es mostrado cuando el campo de entrada esta vacío o desenfocado.

Agreguemos el atributo placeholder a nuestros elementos input. Estos ayudaran a nuestros usuarios a entender que es lo que deben escribir en cada campo.

1
<input type="text" name="name" placeholder="John Doe" />
2
<input type="text" name="email" placeholder="john_doe@example.com" />
3
<input type="text" name="website" placeholder="http://johndoe.com/" required/>

Consejo Rápido: Estiliza tu texto de placeholder

Si deseas estilizar tu texto de referencia, hay algunos prefijos de buscadores que te ayudarán a hacerlo:

1
:-moz-placeholder {
2
	color: blue;
3
}
4
5
::-webkit-input-placeholder {
6
	color: blue;
7
}

El soporte para el atributo placeholder esta bien establecido en buscadores modernos (excepto por IE9, lastimosamente). Si de verdad necesitas tenerlo en todos los buscadores, hay algunas soluciones a través de javascript las cuales te pueden ayudar.

Paso 7: CSS Básico

Agreguemos un poco de CSS para darle un poco de estructura a nuestro formulario. Les mostraré las reglas:

Remover Estilo de :focus

Webkit automáticamente agrega algunos estilos a los campos de entrada cuando son enfocados. Ya que agregaremos los nuestros, queremos primero remover estos de defecto:

1
*:focus {outline: none;}

Estilos Tipográficos

Agreguemos algunos estilos tipográficos a los elementos:

1
body {font: 14px/21px "Lucida Sans", "Lucida Grande", "Lucida Sans Unicode", sans-serif;}
2
.contact_form h2, .contact_form label {font-family:Georgia, Times, "Times New Roman", serif;}
3
.form_hint, .required_notification {font-size: 11px;}

Estilos de lista

Agregaremos estilos a los elementos de lista para crear un poco de estructura:

1
.contact_form ul {
2
    width:750px;
3
    list-style-type:none;
4
	list-style-position:outside;
5
	margin:0px;
6
	padding:0px;
7
}
8
.contact_form li{
9
	padding:12px; 
10
	border-bottom:1px solid #eee;
11
	position:relative;
12
}

También agregaremos un fino borde en la parte superior e inferior del formulario. Podemos lograr esto usando los selectores :first-child y :last-child. Estos seleccionan, como el nombre lo indica, el primer y ultimo elemento en la lista <ul>.

Esto agrega un muy útil seccionamiento visual a nuestro formulario. Mantenga en mente que estos selectores CSS no son soportados en buscadores antiguos. Ya que no es vital para el funcionamiento del formulario, solo estamos premiando a aquellos usuarios que usan buscadores modernos.

1
.contact_form li:first-child, .contact_form li:last-child {
2
	border-bottom:1px solid #777;
3
}

Encabezado

Estilizaremos la sección de encabezado de nuestro formulario. Estos incluye la etiqueta del encabezado y la notificación que informa usuarios que el asterisco (*) indica campos requeridos.

1
.contact_form h2 {
2
	margin:0;
3
	display: inline;
4
}
5
.required_notification {
6
	color:#d45252; 
7
	margin:5px 0 0 0; 
8
	display:inline;
9
	float:right;
10
}

Elementos de Entrada de Texto

Estilizaremos los elementos principales de nuestro formulario, los que serán usados para colectar la información del usuario.

1
.contact_form label {
2
	width:150px;
3
	margin-top: 3px;
4
	display:inline-block;
5
	float:left;
6
	padding:3px;
7
}
8
.contact_form input {
9
	height:20px; 
10
	width:220px; 
11
	padding:5px 8px;
12
}
13
.contact_form textarea {padding:8px; width:300px;}
14
.contact_form button {margin-left:156px;}

Ahora, agregaremos algunos estilos visuales adicionales. Algunos de estos son estilos CSS3 que solo serán premios para los usuarios que usen buscadores modernos.

1
.contact_form input, .contact_form textarea { 
2
	border:1px solid #aaa;
3
	box-shadow: 0px 0px 3px #ccc, 0 10px 15px #eee inset;
4
	border-radius:2px;
5
}
6
.contact_form input:focus, .contact_form textarea:focus {
7
	background: #fff; 
8
	border:1px solid #555; 
9
	box-shadow: 0 0 3px #aaa; 
10
}
11
/* Button Style */
12
button.submit {
13
	background-color: #68b12f;
14
	background: -webkit-gradient(linear, left top, left bottom, from(#68b12f), to(#50911e));
15
	background: -webkit-linear-gradient(top, #68b12f, #50911e);
16
	background: -moz-linear-gradient(top, #68b12f, #50911e);
17
	background: -ms-linear-gradient(top, #68b12f, #50911e);
18
	background: -o-linear-gradient(top, #68b12f, #50911e);
19
	background: linear-gradient(top, #68b12f, #50911e);
20
	border: 1px solid #509111;
21
	border-bottom: 1px solid #5b992b;
22
	border-radius: 3px;
23
	-webkit-border-radius: 3px;
24
	-moz-border-radius: 3px;
25
	-ms-border-radius: 3px;
26
	-o-border-radius: 3px;
27
	box-shadow: inset 0 1px 0 0 #9fd574;
28
	-webkit-box-shadow: 0 1px 0 0 #9fd574 inset ;
29
	-moz-box-shadow: 0 1px 0 0 #9fd574 inset;
30
	-ms-box-shadow: 0 1px 0 0 #9fd574 inset;
31
	-o-box-shadow: 0 1px 0 0 #9fd574 inset;
32
	color: white;
33
	font-weight: bold;
34
	padding: 6px 20px;
35
	text-align: center;
36
	text-shadow: 0 -1px 0 #396715;
37
}
38
button.submit:hover {
39
	opacity:.85;
40
	cursor: pointer; 
41
}
42
button.submit:active {
43
	border: 1px solid #20911e;
44
	box-shadow: 0 0 10px 5px #356b0b inset; 
45
	-webkit-box-shadow:0 0 10px 5px #356b0b inset ;
46
	-moz-box-shadow: 0 0 10px 5px #356b0b inset;
47
	-ms-box-shadow: 0 0 10px 5px #356b0b inset;
48
	-o-box-shadow: 0 0 10px 5px #356b0b inset;
49
	
50
}

Paso 8: Agreguemos un Poco de Interactividad con CSS3

Agreguemos un poco de interactividad. Haremos que los campos que están seleccionados se expandan un poco a través de un poco de relleno (padding).

1
.contact_form input:focus, .contact_form textarea:focus { /* add this to the already existing style */
2
	padding-right:70px;
3
}

Ahora, para los buscadores que lo soportan, haremos que la expansión del campo tenga una transición fluida usando CSS3.

1
.contact_form input, .contact_form textarea { /* add this to the already existing style */
2
	-moz-transition: padding .25s; 
3
	-webkit-transition: padding .25s; 
4
	-o-transition: padding .25s;
5
	transition: padding .25s;
6
}

Paso 9: El Atributo required en HTML5

Llego la hora que todos hemos estado esperando: herramientas para el manejo de formularios de HTML5.

Agregando el atributo required a cualquier campo de entrada de texto, le estaremos diciendo al buscador que su valor es requerido antes de que el formulario pueda ser enviado. Entonces, un formulario no podrá ser enviado si un campo marcado con required no ha sido llenado.

Entonces, agreguemos el atributo required a todos los elementos de nuestro formulario (por que queremos que todos sean completados).

1
<input type="text" name="name" required />
2
<input type="text" name="email" required />
3
<input type="text" name="website" required />
4
<textarea name="message" cols="40" rows="6" required ></textarea>

Paso 10: Estilizar los Campos Marcados con required

Probablemente se dará cuenta, visualmente hablando, que nada ocurre cuando agregamos el atributo required. Lo que haremos es estilizar los campos requeridos usando CSS. Para este ejemplo, agregaremos un asterisco rojo como una imagen de fondo en cada uno de los campos requeridos. Para lograr eso, primero agregaremos un poco de relleno al lado derecho de nuestro input donde estará nuestra imagen de fondo (esto prevendrá alguna superposición si el texto es muy largo):

1
.contact_form input, .contact_form textarea {
2
	padding-right:30px;
3
}

Ahora usaremos el pseudo selector :required para elegir todos los elementos del formulario con el atributo required. Hice un simple icono de un asterisco rojo de 16 x 16 pixeles en Photoshop que servirá como indicador visual de los campos requeridos.

1
input:required, textarea:required {
2
	background: #fff url(images/red_asterisk.png) no-repeat 98% center;
3
}

¿Qué pasará cuando sea enviada?

En este momento, diferentes buscadores harán diferentes cosas cuando un formulario que use elementos de HTML5 es enviado. Cuando el formulario sea enviado, la mayoría prevendrá de que el formulario sea enviado y mostrara una "pista" al usuario, marcando el primer campo que sea requerido y que no tenga contenido. Estilos visuales y soporte para estos "campos burbuja" son muy amplios. Esperemos que estas conductas se vuelvan mas estándares en el futuro.

Puede ver el estado actual de soporte por buscadores para el atributo required en quirksmode.

Consejo Rápido:

Puede estilizar la burbuja un poco en webkit usando lo siguiente:

1
::-webkit-validation-bubble-message {
2
	padding: 1em;
3
}

Paso 11: Entendiendo los Nuevos Atributos type de HTML5 y Validación en el Lado del Cliente

La validación de HTML5 trabaja de acuerdo con el tipo de atributo type que es definido en los campos del formulario. Por años HTML solo ha soportado unos pocos tipos de atributos, como type="text" pero con HTML5 hay mas de una docena de nuevos tipos de entrada incluyendo email y url los cuales serán usados en nuestro formulario.

Combinando los atributos type y required, el buscador ahora puede validar los formularios en el lado del cliente. Si el buscador de un usuario no soporta los nuevos tipos de campos, como el de type="email", simplemente cambiara por defecto a type="text". De hecho esto es asombroso. Esencialmente tienes compatibilidad con versiones anteriores en todos los buscadores de la tierra. ¡Hurra!

Entonces ¿Qué pasa si el buscador si soporta el nuevo atributo type? Para buscadores en computadoras de escritorio no habrá diferencia visual (a menos que la especifiques a través de CSS). Un campo con type="text" se ve igual que uno con type="email". Pero para buscadores en dispositivos móvil hay una diferencia en termino de la interfaz.

Un Ejemplo: El iPhone

El iPhone de Apple detecta el tipo de campo y dinamicamente cambia el teclado de pantalla dando caracteres consciente del contexto. Por ejemplo, toda dirección de correo electrónico requiere los siguientes símbolos: "@" y "."; así que el iPhone da estos caracteres cuando el campo es especificado como uno de correo electrónico.

Paso 12: Cambiando los atributos type

Ya tenemos los campos establecidos por defecto a type="text". Pero ahora queremos cambiar el tipo de atributo a correo electrónico y sitio web a sus respectivos tipos de HTML5.

1
<input type="email" name="email" placeholder="john_doe@example.com" required />
2
<input type="url" name="website" placeholder="http://johndoe.com" required/>

Paso 13: Validación con HTML5

Como fue mencionado antes, la validación con HTML5 esta basada en el atributo type y esta habilitado por defecto. No hay código requerido para activar la validación. Si deseas deshabilitar la validación, puedes usar el atributo novalidate de esta manera:

1
<form novalidate>
2
	<-- do not validate this form -->
3
	<input type="text" />
4
</form>

Campo de Nombre

Veamos con mas detalle al primer campo, el cual pide el nombre del usuario. Como fue descrito antes, hemos agregado los atributos type="text" y required. Esto le informa al buscador que este campo es mandatario y que debe ser validado simplemente como texto. De esta manera, mientras que el usuario ponga al menos un carácter en el campo, será validado.

Ahora crearemos nuestro propio CSS para estilizar los campos que el buscador considera validos o inválidos. Si usted recuerda, hemos usado :required en CSS para estilizar los elementos que usan el atributo required. Ahora podemos estilizar los campos validos o inválidos usando :valid o :invalid.

Primero, estilizamos los campos para que sean inválidos. Para este ejemplo solo queremos que los estilos inválidos se muestren cuando el campo sea enfocado. Usaremos un borde rojo, sombra roja, y un icono creado en Photoshop para indicar que el campo es invalido.

1
.contact_form input:focus:invalid, .contact_form textarea:focus:invalid { /* when a field is considered invalid by the browser */
2
	background: #fff url(images/invalid.png) no-repeat 98% center;
3
	box-shadow: 0 0 5px #d45252;
4
	border-color: #b03535
5
}

Ahora, vamos a crear una regla que indique que este campo es valido. Agregaremos un borde verde, sombra verde y una marca de verificación creada en Photoshop. Esto sera aplicado a todos los campos aunque no estén enfocados.

1
.contact_form input:required:valid, .contact_form textarea:required:valid { /* when a field is considered valid by the browser */
2
	background: #fff url(images/valid.png) no-repeat 98% center;
3
	box-shadow: 0 0 5px #5cd053;
4
	border-color: #28921f;
5
}

Ahora cuando se enfoque en un campo, los estilos rojos de invalidación son mostrados. Tan pronto como un carácter sea ingresado, este sera validado y los estilos verdes serán activados para mostrar ese hecho.

Campos de Correo y URL

Nuestro código CSS de validación ya afecta el campo de correo electrónico ya que ya se le agrego los atributos type y required antes.

Paso 14: Introduciendo el atributo pattern de HTML5

Usando el atributo type="email" como un ejemplo, aparentemente la mayoría de buscadores validan ese campo como *@*, (cualquier carácter + el símbolo de arroba (@) + cualquier carácter). Esto obviamente no limita lo suficiente pero previene que un usuario ingrese espacios o valores que sean completamente incorrectos.

En el ejemplo del atributo type="url", parece que el mínimo requisito para la mayoría de buscadores es que halla un carácter seguido por dos puntos (:). Así que si se ingresa "h:" entonces el campo sera validado. Esto no es muy útil pero previene que los usuarios ingresen algo irrelevante a la información como su correo electrónico o dirección de casa. Ahora, uno podría ser mas especifico con la validación en el lado del servidor; pero aquí vamos a hablar sobre como hacerlo con HTML5.

El Atributo pattern

El atributo de patrón (pattern) acepta expresiones regulares de javascript (regular expressions). Esta expresión es usada en vez de la de defecto del buscador para validar el campo. Entonces nuestro HTML ahora se verá así:

1
<input type="url" name="website" placeholder="http://johndoe.com" required pattern="(http|https)://.+" />

Ahora nuestro campo solo aceptará valores que comienzan con "http://" o "https://" y que contengan caracteres adicionales. Estos patrones pueden ser confusos al principio, pero una vez que se tome el tiempo de aprenderlos, tendrás muchas mas opciones para tus formularios.

Paso 15: Instrucciones para Campos (CSS)

Ahora estilizaremos las instrucciones que le dicen al usuario como debe ingresar su información.

1
.form_hint {
2
	background: #d45252;
3
	border-radius: 3px 3px 3px 3px;
4
	color: white;
5
	margin-left:8px;
6
	padding: 1px 6px;
7
	z-index: 999; /* hints stay above all other elements */
8
	position: absolute; /* allows proper formatting if hint is two lines */
9
	display: none;
10
}

Establecemos display:none porque solo mostraremos las instrucciones cuando el usuario se enfoque en el campo. También establecemos las instrucciones al rojo que usamos para campos inválidos, porque siempre serán inválidos hasta que la información correcta sea ingresada.

Usando el Selector ::before

Ahora queremos agregar un pequeño triangulo a nuestras cajas de instrucciones para que le de dirección a nuestros ojos. Esto puede ser hecho usando una imagen, pero en este caso lo haremos usando puro CSS.

Ya que solo tiene propósito estético que no es vital para la funcionalidad de la pagina, agregaremos un pequeño triangulo que apunta a la izquierda usando el pseudo selector ::before. Podemos hacer esto usando una de las figuras geométricas de unicode.

Normalmente tendríamos que usar el formato Unicode de HTML para mostrar estos en nuestro código (como mostrado en la imagen superior). Sin embargo, ya que usaremos el selector CSS ::before, tenemos que usar el correspondiente codigo escapado del triangulo cuando lo ingresemos a la regla content:"". Luego solo tendremos que posicionarlo donde queramos.

1
.form_hint::before {
2
	content: "\25C0"; /* left point triangle in escaped unicode */
3
	color:#d45252;
4
	position: absolute;
5
	top:1px;
6
	left:-6px;
7
}

Usando el Selector Adjunto +

Finalmente vamos a usar el selector adjunto de CSS para mostrar y esconder las instrucciones para el formulario. El selector adjunto (x + y) selecciona el elemento que es precedido por el elemento anterior (x). Ya que las instrucciones están justo después de los campos de texto, podemos usar este selector para mostrar y esconder las instrucciones.

1
.contact_form input:focus + .form_hint {display: inline;}
2
.contact_form input:required:valid + .form_hint {background: #28921f;} /* change form hint color when valid */
3
.contact_form input:required:valid + .form_hint::before {color:#28921f;} /* change form hint arrow color when valid */

Como puede ver en el CSS, también hemos establecido las instrucciones para que cambien de color junto con el campo cuando es valido o invalido.

Paso 16: Descansa y Admira tu Bello Formulario HTML5

Ve y échale un vistazo al producto final!

Conclusión

Como pueden ver, las nuevas propiedades para formularios de HTML5 están geniales! Todo es compatible con versiones anteriores así que incorporar estas nuevas características en tu sitio no malogrará nada.

Validación con HTML5 esta acerca de remplazar validación del lado del cliente ayudando a usuarios llenar sus formularios correctamente. Sin embargo, validación con HTML aún no ha remplazado validación en el lado del servidor. Por mientras, es mejor usar ambos métodos cuando se administre información enviada por un usuario. ¡Gracias por leer!

¡Sé el primero en conocer las nuevas traducciones–sigue @tutsplus_es en Twitter!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.