La etiqueta <input> con colores

Controles: Campos para elegir colores


En HTML5 se ha incluido un nuevo campo de entrada <input> que permite al usuario seleccionar un color específico. Dicho campo facilita una interfaz de usuario conocida como color picker, es decir, una ventana de diálogo selectora de colores que permite al usuario elegir un color específico de una rueda de colores o un sistema alternativo, generalmente dentro de uno de los diferentes modelos de colores de CSS.

El atributo type="color"

La etiqueta que utilizaremos para mostrar esta interfaz será <input>, utilizando el atributo type al valor color. Ten en cuenta que el interfaz del color picker puede variar dependiendo del sistema operativo. Mientras en Windows saldrá de una forma, en dispositivos Apple o Android saldrá de otra:

Tipo de información a obtener Etiqueta a utilizar Ejemplo
Campo de selección de color <input type="color">

El usuario puede elegir un color en su interfaz de selección de colores y este color es guardado en el atributo value en formato hexadecimal.

<form method="post" action="/send/">
  Selecciona el color deseado:
  <input type="color">
</form>

Color por defecto

También se puede indicar un atributo value para establecer un color por defecto. Este valor debe estar en formato hexadecimal, con o sin #. Sin embargo, otros esquemas de color como palabras clave (red, tomato, green, etc...), RGB, HSL, HWB, OKLCH u otras no serán válidas:

<form method="post" action="/send/">
  Selecciona el color deseado:
  <input type="color" value="#1BF44A">
</form>

Este campo puede ser potenciado combinándose con la etiqueta HTML <datalist>. Lo veremos en otro artículo más adelante, donde explicaremos como funciona.

El soporte de este campo de selección de colores en los diferentes navegadores es muy bueno hoy en día:

Personalizar apariencia

Vamos a echar un vistazo a la forma de personalizar este campo de entrada. Para ello, utilizaremos CSS y unos pseudoelementos especiales para los campos de entrada de color.

Selector Descripción
input[type="color"] Elemento de entrada de datos para elegir color.
::color-swatch-wrapper Contenedor externo del color elegido.
::color-swatch Contenedor interno del color elegido.

Veamos un ejemplo, donde modificamos los estilos para convertir el <input> de Color Picker en un elemento circular. Observa que utilizamos el background: none para quitar el color por defecto que tiene este campo. En el resto, le damos estilo para redondear las esquinas y añadirle un borde.

input[type="color"].custom {
  --size: 45px;

  width: var(--size);
  height: var(--size);
  background: none;
  padding: 0;
  border: 0;

  &::-webkit-color-swatch-wrapper {
    width: var(--size);
    height: var(--size);
    padding: 0;
  }

  &::-webkit-color-swatch {
    border: 3px solid #333;
    border-radius: 50%;
  }
}
<fieldset>
  <legend>Sin estilo</legend>
  <input type="color" value="#732FB6">
</fieldset>

<fieldset>
  <legend>Con estilo personalizado</legend>
  <input class="custom" type="color" value="#732FB6">
</fieldset>

Ten en cuenta que la ventana de diálogo del Color Picker no es posible editarla con CSS, ya que es la que proporciona el sistema operativo. Windows, Mac/iOS, Linux o Android tienen su propio color picker particular.

Recuerda que esta API aún no es estable, por lo que hay que añadir el prefijo -webkit para dar soporte a navegadores basados en Chromium, y el prefijo -moz para dar soporte a Firefox. Cuando sea estable, simplemente escribiremos el código sin prefijos.

Ten en cuenta que no se pueden combinar dos selectores con prefijos diferentes, como es el caso de ::-webkit- y ::-moz-, ya que si el navegador no reconoce uno de ellos, ignorará y descartará el resto del selector.

¿Quién soy yo?

Soy Manz, vivo en Tenerife (España) y soy streamer partner en Twitch y profesor. Me apasiona el universo de la programación web, el diseño y desarrollo web y la tecnología en general. Aunque soy full-stack, mi pasión es el front-end, la terminal y crear cosas divertidas y locas.

Puedes encontrar más sobre mi en Manz.dev