En este tutorial construiremos un formulario de contacto funcional y validado desde cero, en esta primera parte veremos como hacer la estructura en HTML y los estilos en CSS.

Actualización: Acabo de publicar un tutorial para usuarios avanzados de como hacer un formulario de contacto similar a este, capaz de enviar mensaje sin recargar la pagina usando AJAX, todo en un solo tutorial.


Resultado Final

Estructura HTML

Vamos a empezar con una estructura HTML base y guardamos este archivo como index.html:

<html>
	<head>
		<title>Contacto</title>
		<link rel='stylesheet' href='estilos.css'>
	</head>
	<body>
		<form class='contacto'>
			<div><label>Tu Nombre:</label><input type='text' value=''></div>
			<div><label>Tu Email:</label><input type='text' value=''></div>
			<div><label>Asunto:</label><input type='text' value=''></div>
			<div><label>Mensaje:</label><textarea rows='6'></textarea></div>
			<div><input type='submit' value='Envia Mensaje'></div>
		</form>
	</body>
</html>

Hoja de Estilos

Vamos a crear una hoja de estilos, le ponemos de nombre estilos.css y la ubicamos en la misma carpeta en donde esta el .html

Empezamos con el siguiente código que define las propiedades de fuente, color de fondo y longitud del body:

*{
	font-family: sans-serif;
	font-size: 12px;
	color: #798e94;
}
body{
	width: 400px;
	margin: auto;
	background-color: #E2ECEE;
}

Formulario

Hacemos un selector para el formulario (.contacto) y le definimos border, border-radius, padding, margin, y color de fondo:

.contacto{
	border: 1px solid #CED5D7;
	border-radius: 6px;
	padding: 45px 45px 20px;
	margin-top: 50px;
	background-color: white;
	box-shadow: 0px 5px 10px #B5C1C5, 0 0 0 10px #EEF5F7 inset;
}

En la linea 17 estoy definiendo dos sombras: una externa y otra interna que da la apariencia de un borde interior. (Propiedades CSS3 explicadas y con ejemplos).

Luego hacemos selectores para label y div y ponemos el siguiente código:

.contacto label{
	display: block; /* esto es para que el label se sobreponga a la caja de texto */
	font-weight: bold;
}
.contacto div{
	margin-bottom: 15px; /* esto los separara un poco */
}

Cajas de texto

Para las cajas de textos usamos selectores multiples, para los input y para el textarea:

.contacto input[type='text'], .contacto textarea{
	padding: 7px 6px;
	width: 294px; /* una longitud definida */
	border: 1px solid #CED5D7;
	resize: none; /* esta propiedad es para que el textarea no sea redimensionable */
	box-shadow:0 0 0 3px #EEF5F7;
	margin: 5px 0;
}
.contacto input[type='text']:focus, .contacto textarea:focus{
	outline: none; /* reset especifico para Chrome/Safari */
	box-shadow:0 0 0 3px #dde9ec;
}

Nota que en la linea 26 y 34 se usa el selector input[type=’text’](selector de atributo) esto es para que no se mezcle con el otro input[type=’submit’] (el boton de envio).

Boton de Envio

Por ultimo para el boton de envio usaremos estilos similares a los de las cajas de textos, pero ademas va a tener bordes redondeados, sombra al texto y para el background le pondremos degradados CSS3:

.contacto input[type='submit']{
	border: 1px solid #CED5D7;
	box-shadow:0 0 0 3px #EEF5F7;
	padding: 8px 16px;
	border-radius: 20px;
	font-weight: bold;
	text-shadow: 1px 1px 0px white;

	background: #e4f1f6; /* fallback para navegadores que no soporten degradados */
	background: -moz-linear-gradient(top, #e4f1f6 0%, #cfe6ef 100%);
	background: -webkit-linear-gradient(top, #e4f1f6 0%,#cfe6ef 100%);
}
.contacto input[type='submit']:hover{
	background: #edfcff;
	background: -moz-linear-gradient(top, #edfcff 0%, #cfe6ef 100%);
	background: -webkit-linear-gradient(top, #edfcff 0%,#cfe6ef 100%);
}
.contacto input[type='submit']:active{
	background: #cfe6ef;
	background: -moz-linear-gradient(top, #cfe6ef 0%, #edfcff 100%);
	background: -webkit-linear-gradient(top, #cfe6ef 0%,#edfcff 100%);
}

El boton debe ir quedando así, en sus tres estados:


Código final CSS

*{
	font-family: sans-serif;
	font-size: 12px;
	color: #798e94;
}
body{
	width: 400px;
	margin: auto;
	background-color: #E2ECEE;
}
.contacto{
	border: 1px solid #CED5D7;
	border-radius: 6px;
	padding: 45px 45px 20px;
	margin-top: 50px;
	background-color: white;
	box-shadow: 0px 5px 10px #B5C1C5, 0 0 0 10px #EEF5F7 inset;
}
.contacto label{
	display: block;
	font-weight: bold;
}
.contacto div{
	margin-bottom: 15px;
}
.contacto input[type='text'], .contacto textarea{
	padding: 7px 6px;
	width: 294px;
	border: 1px solid #CED5D7;
	resize: none;
	box-shadow:0 0 0 3px #EEF5F7;
	margin: 5px 0;
}
.contacto input[type='text']:focus, .contacto textarea:focus{
	outline: none;
	box-shadow:0 0 0 3px #dde9ec;
}
.contacto input[type='submit']{
	border: 1px solid #CED5D7;
	box-shadow:0 0 0 3px #EEF5F7;
	padding: 8px 16px;
	border-radius: 20px;
	font-weight: bold;
	text-shadow: 1px 1px 0px white;

	background: #e4f1f6;
	background: -moz-linear-gradient(top, #e4f1f6 0%, #cfe6ef 100%);
	background: -webkit-linear-gradient(top, #e4f1f6 0%,#cfe6ef 100%);
}
.contacto input[type='submit']:hover{
	background: #edfcff;
	background: -moz-linear-gradient(top, #edfcff 0%, #cfe6ef 100%);
	background: -webkit-linear-gradient(top, #edfcff 0%,#cfe6ef 100%);
}
.contacto input[type='submit']:active{
	background: #cfe6ef;
	background: -moz-linear-gradient(top, #cfe6ef 0%, #edfcff 100%);
	background: -webkit-linear-gradient(top, #cfe6ef 0%,#edfcff 100%);
}

Con eso hemos terminado de diseñar nuestro formulario utilizando solo HTML y CSS, recuerda que puedes ver el resultado final en este enlace.

Si no entendiste una parte o tienes alguna duda, házmela saber en los comentarios, no olvides suscribirte por correo electrónico para que seas notificado cuando se publiquen las continuaciones de este tutorial.