Formularios avanzados

El navegador ya sabe validar la mayoría de los casos comunes. Sin una línea de JavaScript.

El atributo type de un <input> no es solo cosmético: cada tipo trae su propio teclado en celular y su propia validación básica gratis.

Estos atributos le agregan reglas extra a cualquier campo: required lo hace obligatorio, minlength/maxlength limitan el largo del texto, y pattern exige una expresión regular —lo que ya viste en el módulo de JavaScript—.

El atributo title en el segundo campo es lo que el navegador muestra como pista cuando el patrón no calza. No es opcional en la práctica: sin eso, la persona solo ve "esto no cumple el formato" y no sabe cuál es.

CSS puede reaccionar solo, sin JavaScript, cuando un campo no cumple sus reglas: el pseudo-selector :invalid se activa automáticamente.

Ya usaste <label> envolviendo el input, que funciona. Pero la forma más flexible es conectarlos con for y un id que coincida: así el label puede ir en cualquier parte y el clic en el texto sigue enfocando el campo.

Tipos de input con validación incluida, required/pattern para reglas extra, :invalid para darles estilo sin JavaScript, y por qué conectar label con for/id importa de verdad.

Justamente de eso trata lo que sigue: hacer que tu página sea usable por cualquiera, no solo por quien ve y usa mouse.