- Una guía que propone métodos de entrada simples y accesibles en lugar de selectores de fecha en JavaScript complejos
- Al aprovechar los elementos de entrada nativos del navegador (
date, time, datetime-local), se obtiene automáticamente accesibilidad, rendimiento y soporte de internacionalización
- Es posible simplificar interfaces complejas con campos de entrada separados, entrada con máscara o grupos de botones de opción
- Incluso en frameworks como React, se pueden usar directamente los elementos de entrada HTML nativos; el estilo es limitado, pero se conserva una UI del sistema familiar para el usuario
- Como todos los selectores de fecha tienen problemas de accesibilidad, la clave para diseñar formularios exitosos está en una estructura de entrada simple y pruebas con usuarios reales
¿Realmente se necesita un selector de fecha en JavaScript?
- En la mayoría de los casos, un selector de fecha en JavaScript independiente no es necesario
- Una UI compleja provoca errores y abandono del formulario
- Existen formas más fáciles de introducir fechas que un widget de calendario
- El objetivo de esta guía es presentar alternativas para una interfaz fácil de usar
Entradas nativas de fecha y hora del navegador
- Todos los navegadores modernos admiten los tipos de entrada nativos date, time y datetime-local
date permite seleccionar una fecha, time introducir hora y minutos, y datetime-local combina ambos
- Las entradas nativas pueden implementarse con una sola línea de código, y el navegador se encarga de la accesibilidad, el rendimiento y la internacionalización
- Admiten entrada por teclado y ofrecen una UI de calendario predeterminada
- No son perfectas, pero suelen ser más estables que la mayoría de las bibliotecas de JavaScript
- Aun así, todavía existen algunos problemas de accesibilidad
Entradas separadas y elementos de selección
- Separar año, mes y día en lugar de usar un solo selector de fecha mejora la usabilidad
- Se presenta como ejemplo el componente de entrada de fecha de GOV.UK
- Cuando los datos válidos son limitados, conviene usar un elemento
select
- Ayuda a evitar errores de entrada y reduce la interacción
- Hay que tener cuidado con la lectura incorrecta por parte de lectores de pantalla cuando el mes se muestra como número
- En reservas de viaje y otros casos con intervalos de tiempo fijos (por ejemplo, cada 15 minutos), resulta útil expresar fechas relativas como hoy o mañana
Entrada con máscara y validación
- Los campos de entrada con máscara son una alternativa para guiar el formato de fecha sin usar calendario
- Es posible validar y dar formato en el cliente con JavaScript
- Ejemplo: “Ingrese un día válido de febrero (1~28)” como mensaje de error
- La API
Intl permite dar formato automático a fechas
- Sin embargo, si JavaScript actualiza el valor introducido, la función de deshacer/rehacer puede romperse
- También es posible combinar visualmente varias entradas para que parezcan una sola mediante CSS
Selección de rangos y opciones limitadas
- Los selectores de rango de fechas que usan dos calendarios son difíciles de manipular e incómodos de usar sin puntero
- En su lugar, pueden simplificarse con dos campos de entrada
- Cuando solo se necesitan fechas seleccionables concretas, pueden sustituirse por un grupo de entradas
radio
- En lugar de una UI compleja, se organiza como una tarea simple por pasos
- Un formulario de varios pasos puede ampliarse con JavaScript hasta convertirse en una interacción de una sola página
Entrada libre y funciones de sugerencia
- Cuando no se necesita una fecha u hora exacta, una entrada de texto básica puede ser útil
- El elemento
datalist permite ofrecer sugerencias de entrada
- También funciona junto con los tipos de entrada
date y time
Preguntas frecuentes
Al usar frameworks de JavaScript
- Todos los frameworks principales permiten usar elementos HTML nativos
- No hace falta convertirlos en componentes personalizados
- Es posible enlazar el estado en ambos sentidos mediante la propiedad
value
Estilizar selectores de fecha nativos
- Solo algunas partes del elemento
input pueden estilizarse; el resto no
- Esto tiene la ventaja de mantener una UI del sistema familiar para el usuario
- El diseño cambia según el sistema operativo, el método de entrada y el navegador
- No hace falta forzar una uniformidad visual adicional
Cómo responder a interesados que exigen un selector de fecha en JavaScript
- El objetivo es enviar formularios con éxito, y una UI compleja aumenta los errores
- Todos los selectores de fecha presentan problemas de accesibilidad
- Las combinaciones de entradas nativas son más amigables para el usuario
- Una UI de JavaScript no verificada podría entrar en conflicto con normativas como la Ley Europea de Accesibilidad (EAA)
- La simplicidad es la clave del éxito
Pruebas y garantía de accesibilidad
- Es indispensable comprender las guías de accesibilidad como WCAG
- Aprovechar los estándares web ayuda a evitar errores de UI personalizada
- Es posible detectar errores con las funciones de accesibilidad de las herramientas de desarrollo del navegador
- No existe una herramienta perfecta, y las pruebas con usuarios reales son el único método de verificación
- Se desaconseja firmemente usar overlays de accesibilidad, ya que pueden empeorar los problemas
Materiales de referencia sobre accesibilidad
- Collecting dates in an accessible way — Graham Armfield
- What makes an accessible date picker? — Russ Weakley
- Maybe You Don’t Need a Date Picker — Adrian Roselli
- Date Picker Dialog Example — ARIA Authoring Practices Guide
- Designing The Perfect Date And Time Picker — Vitaly Friedman
Respuesta a solicitudes de recomendación de selectores de fecha en JavaScript
- No existe una solución universal; todos los selectores de fecha tienen limitaciones
- El propósito de esta guía es ayudar a evaluar los requisitos por cuenta propia
- Se recomienda alcanzar el objetivo con el método más simple posible
- Un selector de fecha no es necesariamente imprescindible
Conclusión
- Es indispensable probar con usuarios reales y recopilar retroalimentación
- Esta guía sigue en desarrollo y recibe con gusto comentarios
1 comentarios
Opiniones en Hacker News
Había comentarios reales como: “no puedo poner mi año de nacimiento” o “tuve que presionar la flecha del mes anterior 720 veces para llegar a mi cumpleaños”
Tanto en iOS como en Android, en ese momento el año se veía solo como un título, así que no se percibía como un elemento clicable
Me daba la impresión de que el Flat Design, centrado en lo estético, estaba arruinando la UX. Creo que el problema es que la UI de los sistemas operativos la terminan definiendo diseñadores, y no expertos en UX como Don Norman
Al final, cuando lo cambiamos a un formato de caja de texto-desplegable-caja de texto (día-mes-año), desaparecieron las quejas
Dicen que tres cajas de texto (día, mes, año) ofrecen la mejor experiencia.
También hay una guía de patrones para implementarlo
Pero al reservar un vuelo cerca de la medianoche, no queda claro si “hoy” se refiere a mi zona horaria, a la del servidor o a GMT
Hay demasiados casos límite: zonas horarias, horario de verano, fin de mes (31 de enero → ¿mes siguiente?), justo después de la medianoche, etc.
Hay que pensarlo muy bien antes de meter algo así
Cuando uno trabaja después de las 12 de la noche, la palabra “mañana” deja de coincidir con la sensación real del tiempo.
En la práctica significa “después de esta mañana”, pero el sistema ya lo interpreta como el día siguiente
input type="text"con una pista del formatoAsí te ahorras dolores de cabeza con navegadores, accesibilidad y problemas de locale
Los componentes personalizados sí que son la puerta al infierno. Por querer hacer algo bonito, terminas cayendo en diez madrigueras de conejo
Porque ahí necesitas explorar visualmente la fecha
Las fechas son realmente complejas, así que hace falta un enfoque según el caso de uso
Si estuvieras creando un sistema hospitalario en Nepal, tendrías que soportar tanto el calendario nepalí como el gregoriano. El calendario nepalí es muy complejo
Etiopía usa un calendario de 13 meses, donde el último mes tiene 5 o 6 días
Si alguien conoce buen material de referencia sobre un date picker internacionalizado de verdad, me gustaría saberlo
Por ejemplo, para una reserva de cena el calendario es útil porque permite ver la disponibilidad del fin de semana, pero para ingresar una fecha de nacimiento es más eficiente escribir números directamente
un proceso tipo “elegir nombre del mes → desplegable → elegir año” rompe el ritmo
Es mucho más natural simplemente escribir números. En móvil es peor todavía porque el teclado se abre y se cierra todo el tiempo
Es raro que te obliguen a usar un selector personalizado en vez de la UI nativa.
Sobre todo en Android, imitar en la web el selector de hora tipo rueda de iOS fue de lo peor
También hacen falta selectores por mes, por semana y de rangos personalizados. Los elementos de formulario nativos son demasiado limitados
<input type="week">o<input type="month">les falta algo aparte del soporte en Firefox