Artículo original escrito por: Joy Shaheb
Artículo original: Learn JavaScript Form Validation - Build a JS Project for Beginners
Traducido y adaptado por: Jorge Torres
Hoy aprenderemos como hacer una validación de formulario en JavaScript. También agregaremos imágenes y media queries para construir todo el proyecto e incluso puedes guardarlo como parte de tu portafolio.
Esta es la demostración del proyecto que vamos a construir?
Esta es una pequeña muestra de como funcionaría el formulario?
Si lo deseas, puedes ver también este tutorial de YouTube:
Código fuente
Puedes obtener el código fuente, incluyendo las imágenes, en los siguientes enlaces:
Como configurar el proyecto
Sigue estos pasos para configurar nuestro proyecto: ?
- Crea una nueva carpeta con el nombre "Proyecto" y abre VS Code
- Crea los archivos índice.html, estilos.css y main.js
- Enlaza los archivos dentro del HTML
- Descarga las imágenes de mi repositorio de GitHub.
- Pega este enlace de font-awesome dentro de la etiqueta head en el HTML. Así podremos tener acceso a iconos de Font Awesome ??
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css"
crossorigin="anonymous"
/>
Esto es lo que cubriremos
- Escribiendo el HTML
- Agregando CSS
- Escribiendo JavaScript
- Agregar un botón de redes sociales
- Agregando imágenes
- Media queries para la versión móvil (Diseño responsivo)
Como escribir el HTML
Crea una clase llamada .container
dentro de la etiqueta body la cual va a alojar la etiqueta del formulario (form) y que al mismo tiempo tendrá el identificador de form
.?
<div class="container">
<form id="formulario"></form>
</div>
Y dentro de la etiqueta form
, crea 4 div
s, como este ejemplo ?
<form id="formulario">
<div class="titulo">Empezar</div>
<div></div>
<div></div>
<div></div>
</form>
Dentro de esas 3 etiquetas div vacías, vamos a crear 3 entradas [nombreDeUsuario, correoElectronico y contraseña] junto con los iconos y etiquetas.
Nota: vamos a crear una clase con nombre .error
. Aquí usaremos JavaScript para insertar el mensaje de error.
Entrada de nombreDeUsuario
<!-- Entrada para nombre de Usuario -->
<div>
<label for="nombreDeUsuario">Nombre de Usuario</label>
<i class="fas fa-user"></i>
<input
type="text"
name="username"
id="Nombre-de-Usuario"
placeholder="Joy Shaheb"
/>
<i class="fas fa-exclamation-circle failure-icon"></i>
<i class="far fa-check-circle success-icon"></i>
<div class="error"></div>
</div>
Entrada de correo electrónico
<!-- Entrada de Correo Electrónico -->
<div>
<label for="correoElectronico">Correo Electrónico</label>
<i class="far fa-envelope"></i>
<input
type="email"
name="email"
id="correo-electrónico"
placeholder="abc@gmail.com"
/>
<i class="fas fa-exclamation-circle failure-icon"></i>
<i class="far fa-check-circle success-icon"></i>
<div class="error"></div>
</div>
Entrada Contraseña
<!-- Entrada de contraseña -->
<div>
<label for="password">Contraseña</label>
<i class="fas fa-lock"></i>
<input
type="password"
name="password"
id="contrasena"
placeholder="Ingresar contraseña"
/>
<i class="fas fa-exclamation-circle failure-icon"></i>
<i class="far fa-check-circle success-icon"></i>
<div class="error"></div>
</div>
Como hacer un botón
Finalmente, agrega el botón antes del cierre de la etiqueta del formulario de la siguiente manera:
<form>
<!-- otro código aquí -->
<button id="btn" type="submit">Enviar</button>
</form>
Aquí el resultado hasta ahora: ?
Felicidades por completar la parte del HTML! ???
Como agregar el CSS
Vamos a agregar estilos con CSS a nuestro Formulario. Primero, eliminemos los estilos predeterminados de nuestro navegador incluyendo la fuente?
/**
* ! cambiando estilos predeterminados del navegador
**/
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: sans-serif;
}
Ahora, aplicaremos esos estilos a la etiqueta del formulario:
/**
* ! reglas de estilo para la sección del formulario
**/
formulario {
display: flex;
flex-direction: column;
justify-content: center;
max-width: 400px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
padding: 50px;
}
Posteriormente, haremos los siguientes cambios para el título del texto: ??
.titulo {
font-size: 25px;
font-weight: bold;
margin-bottom: 20px;
}
Tu resultado hasta ahora??
Ahora, agrega un margen al botón del texto de nuestra etiqueta label
así:
label {
display: block;
margin-bottom: 5px;
}
Y agrega estos estilos para cambiar el aspecto de nuestras etiquetas input??
formulario div input {
width: 100%;
height: 40px;
border-radius: 8px;
outline: none;
border: 2px solid #c4c4c4;
padding: 0 30px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
}
Agrega este código para dar más espacio y efectos de cambio de color:
formulario div {
position: relative;
margin-bottom: 15px;
}
input:focus {
border: 2px solid #f2796e;
}
El resultado hasta ahora ??
Como dar Estilo a los iconos
Ahora le daremos estilo a los iconos que importamos de font-awesome. Sigue el código conmigo :✨✨
/**
* ! reglas de estilo para los iconos del formulario
**/
formulario div i {
position: absolute;
padding: 10px;
}
Aquí tenemos el resultado de agregar esas dos líneas??
Ahora, agrega estos estilos para dar estilo a la clase error, junto con el icono de success
y failure
??
.failure-icon,
.error {
color: red;
}
.success-icon {
color: green;
}
.error {
font-size: 14.5px;
margin-top: 5px;
}
Aquí el resultado hasta ahora??
Mira, los iconos success
y failure
se superponen entre sí. No te preocupes, manipularemos eso con JavaScript. Por ahora, puedes esconderlos así??
.success-icon,
.failure-icon {
right: 0;
opacity: 0;
}
Ahora, vamos a dar estilo a nuestro botón de enviar, de esta manera ?
/* Reglas de estilo para botón enviar */
button {
margin-top: 15px;
width: 100%;
height: 45px;
background-color: #f2796e;
border: 2px solid #f2796e;
border-radius: 8px;
color: #fff;
font-size: 20px;
cursor: pointer;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
transition: all 0.1s ease;
}
Si quieres agregar un efecto hover, entonces, agrega estos estilos ??
button:hover {
opacity: 0.8;
}
¡Toma un descanso!
Hasta ahora todo muy bien. Toma un descanso – lo mereces.
Como agregar JavaScript
Primero, necesitamos apuntar a todas nuestras clases y al id del HTML dentro del JavaScript. Para hacer esta tarea eficientemente, haz estas dos funciones ??
let id = (id) => document.getElementById(id);
let classes = (classes) => document.getElementsByClassName(classes);
Después, guarda las clases y el id dentro de estas variables?
Nota: Trata de no cometer errores de ortografía. De lo contrario, tu JavaScript no funcionará.
let nombreDeUsuario = id("nombreDeUsuario"),
email = id("email"),
contrasena = id("contrasena"),
formulario = id("formulario"),
msjError = classes("error"),
iconoExito = classes("success-icon"),
failureIcon = classes("failure-icon");
Ahora, vamos a apuntar a nuestro formulario y agregar el event listener a enviar ?
form.addEventListener("enviar", (e) => {
e.preventDefault();
});
Ahora, crearemos una función llamada motor que hará todo el trabajo de validación de formularios para nosotros. Tendrá tres argumentos – sigue aquí: ?
let motor = (id, serial, mensaje) => {}
Los argumentos representan lo siguiente:
id
va a apuntar a nuestro identificadorserial
va a apuntar a todas nuestras clases[error class, success and failure icons]mensaje
va a imprimir en mensaje dentro de nuestra clase .error
Ahora crea una sentencia if, else
así ?
let motor = (id, serial, mensaje) => {
if (id.value.trim() === "") {
}
else {
}
}
Nota: id.value.trim()
va a remover todos los espacios extra del valor que el usuario ingresa. Puedes darte una idea de como funciona analizando está ilustración ?
Ahora, mira nuestros siguientes objetivos ?
- Queremos que JavaScript imprima un mensaje dentro de la clase error cada que el usuario envié un formulario en blanco. Y al mismo tiempo, queremos que los iconos de
failure
resalten también. - Pero, si el usuario rellena todas las entradas y las envía, queremos que el botón de
success
se haga visible.
Para lograr esto, escribe esta lógica? para imprimir el mensaje:
let motor = (id, serial, mensaje) => {
if (id.value.trim() === "") {
msjError[serial].innerHTML = mensaje;
}
else {
msjError[serial].innerHTML = "";
}
}
Para que los iconos funcionen correctamente, agrega este código: ??
let motor = (id, serial, mensaje) => {
if (id.value.trim() === "") {
msjError[serial].innerHTML = mensaje;
id.style.border = "2px solid red";
// iconos
failureIcon[serial].style.opacity = "1";
successIcon[serial].style.opacity = "0";
}
else {
msjError[serial].innerHTML = "";
id.style.border = "2px solid green";
// iconos
failureIcon[serial].style.opacity = "0";
successIcon[serial].style.opacity = "1";
}
}
Es tiempo de implementar nuestra función recién creada. Escribe el siguiente código en el lugar donde agregamos el event listener de enviar ?
form.addEventListener("enviar", (e) => {
e.preventDefault();
motor(nombreDeUsuario, 0, "El nombre de usuario no puede estar en blanco");
motor(correoElectronico, 1, "El correo electrónico no puede estar en blanco");
motor(contrasena, 2, "La contraseña no puede estar en blanco");
});
Aquí, pasamos los nombres de los id, las series de los nombres de nuestras clases de nombre y pasamos el mensaje que se debe imprimir cuando encontramos un error cuando el usuario envíe el formulario.
Aquí los resultados hasta ahora ?
Como agregar los botones de redes sociales
Todo bien hasta ahora, agreguemos las opciones de registro con redes sociales. Sigue los pasos aquí. ?
Dentro de la etiqueta del formulario, crea un nuevo div
con el nombre de clase social
:
<form id="formulario">
<div class="social">
<div class="titulo">Empieza ya</div>
<div class="pregunta">
Ya estás registrado? <br />
<span>Registrate</span>
</div>
<div class="btn"></div>
<div class="or">O</div>
</div>
<!-- otro código aquí-->
</form>
Dentro de la clase .btn
, creamos dos divs más con los nombres de clase .btn-1
y .btn-2
con las imágenes y el texto también.
<div class="btn">
<div class="btn-1">
<img src="https://img.icons8.com/color/30/000000/google-logo.png" />
Registrate
</div>
<div class="btn-2">
<img src="https://img.icons8.com/ios-filled/30/ffffff/facebook-new.png" />
Registrate
</div>
</div>
Así van nuestro resultado hasta ahora??
Ahora, primero vamos a darle estilo a .btn-1
y .btn-2
. Cambiaremos la alineación de los botones a fila de columna?
/**
* ! reglas de estilo para la sección de redes sociales
**/
.btn {
display: flex;
flex-direction: row;
justify-content: space-between;
gap: 15px;
}
Así es como se vería ahora:
Ahora, agrega estilos para el botón así: ?
.btn-1,
.btn-2 {
padding: 10px 5px;
width: 100%;
display: flex;
gap: 15px;
justify-content: center;
align-items: center;
border: 2px solid #c4c4c4;
border-radius: 8px;
box-shadow: 2px 2px 4px rgba(0, 0, 0, 0.1);
cursor: pointer;
}
Cambia el color del icono y el color del texto del .btn-2
así: ?
.btn-2 {
background-color: #4f70b5;
color: white;
}
Después agrega estos pequeños cambios para que el componente se vea mejor:
.or {
text-align: center;
}
.pregunta {
font-size: 15px;
}
span {
color: #f2796e;
cursor: pointer;
}
El resultado hasta ahora luce así:
Como agregar imágenes
Ahora, agregaremos imágenes a nuestro proyecto. Primero, escribiremos el HTML ?
<div class="container">
<div class="contenido">
<div class="logo">
<img src="https://svgshare.com/i/_go.svg" alt="" />
</div>
<div class="imagen"></div>
<div class="texto">
Empieza gratis & obten <br />
atractivas ofertas hoy !
</div>
</div>
<form id="formulario">
<!--otro código aquí -->
</form>
</div>
El resultado hasta ahora?
Ahora necesitamos cambiar la orientación de nuestro contenido de columna a fila. Sigue los pasos a continuación ?
.container {
display: flex;
flex-direction: row;
}
Agrega estas reglas de estilo para la sección de contenido:
/**
* ! reglas de estilo para la sección de contenido
**/
.contenido {
display: flex;
flex-direction: column;
justify-content: space-around;
background-color: #f2796e;
width: 55%;
min-height: 100vh;
padding: 10px 20px;
}
formulario {
width: 45%;
max-width: none;
}
El resultado hasta ahora ?
Agrega la ilustración principal con CSS:
.imagen {
background-image: url("https://svgshare.com/i/_gZ.svg");
background-repeat: no-repeat;
background-size: contain;
background-position: center;
/* border: 2px solid black; */
height: 65%;
}
Y agrega estos estilos para la clase .texto
:
.texto {
text-align: center;
color: white;
font-size: 18px;
}
formulario {
width: 45%;
max-width: none;
}
El Resultado hasta ahora ?
Como agregar Media Queries para la Versión Mobile
Queremos que nuestro formulario tenga un diseño responsivo. Así que agregaremos media queries para que nos ayuden a lograrlo.
Para pantallas con un ancho de 900 px, vamos a agregar estos estilos. Sigue los pasos ??
@media (max-width: 900px) {
.container {
flex-direction: column;
}
formulario,
.contenido {
width: 100%;
}
.btn {
flex-direction: column;
}
.imagen {
height: 70vh;
}
}
Para pantallas con un ancho de 425px, haremos estos cambios mínimos ?
@media (max-width: 425px) {
formulario {
padding: 20px;
}
}
Este es el resultado final??
Conclusión
Felicidades por completar tu lectura de este tutorial. Ahora puedes fácil y eficientemente usar JavaScript para manejar validación de formularios. ¡Pero no solo eso, también tienes ya un proyecto listo para mostrar a tu reclutador local!
Aquí tienes tu medalla por leer hasta el final ❤️