Artículo original escrito por: Kingsley Ubah
Artículo original: How to Build a Sign Up Form with Floating Labels and Transitions Using Plain HTML and CSS
Traducido y adaptado por: Sil Zubikarai

En este tutorial vamos a construir un moderno formulario de registro con etiquetas flotantes y transiciones suaves usando simplemente HTML y CSS.

ezgif.com-gif-maker--9--2
A view

Como puedes ver en la imagen de arriba, cuando una entrada dentro del formulario gana enfoque, su etiqueta flota en la parte superior y un borde semi-grueso aparece alrededor de la entrada. Si un texto es escrito dentro de la entrada y la entrada pierde enfoque, la etiqueta permanece en la parte superior. De otra manera, la etiqueta regresa hacia abajo a la entrada.

Muchos formularios modernos tienen cierta forma de transición aplicada a ellos. No solo estas transiciones hacen el formulario más dinámico, pero también ayuda a guiar al usuario en el estado de entrada (así tenga enfoque o no) y que tipo de datos se espera manejar en cada entrada.

En este tutorial, aprenderás acerca de algunas características interesantes de CSS como transiciones, selectores como :placeholder_focus, y muchas otras propiedades de CSS que deberías saber.

¡Vamos a ello!

El marcado HTML

Vamos a definir el marcado para nuestro formulario de registro. Pero antes de eso, tenemos que configurar nuestro boilerplate HTML y vincular correctamente  nuestra hoja de estilo desde la etiqueta head. Puedes hacer esto fácilmente con el plugin Emmet escribiendo !  luego en su editor de IDE/Código.

Puedes también copiar este boilerplate y pegarlo dentro de tu archivo index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <link rel="stylesheet" href="styles.css">
</head>
<body>

</body>
</html>

Dentro de la etiqueta body, definimos el markup para nuestro formulario:

<div class="signupFrm">
    <form action="" class="form">
      <h1 class="title">Sign up</h1>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Email</label>
      </div>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Username</label>
      </div>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Password</label>
      </div>

      <div class="inputContainer">
        <input type="text" class="input" placeholder="a">
        <label for="" class="label">Confirm Password</label>
      </div>

      <input type="submit" class="submitBtn" value="Sign up">
    </form>
  </div>

Creamos un contenedor div para contener el elemento formulario. Cada una de las entradas del formulario con las etiquetas de texto, están envueltas dentro del contenedor div. Las etiquetas sirven el propósito de informar al usuario que información debe contener cada entrada.

Y nuestra página debe verse como esto:

noCSS
HTML Form of four inputs and four labels

Puedes haber notado que el valor del marcador que hemos asignado a todas las entradas es  "a".  Esto puede ser de ayuda más adelante en el tutorial cuando empezamos a aplicar cierta lógica dinámica.

Como aplicar estilo al formulario

Nuestro formulario es muy básica, entonces vamos a añadir algo de estilo para hacerla ver mejor.

Primero, necesitamos realizar algunos reinicios y establecer el color de fondo:

@import url('https://fonts.googleapis.com/css2?family=Lato&display=swap');

/* Get rid of all default margins/paddings. Set typeface */
body {
  box-sizing: border-box;
  margin: 0;
  padding: 0;
  background-color: white;
  font-family: "lato", sans-serif;
}
Setting base styling

Aquí está como nuestra página se vería:

reset-lato
Without any styling yet

Después de poner estilo a body, estableceremos el modo visualización del contenido flex. Esto asegura que todos los hijos directos dentro del contenedor elemento div estén desplegados lado-a-lado por defecto.

En nuestro caso, solo hay un hijo dentro del contenedor signupFrm. La única razón que usamos signupFrm aquí es para usar las propiedades align-items y  justify-content para ayudar a centrar todo verticalmente y horizontalmente.

/* Puts the form in the center both horizontally and vertically. Sets its height to 100% of the viewport's height */

.signupFrm {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100vh;
}
Styling the form container

La propiedad vh,  que significa la altura de la ventana gráfica, asegura que el formulario tome el 100% de la altura de la ventana del buscador, independientemente del tamaño de la ventana o la orientación. Esto la hará más receptivo.

middle
Our form is now aligned to the center

Ahora vamos a estilizar el formulario un poco:

.form {
  background-color: white;
  width: 400px;
  border-radius: 8px;
  padding: 20px 40px;
  box-shadow: 0 10px 25px rgba(92, 99, 105, .2);
}

.title {
  font-size: 50px;
  margin-bottom: 50px;
}

En el primer estilo dirigido en el formulario, estableceremos el fondo blanco, vamos a darle un width de 400px, y vamos a añadir algo de curva alrededor del formulario, y finalmente estableceremos una sombra alrededor de la caja. También estableceremos el tamaño de la fuente en el título y algo de espacio bajo el elemento.

Y el resultado se verá como esto:

with-card
The form is now inside a card, with a box shadow

Siguiente,  vamos a estilizar al div que contiene las entradas del formulario y las etiquetas del formulario.

.inputContainer {
  position: relative;
  height: 45px;
  width: 90%;
  margin-bottom: 17px;
}

Vemos a poner la posición de la propiedad de nuestro contenedor div a relative. Esto nos hará posible posicionar al input hijo y label donde queramos. También estableceremos el width para tomar más de 90% del total del width del contenedor.

Esto es como el formulario será renderizada en el buscador web.

margin-added
Looks better

Ahora necesitamos poner estilo en nuestras entradas.

Primero ponemos la position a absolute. Esto nos permitirá mover cada uno de ellos a la parte superior izquierda del contenedor padre relativamente posicionado.

También necesitamos ocultar nuestro texto de marcador de posición arbitrario (los caracteres "a" mencionados anteriormente), para que no se superpongan con el texto dentro de cada etiqueta. El texto del marcador de posición será necesario cuando implementemos la transición:

/* Style the inputs */

.input {
  position: absolute;
  top: 0px;
  left: 0px;
  height: 100%;
  width: 100%;
  border: 1px solid #DADCE0;
  border-radius: 7px;
  font-size: 16px;
  padding: 0 20px;
  outline: none;
  background: none;
  z-index: 1;
}

/* Hide the placeholder texts (a) */

::placeholder {
  color: transparent;
}

Con los estilos aplicados, nuestro formulario debe verse como esto:

absolute
The placeholder "a" is no longer visible

Ahora, pondremos estilo a las etiquetas de texto:

/* Styling text labels */

.label {
  position: absolute;
  top: 15px;
  left: 15px;
  padding: 0 4px;
  background-color: white;
  color: #DADCE0;
  font-size: 16px;
  transition: 0.5s;
  z-index: 0;
}

La etiqueta muestra el texto nos dice la información es esperada dentro de la entrada. Comenzaremos con establecer su posición a absolute. Y al poner las propiedades top y left, podemos mover el texto hacia arriba en relación con su contenedor.

Ahora estableceremos la transición de 0.5 segundos. Esto es cuanto tomara el texto en subir cuando el cursor pase sobre el.

Finalmente, estableceremos el z-index de 0. El bajo z-index asegurará que la etiqueta se posicione detrás de  otros elementos "colocados más altos" si alguna vez se superponen.

Esto es lo que se representa en la página:

labels-1
The result

Ahora nos vamos a enfocar en los botones.

Bueno añadiremos algunas animaciones suaves con la propiedad transform de CSS, que mueve el botón hacia arriba un poco y cambia el color una vez que el ratón pasa cobre de él:

.submitBtn {
  display: block;
  margin-left: auto;
  padding: 15px 30px;
  border: none;
  background-color: purple;
  color: white;
  border-radius: 6px;
  cursor: pointer;
  font-size: 16px;
  margin-top: 30px;
}

.submitBtn:hover {
  background-color: #9867C5;
  transform: translateY(-2px);
}

Aquí está el resultado:

ezgif.com-gif-maker--6-
The button scales up and changes color when hovered over

Ahora, necesitaremos realizar algunos cambios de estados.

Cuando una entrada gana enfoque, queremos colocar la etiqueta más haya de la parte superior del contenedor (-7px), 3 pixels desde la izquierda, reducir el tamaño de fuente a 14 y cambiar el color a púrpura:

.input:focus + .label {
  top: -7px;
  left: 3px;
  z-index: 10;
  font-size: 14px;
  font-weight: 600;
  color: purple;
}

Aquí está el resultado:

ezgif.com-gif-maker--5-
Labels go up when input gains focus

También necesitamos añadir el borde púrpura alrededor de la entrada cuando gana enfoque.

.input:focus {
  border: 2px solid purple;
}
ezgif.com-gif-maker--7--3
Purple border added

Finalmente, tenemos que hacer algo muy importante.

Actualmente, cuando tú escribes algo de texto en el formulario y mueves el foco (tú ratón) de él, el texto de la etiqueta de texto y el texto dentro de la entrada chocan:

ezgif.com-gif-maker--8--3
Collision between label and input value

Con el siguiente CSS, vamos a especificar eso, cuando tú escribes el valor de la entrada y cambias el enfoque, queremos que la etiqueta permanezca flotante. Además, especifique bien que deseamos que la etiqueta de texto pierda su color púrpura:

.input:not(:placeholder-shown)+ .label {
  top: -7px;
  left: 3px;
  z-index: 10;
  font-size: 14px;
  font-weight: 600;
}

Y con eso, aquí está el aspecto final de nuestra página de registro.

ezgif.com-gif-maker--9--1
Final look

Terminando

Espero que hayas aprendido algunas nuevas cosas acerca de CSS de este tutorial. Las transiciones CSS dan vida a tu sitio web, y en esta guía hemos hecho que nuestro formulario tome más vida con ellas.

Puedes obtener todo el código de este tutorial en este repositorio GitHub.

Recientemente, he creado un newsletter donde proveo de sugerencias prácticas y recursos  para aprender desarrollo web. Suscríbete a mi  newsletter y obtener sugerencias justo en tu inbox.

Gracias por seguir.

P/S Si estás aprendiendo JavaScript, he creado un ebook que te enseña 50 títulos de JavaScript con notas  digitales dibujadas a mano. Checha aquí.