Menu

Lista desplegable en HTML: select, option y optgroup

Cómo crear una lista desplegable en HTML con <select> y <option>: valores, una opción por defecto o de marcador, required, grupos de opciones, selección múltiple, leer y fijar el valor en JavaScript y dar estilo a la flecha.

Esta página incluye editores ejecutables: edita, ejecuta y ve el resultado al instante.

Cómo hacer una lista desplegable en HTML

Una lista desplegable es un elemento <select> con un <option> por cada opción. El value de cada opción es lo que envía el formulario; el texto entre las etiquetas es lo que ve el lector. Elige una y pulsa Submit:

El formulario envía language=js: el name del select y el value de la opción elegida. selected fija la opción por defecto; sin él, se elige la primera opción. Si una opción no tiene value, se envía su texto.

Conecta la etiqueta con el select mediante for e id (o envolviéndolo) para que al pulsar la etiqueta el foco pase al desplegable y los lectores de pantalla lo anuncien.

Atributos de select y option

ElementoAtributoHace
<select>nameLa clave con la que se envía el valor
<select>requiredHay que elegir una opción real, no una primera opción vacía de marcador
<select>multipleSe pueden elegir varias opciones
<select>sizeCuántas filas se ven (lo convierte en un cuadro de lista)
<select>disabledTodo el desplegable queda desactivado y no se envía
<option>valueLo que se envía cuando se elige
<option>selectedElegida al cargar la página
<option>disabledSe muestra pero no se puede elegir
<optgroup>labelEl encabezado del grupo

Una opción de marcador con required

Un select siempre tiene un valor, así que sin un marcador se envía la primera opción real aunque el lector nunca haya tocado el desplegable. Una primera opción vacía lo soluciona, y required detiene el envío hasta que se elige una opción real:

Pulsa Continue antes de elegir: el navegador se niega y te pide que selecciones un elemento. El marcador tiene value="", que es lo que required considera vacío, y disabled para que no se pueda volver a elegir una vez elegido un país.

Agrupar opciones con optgroup

<optgroup label="..."> pone un encabezado sobre un conjunto de opciones. El encabezado no se puede seleccionar:

Los grupos no se pueden anidar: una lista tiene un solo nivel de encabezados, no más. disabled en un <optgroup> deshabilita todas sus opciones.

Selección múltiple

multiple permite al lector elegir varias opciones y convierte el desplegable en un cuadro de lista. Mantén Ctrl (Cmd en Mac) para añadir opciones de una en una, o Mayús para seleccionar un rango:

El formulario envía skills=html y skills=css: el mismo nombre una vez por cada opción elegida. Mucha gente no conoce el gesto de Ctrl+clic, así que para unas pocas opciones es más fácil de usar un grupo de checkboxes.

Leer y fijar el valor en JavaScript

select.value lee y fija el valor de la opción elegida, y el evento change se dispara cuando el lector elige otra opción. Un uso habitual es un segundo desplegable cuyas opciones dependen del primero:

new Option(text, value) crea una opción. select.selectedIndex es la posición de la opción elegida, y select.selectedOptions lista las elegidas, que es como se lee un select múltiple.

Dar estilo a un select

La lista abierta del desplegable la dibujan el navegador y el sistema operativo, y se puede estilizar poco. La caja cerrada sí: appearance: none quita la flecha nativa, y una imagen de fondo pone la tuya en su lugar:

El padding extra al final deja sitio a la flecha para que el texto largo de una opción no pase por debajo de ella. font: inherit importa tanto aquí como en los botones: los selects usan por defecto la fuente pequeña de formulario del navegador. Las opciones de la lista abierta conservan el aspecto nativo. Chrome también permite estilizar la lista abierta si lo activas con appearance: base-select; los navegadores sin ese soporte muestran la lista nativa. El control total en todas partes exige un widget propio construido con ARIA, lo que cuesta mucho más de hacer bien de lo que parece.

¿select, radio buttons o datalist?

UsaCuando
<select>Una elección de una lista larga, o cuando el espacio es escaso
Radio buttonsUna elección entre pocas opciones que deben verse todas (consulta radio button en HTML)
<input> con <datalist>Sugerencias, pero se permite cualquier valor escrito

Errores comunes

  • Sin marcador en una elección obligatoria. Se envía la primera opción real aunque el lector nunca la haya elegido.
  • Un marcador con un valor real, como value="none". required lo trata como una elección válida. Usa value="".
  • Opciones sin value cuando el texto es largo o está traducido. El servidor recibe el texto visible, que cambia con el idioma.
  • multiple para pocas opciones. Los checkboxes son más fáciles de usar.
  • Escuchar click en las opciones. Usa change en el <select>; también se dispara con los cambios hechos con el teclado.
  • Sin etiqueta. Un select que solo tiene un marcador se queda sin nombre en cuanto se elige una opción.

Preguntas frecuentes

¿Cómo se crea una lista desplegable en HTML?

Usa <select> con un <option> por opción: <select name="color"><option value="red">Rojo</option><option value="blue">Azul</option></select>. Dale al select un name y un <label>.

¿Cómo fijo la opción por defecto de un select?

Añade selected a esa opción: <option value="blue" selected>Azul</option>. Sin él, queda seleccionada la primera opción. En JavaScript, asigna select.value = 'blue'.

¿Cómo pongo un placeholder en un select?

Haz que la primera opción esté vacía y no se pueda elegir: <option value="" disabled selected>Elige un país</option>. Añade required al <select> para que el formulario no se pueda enviar hasta que se elija una opción real.

¿Cómo obtengo el valor seleccionado de un select en JavaScript?

select.value es el valor de la opción seleccionada. Para su texto visible usa select.selectedOptions[0].text, y escucha el evento change para reaccionar cuando cambia la elección. En un select múltiple, recorre select.selectedOptions.

¿Qué diferencia hay entre un select y un datalist?

Un <select> solo permite las opciones de la lista. Un <input> con un <datalist> sugiere opciones mientras el lector escribe pero acepta cualquier texto. Usa select cuando la respuesta tiene que ser una de las tuyas.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR