Tipos de input tradicionales y nuevos

Intermedio
HTML
HTML
Actualizado: 01/05/2025

¡Desbloquea el curso completo!

IA
Ejercicios
Certificado
Entrar

Inputs básicos: text, password, checkbox, radio

Los formularios HTML son una parte fundamental de la interacción con el usuario en la web. Los elementos de entrada básicos permiten recopilar diferentes tipos de información de manera eficiente. Vamos a explorar los cuatro tipos de inputs más comunes y versátiles que forman la base de cualquier formulario.

Input de tipo texto

El input de tipo text es el más común y se utiliza para recoger texto de una sola línea como nombres, apellidos o cualquier dato textual breve.

<input type="text" name="username" placeholder="Enter your username">

Este elemento tiene varios atributos importantes:

  • name: Identifica el campo cuando se envía el formulario
  • placeholder: Muestra un texto de ayuda que desaparece al escribir
  • value: Establece un valor predeterminado
  • maxlength: Limita el número máximo de caracteres
  • required: Hace que el campo sea obligatorio

Un ejemplo más completo:

<label for="fullname">Full Name:</label>
<input type="text" id="fullname" name="fullname" 
       placeholder="John Doe" 
       maxlength="50" 
       required>

El atributo id junto con la etiqueta <label> mejora la accesibilidad y la experiencia de usuario, ya que permite hacer clic en la etiqueta para enfocar el campo.

Input de tipo password

El input de tipo password funciona de manera similar al de texto, pero oculta los caracteres que el usuario escribe, mostrando asteriscos o puntos en su lugar.

<label for="user-password">Password:</label>
<input type="password" id="user-password" name="password" 
       minlength="8" 
       required>

Características específicas del input password:

  • Oculta visualmente los caracteres introducidos
  • Puede incluir minlength para establecer una longitud mínima
  • Algunos navegadores ofrecen funciones de autocompletado o generación de contraseñas seguras

Para mejorar la seguridad, podemos añadir atributos adicionales:

<input type="password" id="user-password" name="password" 
       autocomplete="new-password" 
       minlength="8" 
       required>

El atributo autocomplete="new-password" ayuda a los navegadores a entender que se trata de un campo para una nueva contraseña, lo que puede activar funciones como generadores de contraseñas seguras.

Input de tipo checkbox

Los checkbox permiten al usuario seleccionar múltiples opciones de un grupo. Son ideales para listas donde se pueden elegir varias opciones simultáneamente.

<div class="checkbox-group">
    <p>Select your interests:</p>
    
    <input type="checkbox" id="coding" name="interests" value="coding">
    <label for="coding">Coding</label><br>
    
    <input type="checkbox" id="design" name="interests" value="design">
    <label for="design">Design</label><br>
    
    <input type="checkbox" id="marketing" name="interests" value="marketing">
    <label for="marketing">Marketing</label>
</div>

Características importantes:

  • Múltiples checkboxes pueden compartir el mismo name para agruparlos lógicamente
  • El atributo checked establece un checkbox como seleccionado por defecto
  • Cada checkbox necesita su propio id único para asociarlo con su etiqueta

Para preseleccionar una opción:

<input type="checkbox" id="coding" name="interests" value="coding" checked>
<label for="coding">Coding</label>

Input de tipo radio

Los botones de tipo radio permiten seleccionar una única opción de un grupo. Son perfectos para preguntas de opción única donde las opciones son mutuamente excluyentes.

<div class="radio-group">
    <p>Select your preferred contact method:</p>
    
    <input type="radio" id="email" name="contact" value="email" checked>
    <label for="email">Email</label><br>
    
    <input type="radio" id="phone" name="contact" value="phone">
    <label for="phone">Phone</label><br>
    
    <input type="radio" id="mail" name="contact" value="mail">
    <label for="mail">Physical mail</label>
</div>

Características clave:

  • Todos los botones radio de un mismo grupo deben compartir el mismo atributo name
  • Solo un botón radio del mismo grupo puede estar seleccionado a la vez
  • El atributo checked establece cuál está seleccionado por defecto

La principal diferencia con los checkbox es que los radio buttons son mutuamente excluyentes cuando comparten el mismo nombre.

Combinando inputs en un formulario

Veamos un ejemplo práctico que combina estos cuatro tipos de inputs básicos en un formulario de registro:

<form action="/register" method="post">
    <div class="form-group">
        <label for="username">Username:</label>
        <input type="text" id="username" name="username" required>
    </div>
    
    <div class="form-group">
        <label for="user-password">Password:</label>
        <input type="password" id="user-password" name="password" minlength="8" required>
    </div>
    
    <div class="form-group">
        <p>Select your role:</p>
        <input type="radio" id="student" name="role" value="student" checked>
        <label for="student">Student</label><br>
        
        <input type="radio" id="teacher" name="role" value="teacher">
        <label for="teacher">Teacher</label><br>
        
        <input type="radio" id="other" name="role" value="other">
        <label for="other">Other</label>
    </div>
    
    <div class="form-group">
        <p>I want to receive:</p>
        <input type="checkbox" id="newsletter" name="preferences" value="newsletter" checked>
        <label for="newsletter">Weekly newsletter</label><br>
        
        <input type="checkbox" id="updates" name="preferences" value="updates">
        <label for="updates">Product updates</label><br>
        
        <input type="checkbox" id="offers" name="preferences" value="offers">
        <label for="offers">Special offers</label>
    </div>
    
    <button type="submit">Register</button>
</form>

Este formulario muestra cómo los diferentes tipos de inputs trabajan juntos para recopilar información variada del usuario. La estructura con elementos <div> ayuda a organizar visualmente el formulario, aunque para una mejor presentación se recomienda añadir CSS.

Los inputs básicos son fundamentales para crear formularios funcionales, y aunque HTML5 ha introducido nuevos tipos especializados, estos cuatro tipos siguen siendo la base de la mayoría de los formularios web.

¿Te está gustando esta lección?

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

Inputs HTML5: email, url, tel, number, range

HTML5 introdujo nuevos tipos de inputs especializados que mejoran la experiencia del usuario y facilitan la validación de datos. Estos campos proporcionan funcionalidades específicas según el tipo de información que se espera recoger, adaptándose automáticamente en dispositivos móviles con teclados optimizados.

Input de tipo email

El input email está diseñado específicamente para recoger direcciones de correo electrónico y ofrece validación automática del formato.

<label for="user-email">Email address:</label>
<input type="email" id="user-email" name="email" placeholder="example@domain.com" required>

Características principales:

  • Valida automáticamente que el texto ingresado tenga formato de email (debe contener @ y un dominio)
  • En dispositivos móviles, muestra un teclado adaptado con acceso fácil a @ y .com
  • Puede usar el atributo multiple para permitir varias direcciones separadas por comas

Para aceptar múltiples direcciones:

<input type="email" id="recipients" name="recipients" 
       placeholder="example@domain.com, another@domain.com" 
       multiple>

Input de tipo url

El input url está optimizado para recoger direcciones web y valida que el formato sea correcto.

<label for="website">Your website:</label>
<input type="url" id="website" name="website" 
       placeholder="https://www.example.com">

Ventajas del input url:

  • Verifica que la entrada tenga formato de URL válida (debe incluir protocolo como http:// o https://)
  • En móviles, muestra un teclado con teclas útiles como / y .com
  • Mejora la experiencia de usuario al evitar envíos con formatos incorrectos

Para hacer la experiencia más amigable, podemos añadir un patrón específico:

<input type="url" id="website" name="website" 
       placeholder="https://www.example.com" 
       pattern="https://.*" 
       title="La URL debe comenzar con https://">

El atributo pattern permite definir una expresión regular para validación adicional, mientras que title muestra un mensaje de ayuda cuando la validación falla.

Input de tipo tel

El input tel está diseñado para recoger números telefónicos, aunque no impone un formato específico debido a la variedad de formatos internacionales.

<label for="phone">Phone number:</label>
<input type="tel" id="phone" name="phone" 
       placeholder="123-456-7890">

Características del input tel:

  • No realiza validación de formato por defecto (a diferencia de email y url)
  • En dispositivos móviles, muestra un teclado numérico
  • Se puede combinar con el atributo pattern para validar formatos específicos

Para validar un formato de teléfono específico:

<input type="tel" id="phone" name="phone" 
       placeholder="123-456-7890" 
       pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}" 
       title="Formato: XXX-XXX-XXXX">

Input de tipo number

El input number está optimizado para recoger valores numéricos y proporciona controles para incrementar/decrementar el valor.

<label for="quantity">Quantity:</label>
<input type="number" id="quantity" name="quantity" 
       min="1" max="100" step="1" value="1">

Características principales:

  • Muestra flechas para incrementar/decrementar el valor
  • Permite establecer valores mínimos (min) y máximos (max)
  • Define el incremento con el atributo step
  • En dispositivos móviles, muestra un teclado numérico

Un ejemplo práctico para un selector de edad:

<label for="age">Age:</label>
<input type="number" id="age" name="age" 
       min="18" max="120" step="1" value="25" 
       required>

Input de tipo range

El input range proporciona un control deslizante para seleccionar un valor numérico dentro de un rango definido.

<label for="volume">Volume:</label>
<input type="range" id="volume" name="volume" 
       min="0" max="100" value="50" step="1">

Características del input range:

  • Presenta una interfaz visual de deslizador
  • Requiere valores min y max para definir el rango
  • El atributo step controla los incrementos permitidos
  • Es ideal para selecciones donde el valor exacto es menos importante que el rango

Un problema común es que el usuario no puede ver el valor seleccionado. Podemos solucionarlo combinándolo con JavaScript:

<label for="price-range">Price range:</label>
<input type="range" id="price-range" name="price" 
       min="10" max="1000" step="10" value="500">
<output for="price-range" id="price-output">500</output>

<script>
const range = document.getElementById('price-range');
const output = document.getElementById('price-output');

range.addEventListener('input', function() {
    output.textContent = this.value;
});
</script>

Ejemplo práctico combinando inputs HTML5

Veamos un formulario de contacto que utiliza estos tipos de inputs especializados:

<form action="/contact" method="post">
    <div class="form-group">
        <label for="contact-name">Name:</label>
        <input type="text" id="contact-name" name="name" required>
    </div>
    
    <div class="form-group">
        <label for="contact-email">Email:</label>
        <input type="email" id="contact-email" name="email" required>
    </div>
    
    <div class="form-group">
        <label for="contact-phone">Phone (optional):</label>
        <input type="tel" id="contact-phone" name="phone" 
               placeholder="123-456-7890" 
               pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}">
    </div>
    
    <div class="form-group">
        <label for="contact-website">Website (optional):</label>
        <input type="url" id="contact-website" name="website" 
               placeholder="https://www.example.com">
    </div>
    
    <div class="form-group">
        <label for="contact-age">Age:</label>
        <input type="number" id="contact-age" name="age" 
               min="18" max="120" value="25">
    </div>
    
    <div class="form-group">
        <label for="contact-priority">Priority (1-10):</label>
        <input type="range" id="contact-priority" name="priority" 
               min="1" max="10" value="5">
        <output for="contact-priority" id="priority-output">5</output>
    </div>
    
    <button type="submit">Send Message</button>
</form>

<script>
document.getElementById('contact-priority').addEventListener('input', function() {
    document.getElementById('priority-output').textContent = this.value;
});
</script>

Este formulario muestra cómo los inputs HTML5 pueden trabajar juntos para crear una experiencia de usuario mejorada con validación incorporada y controles especializados.

Los inputs HTML5 ofrecen ventajas significativas sobre los inputs tradicionales:

  • Validación automática en el navegador sin necesidad de JavaScript
  • Teclados optimizados en dispositivos móviles según el tipo de dato
  • Mejora de accesibilidad al comunicar claramente el tipo de dato esperado
  • Interfaz de usuario mejorada con controles específicos para cada tipo de dato

Estos tipos de inputs son ampliamente compatibles con los navegadores modernos, aunque siempre es recomendable proporcionar validación adicional en el servidor.

Inputs de fecha y hora: date, time, datetime-local

HTML5 introdujo controles especializados para la selección de fechas y horas que simplifican enormemente la recolección de datos temporales en formularios web. Estos controles ofrecen interfaces visuales intuitivas que reemplazan las complejas combinaciones de selectores o inputs de texto que se usaban anteriormente.

Input de tipo date

El elemento <input type="date"> proporciona un selector de calendario que permite a los usuarios elegir una fecha específica de forma visual.

<label for="birth-date">Date of birth:</label>
<input type="date" id="birth-date" name="birth-date">

Este control presenta varias ventajas:

  • Muestra un selector de calendario que varía según el navegador y sistema operativo
  • Elimina errores de formato al garantizar una fecha válida
  • Permite establecer rangos de fechas permitidos mediante los atributos min y max

Para limitar la selección a un rango específico de fechas:

<label for="appointment">Select appointment date:</label>
<input type="date" id="appointment" name="appointment" 
       min="2023-01-01" max="2023-12-31" 
       value="2023-06-15">

Los atributos clave incluyen:

  • min: establece la fecha mínima seleccionable (formato YYYY-MM-DD)
  • max: establece la fecha máxima seleccionable (formato YYYY-MM-DD)
  • value: preselecciona una fecha por defecto
  • required: hace obligatoria la selección de una fecha

Input de tipo time

El elemento <input type="time"> permite a los usuarios seleccionar una hora específica mediante una interfaz especializada.

<label for="meeting-time">Meeting time:</label>
<input type="time" id="meeting-time" name="meeting-time">

Características principales:

  • Proporciona una interfaz para seleccionar horas y minutos
  • En algunos navegadores incluye controles de incremento/decremento
  • Acepta el formato de 24 horas (HH:MM)
  • En dispositivos móviles, suele mostrar un selector especializado

Podemos configurar este control para limitar las horas disponibles:

<label for="appointment-time">Select a time (9 AM - 5 PM):</label>
<input type="time" id="appointment-time" name="appointment-time" 
       min="09:00" max="17:00" 
       value="12:00" 
       step="1800">

En este ejemplo:

  • min="09:00" limita la hora mínima a las 9:00 AM
  • max="17:00" limita la hora máxima a las 5:00 PM
  • value="12:00" preselecciona las 12:00 PM
  • step="1800" establece incrementos de 30 minutos (1800 segundos)

Input de tipo datetime-local

El elemento <input type="datetime-local"> combina la funcionalidad de los controles de fecha y hora, permitiendo seleccionar ambos valores simultáneamente.

<label for="meeting-datetime">Meeting date and time:</label>
<input type="datetime-local" id="meeting-datetime" name="meeting-datetime">

Este control es especialmente útil cuando necesitamos capturar un momento específico en el tiempo:

  • Muestra un selector combinado de fecha y hora
  • Elimina problemas de zona horaria al capturar la fecha y hora local del usuario
  • Garantiza un formato consistente para el procesamiento posterior

Un ejemplo más completo:

<label for="event-start">Event start:</label>
<input type="datetime-local" id="event-start" name="event-start" 
       min="2023-06-01T08:00" max="2023-12-31T18:00" 
       value="2023-06-15T10:00">

Observaciones importantes:

  • El formato para los atributos min, max y value es YYYY-MM-DDThh:mm (nota la "T" que separa la fecha de la hora)
  • A diferencia del antiguo datetime (ahora obsoleto), este control no incluye información de zona horaria

Compatibilidad y alternativas

Aunque estos controles son extremadamente útiles, es importante considerar la compatibilidad entre navegadores:

<label for="fallback-date">Event date:</label>
<input type="date" id="fallback-date" name="event-date" 
       min="2023-06-01" max="2023-12-31" 
       placeholder="YYYY-MM-DD">

El atributo placeholder proporciona una pista sobre el formato esperado en navegadores que no soportan el control nativo.

Para una solución más robusta, podemos combinar estos controles con librerías JavaScript como Flatpickr o DatePicker cuando necesitemos garantizar una experiencia consistente:

<label for="enhanced-date">Select date:</label>
<input type="text" id="enhanced-date" name="event-date" class="datepicker" 
       placeholder="Select a date">

<!-- Código JavaScript para inicializar el datepicker (requiere incluir la librería) -->
<script>
document.addEventListener('DOMContentLoaded', function() {
    // Inicializar datepicker en navegadores sin soporte nativo
    if (!Modernizr.inputtypes.date) {
        $('.datepicker').datepicker({ 
            format: 'yyyy-mm-dd',
            autoclose: true
        });
    }
});
</script>

Ejemplo práctico: Formulario de reserva

Veamos un ejemplo práctico que combina estos tres tipos de inputs en un formulario de reserva:

<form action="/booking" method="post">
    <h2>Event Booking</h2>
    
    <div class="form-group">
        <label for="event-date">Event date:</label>
        <input type="date" id="event-date" name="event-date" 
               min="2023-06-01" max="2023-12-31" 
               required>
    </div>
    
    <div class="form-group">
        <label for="start-time">Start time:</label>
        <input type="time" id="start-time" name="start-time" 
               min="09:00" max="18:00" 
               required>
    </div>
    
    <div class="form-group">
        <label for="end-datetime">End date and time:</label>
        <input type="datetime-local" id="end-datetime" name="end-datetime" 
               min="2023-06-01T09:00" max="2023-12-31T18:00">
    </div>
    
    <div class="form-group">
        <label for="all-day">All day event:</label>
        <input type="checkbox" id="all-day" name="all-day">
    </div>
    
    <button type="submit">Book Event</button>
</form>

Este formulario permite a los usuarios:

  1. Seleccionar una fecha para el evento
  2. Especificar una hora de inicio
  3. Opcionalmente establecer una fecha y hora de finalización
  4. Marcar si es un evento de día completo

Consideraciones de accesibilidad

Para mejorar la accesibilidad de estos controles:

  • Siempre asocia cada input con una etiqueta <label> usando el atributo for
  • Proporciona instrucciones claras sobre el formato esperado
  • Considera añadir el atributo aria-describedby para vincular el input con instrucciones adicionales
<label for="delivery-date">Delivery date:</label>
<input type="date" id="delivery-date" name="delivery-date" 
       aria-describedby="date-help" 
       required>
<p id="date-help" class="form-hint">Select a date at least 3 days from today</p>

Procesamiento de datos

Al trabajar con estos controles, es importante entender los formatos de datos que generan:

  • date: devuelve una cadena en formato "YYYY-MM-DD"
  • time: devuelve una cadena en formato "HH:MM" (o "HH:MM:SS" si se usa el atributo step)
  • datetime-local: devuelve una cadena en formato "YYYY-MM-DDThh:mm" (o "YYYY-MM-DDThh:mm:ss")

Estos formatos son compatibles con el estándar ISO 8601, lo que facilita su procesamiento en el servidor:

// Ejemplo de procesamiento en JavaScript
document.querySelector('form').addEventListener('submit', function(e) {
    const dateValue = document.getElementById('event-date').value; // "2023-06-15"
    const timeValue = document.getElementById('start-time').value; // "14:30"
    const dateTimeValue = document.getElementById('end-datetime').value; // "2023-06-15T16:30"
    
    // Crear objetos Date a partir de los valores
    const eventDate = new Date(dateValue);
    const startDateTime = new Date(dateValue + 'T' + timeValue);
    const endDateTime = new Date(dateTimeValue);
    
    // Ahora puedes trabajar con estos objetos Date
    console.log('Event duration (hours):', 
                (endDateTime - startDateTime) / (1000 * 60 * 60));
});

Los controles de fecha y hora de HTML5 simplifican enormemente la recolección de información temporal en formularios web, proporcionando una experiencia de usuario mejorada y reduciendo errores de formato. Aunque la compatibilidad entre navegadores puede variar, estos elementos representan una mejora significativa sobre los métodos tradicionales de captura de fechas y horas.

Inputs especiales: color, file, hidden, search

HTML5 introdujo varios tipos de inputs especializados que resuelven necesidades específicas en el desarrollo web moderno. Estos controles proporcionan interfaces optimizadas para tareas concretas, mejorando la experiencia de usuario y simplificando la implementación para los desarrolladores.

Input de tipo color

El elemento <input type="color"> permite a los usuarios seleccionar un color mediante un selector visual, eliminando la necesidad de recordar o escribir códigos hexadecimales.

<label for="theme-color">Choose theme color:</label>
<input type="color" id="theme-color" name="theme-color" value="#3366ff">

Este control presenta características importantes:

  • Muestra un selector de color nativo del navegador (varía según el navegador y sistema operativo)
  • Devuelve el color seleccionado en formato hexadecimal (por ejemplo, #3366ff)
  • Permite establecer un color predeterminado mediante el atributo value

Un caso de uso práctico sería permitir a los usuarios personalizar elementos de la interfaz:

<div class="color-picker">
    <label for="text-color">Text color:</label>
    <input type="color" id="text-color" name="text-color" value="#000000">
    
    <label for="bg-color">Background color:</label>
    <input type="color" id="bg-color" name="bg-color" value="#ffffff">
</div>

<div id="preview" style="padding: 20px;">
    <p>This is a preview text</p>
</div>

<script>
document.getElementById('text-color').addEventListener('input', function() {
    document.getElementById('preview').style.color = this.value;
});

document.getElementById('bg-color').addEventListener('input', function() {
    document.getElementById('preview').style.backgroundColor = this.value;
});
</script>

Este ejemplo permite al usuario seleccionar colores para el texto y fondo, mostrando una vista previa en tiempo real.

Input de tipo file

El elemento <input type="file"> crea un control para seleccionar archivos del dispositivo del usuario, fundamental para la carga de documentos, imágenes y otros archivos.

<label for="profile-photo">Upload profile photo:</label>
<input type="file" id="profile-photo" name="profile-photo" accept="image/*">

Características principales:

  • Muestra un botón para seleccionar archivos que abre el explorador de archivos nativo
  • El atributo accept limita los tipos de archivos que se pueden seleccionar
  • Permite selección múltiple con el atributo multiple
  • No puede tener un valor predeterminado por razones de seguridad

Para permitir la selección de múltiples archivos con tipos específicos:

<label for="project-files">Upload project documents:</label>
<input type="file" id="project-files" name="project-files" 
       accept=".pdf,.doc,.docx,.txt" 
       multiple>
<small>Allowed formats: PDF, Word, and text files (Max 5MB each)</small>

El atributo accept puede recibir:

  • Extensiones de archivo: .jpg, .pdf, .docx
  • Tipos MIME: image/jpeg, application/pdf
  • Comodines: image/* (cualquier tipo de imagen)

Para mejorar la experiencia de usuario, podemos añadir una vista previa de la imagen seleccionada:

<div class="file-upload">
    <label for="image-upload">Select image:</label>
    <input type="file" id="image-upload" name="image" 
           accept="image/png, image/jpeg" 
           onchange="previewImage(this)">
    
    <div id="image-preview"></div>
</div>

<script>
function previewImage(input) {
    const preview = document.getElementById('image-preview');
    preview.innerHTML = '';
    
    if (input.files && input.files[0]) {
        const reader = new FileReader();
        
        reader.onload = function(e) {
            const img = document.createElement('img');
            img.src = e.target.result;
            img.style.maxWidth = '300px';
            img.style.marginTop = '10px';
            preview.appendChild(img);
        }
        
        reader.readAsDataURL(input.files[0]);
    }
}
</script>

Input de tipo hidden

El elemento <input type="hidden"> crea un campo invisible para el usuario pero que envía datos con el formulario. Es esencial para transmitir información que no debe ser modificada por el usuario.

<form action="/process" method="post">
    <input type="hidden" id="user-id" name="user-id" value="12345">
    <input type="hidden" id="timestamp" name="timestamp" value="1623845719">
    
    <!-- Otros campos visibles del formulario -->
    <label for="comment">Your comment:</label>
    <textarea id="comment" name="comment"></textarea>
    
    <button type="submit">Submit</button>
</form>

Usos comunes:

  • Mantener el estado de la sesión entre páginas
  • Enviar identificadores de registros que se están editando
  • Incluir tokens CSRF (Cross-Site Request Forgery) para seguridad
  • Almacenar datos calculados por JavaScript que deben enviarse al servidor

Un ejemplo práctico sería un formulario de edición que mantiene el ID del registro:

<form action="/update-product" method="post">
    <input type="hidden" name="product-id" value="78934">
    <input type="hidden" name="csrf-token" value="a8d7f9e3b2c1">
    
    <div class="form-group">
        <label for="product-name">Product name:</label>
        <input type="text" id="product-name" name="product-name" value="Wireless Headphones">
    </div>
    
    <div class="form-group">
        <label for="product-price">Price:</label>
        <input type="number" id="product-price" name="product-price" value="89.99" step="0.01">
    </div>
    
    <button type="submit">Update Product</button>
</form>

Input de tipo search

El elemento <input type="search"> está optimizado para la entrada de términos de búsqueda, con características específicas para esta función.

<form action="/search" method="get">
    <label for="site-search">Search the site:</label>
    <input type="search" id="site-search" name="q" 
           placeholder="Enter search terms..." 
           aria-label="Search through site content">
    <button type="submit">Search</button>
</form>

Características distintivas:

  • En muchos navegadores, muestra un botón de borrar (×) cuando contiene texto
  • En dispositivos móviles, puede mostrar un teclado optimizado para búsquedas
  • Estilísticamente puede tener bordes redondeados u otros estilos específicos según el navegador
  • Semánticamente comunica que se trata de un campo de búsqueda, mejorando la accesibilidad

Para crear una experiencia de búsqueda mejorada con sugerencias en tiempo real:

<div class="search-container">
    <label for="product-search">Find products:</label>
    <input type="search" id="product-search" name="search" 
           placeholder="Start typing..." 
           autocomplete="off">
    <div id="search-suggestions"></div>
</div>

<script>
document.getElementById('product-search').addEventListener('input', function() {
    const query = this.value.trim();
    const suggestions = document.getElementById('search-suggestions');
    
    if (query.length < 2) {
        suggestions.innerHTML = '';
        return;
    }
    
    // En una aplicación real, aquí harías una petición AJAX
    // Este es solo un ejemplo simplificado
    const mockResults = [
        'Product: ' + query + ' Pro',
        'Product: ' + query + ' Max',
        'Product: ' + query + ' Ultra'
    ];
    
    suggestions.innerHTML = '';
    mockResults.forEach(result => {
        const div = document.createElement('div');
        div.textContent = result;
        div.className = 'suggestion';
        div.addEventListener('click', function() {
            document.getElementById('product-search').value = this.textContent;
            suggestions.innerHTML = '';
        });
        suggestions.appendChild(div);
    });
});
</script>

Ejemplo práctico: Formulario de personalización

Veamos un ejemplo que combina estos inputs especiales en un formulario de personalización de perfil:

<form action="/update-profile" method="post" enctype="multipart/form-data">
    <!-- Campo oculto para ID de usuario -->
    <input type="hidden" name="user-id" value="user_12345">
    <input type="hidden" name="form-version" value="1.2">
    
    <div class="form-section">
        <h3>Profile Information</h3>
        
        <div class="form-group">
            <label for="profile-picture">Profile picture:</label>
            <input type="file" id="profile-picture" name="profile-picture" 
                   accept="image/jpeg, image/png" 
                   onchange="previewImage(this)">
            <div id="image-preview"></div>
        </div>
        
        <div class="form-group">
            <label for="profile-color">Profile theme color:</label>
            <input type="color" id="profile-color" name="profile-color" value="#4a90e2">
            <span id="color-hex">#4a90e2</span>
        </div>
    </div>
    
    <div class="form-section">
        <h3>Search Preferences</h3>
        
        <div class="form-group">
            <label for="saved-search">Save a default search:</label>
            <input type="search" id="saved-search" name="default-search" 
                   placeholder="Enter your most common search...">
        </div>
    </div>
    
    <button type="submit">Save Profile</button>
</form>

<script>
// Mostrar vista previa de la imagen
function previewImage(input) {
    const preview = document.getElementById('image-preview');
    preview.innerHTML = '';
    
    if (input.files && input.files[0]) {
        const reader = new FileReader();
        reader.onload = function(e) {
            const img = document.createElement('img');
            img.src = e.target.result;
            img.style.maxWidth = '150px';
            img.style.borderRadius = '50%';
            preview.appendChild(img);
        }
        reader.readAsDataURL(input.files[0]);
    }
}

// Actualizar el valor hexadecimal mostrado
document.getElementById('profile-color').addEventListener('input', function() {
    document.getElementById('color-hex').textContent = this.value;
});
</script>

Este formulario permite a los usuarios:

  1. Cargar una imagen de perfil con vista previa
  2. Seleccionar un color de tema personalizado
  3. Guardar una búsqueda predeterminada
  4. Todo mientras se mantienen datos ocultos necesarios para el procesamiento del servidor

Consideraciones importantes

Al trabajar con estos inputs especiales, ten en cuenta:

  • Para input type="file", el formulario debe incluir enctype="multipart/form-data" para que los archivos se envíen correctamente
  • Los campos hidden no son seguros para información sensible, ya que son visibles en el código fuente
  • El soporte para input type="color" varía entre navegadores; algunos muestran un selector simple, otros uno más complejo
  • Para mejorar la accesibilidad, siempre asocia etiquetas con los inputs y proporciona textos descriptivos

Estos inputs especiales amplían significativamente las capacidades de los formularios HTML, permitiendo interfaces más intuitivas y funcionales sin depender de JavaScript para funcionalidades básicas. Aprovecha estos controles nativos para mejorar la experiencia de usuario y simplificar el desarrollo de tus aplicaciones web.

Textarea y selector simple y selector múltiple

Los formularios HTML no solo se componen de inputs tradicionales, sino que también incluyen elementos más versátiles para la entrada de datos. Los elementos textarea, select y select múltiple ofrecen funcionalidades específicas para recopilar información más compleja o estructurada del usuario.

Textarea

El elemento <textarea> permite a los usuarios introducir texto en múltiples líneas, ideal para comentarios, descripciones o cualquier contenido extenso.

<label for="message">Your message:</label>
<textarea id="message" name="message" rows="5" cols="40" placeholder="Write your message here..."></textarea>

A diferencia del input de tipo text, el textarea ofrece características específicas:

  • Permite múltiples líneas de texto
  • Es redimensionable por el usuario (en la mayoría de navegadores)
  • Se configura mediante los atributos rows y cols para definir su tamaño inicial
  • El contenido predeterminado se coloca entre las etiquetas de apertura y cierre

Para un textarea con contenido predeterminado:

<label for="bio">About yourself:</label>
<textarea id="bio" name="bio" rows="4" cols="50">I am a web developer with experience in HTML, CSS and JavaScript.</textarea>

Atributos importantes del textarea:

  • rows: número de líneas visibles
  • cols: número aproximado de caracteres visibles por línea
  • maxlength: límite máximo de caracteres permitidos
  • minlength: número mínimo de caracteres requeridos
  • readonly: hace que el contenido no sea editable
  • disabled: desactiva completamente el elemento
  • required: hace obligatorio completar el campo

Un ejemplo más completo:

<div class="form-group">
    <label for="feedback">Detailed feedback:</label>
    <textarea id="feedback" name="feedback" 
              rows="6" cols="50" 
              minlength="20" maxlength="500" 
              placeholder="Please provide at least 20 characters of feedback..." 
              required></textarea>
    <small>Between 20 and 500 characters</small>
</div>

Select (selector simple)

El elemento <select> crea un menú desplegable que permite al usuario elegir una opción de una lista predefinida. Es ideal cuando hay un conjunto limitado de opciones posibles.

<label for="country">Select your country:</label>
<select id="country" name="country">
    <option value="">--Please choose an option--</option>
    <option value="us">United States</option>
    <option value="ca">Canada</option>
    <option value="mx">Mexico</option>
    <option value="uk">United Kingdom</option>
    <option value="fr">France</option>
    <option value="es">Spain</option>
</select>

Características principales:

  • Cada opción se define con el elemento <option>
  • El atributo value determina el valor que se enviará al servidor
  • El texto entre las etiquetas <option> es lo que ve el usuario
  • Se puede preseleccionar una opción con el atributo selected
  • Las opciones pueden organizarse en grupos con <optgroup>

Para preseleccionar una opción:

<label for="language">Preferred language:</label>
<select id="language" name="language">
    <option value="en">English</option>
    <option value="es" selected>Spanish</option>
    <option value="fr">French</option>
    <option value="de">German</option>
</select>

Para agrupar opciones relacionadas:

<label for="car-model">Choose a car model:</label>
<select id="car-model" name="car-model">
    <optgroup label="European">
        <option value="volvo">Volvo</option>
        <option value="mercedes">Mercedes</option>
        <option value="audi">Audi</option>
    </optgroup>
    <optgroup label="American">
        <option value="ford">Ford</option>
        <option value="chevrolet">Chevrolet</option>
        <option value="dodge">Dodge</option>
    </optgroup>
    <optgroup label="Asian">
        <option value="toyota">Toyota</option>
        <option value="honda">Honda</option>
        <option value="nissan">Nissan</option>
    </optgroup>
</select>

Atributos importantes del select:

  • size: determina cuántas opciones son visibles a la vez (por defecto es 1)
  • required: hace obligatoria la selección de una opción
  • disabled: desactiva todo el selector
  • autofocus: enfoca automáticamente el selector al cargar la página

Select múltiple

El elemento <select> con el atributo multiple permite a los usuarios seleccionar varias opciones simultáneamente de una lista.

<label for="skills">Select your skills (hold Ctrl/Cmd to select multiple):</label>
<select id="skills" name="skills" multiple size="5">
    <option value="html">HTML</option>
    <option value="css">CSS</option>
    <option value="js">JavaScript</option>
    <option value="php">PHP</option>
    <option value="python">Python</option>
    <option value="ruby">Ruby</option>
    <option value="java">Java</option>
</select>

Características específicas:

  • El atributo multiple permite seleccionar varias opciones
  • El atributo size es especialmente útil para mostrar más opciones a la vez
  • Los usuarios deben mantener presionada la tecla Ctrl (o Cmd en Mac) para seleccionar múltiples opciones
  • Los valores seleccionados se envían como un array al servidor
  • Es recomendable incluir instrucciones para que los usuarios sepan cómo seleccionar múltiples opciones

Para preseleccionar varias opciones:

<label for="interests">Areas of interest:</label>
<select id="interests" name="interests" multiple size="4">
    <option value="tech" selected>Technology</option>
    <option value="science">Science</option>
    <option value="art" selected>Art</option>
    <option value="sports">Sports</option>
    <option value="music">Music</option>
    <option value="literature">Literature</option>
</select>

Es importante tener en cuenta que para que el servidor reciba correctamente múltiples valores, el nombre del select debe incluir corchetes en formularios procesados con PHP:

<select id="interests" name="interests[]" multiple>

Consideraciones de nombre en selects múltiples

Cuando trabajamos con selects múltiples, el nombre del elemento es crucial para el procesamiento correcto en el servidor:

  • En PHP: usar name="interests[]" para recibir un array de valores
  • En Node.js/Express: usar name="interests" y procesar con req.body.interests
  • En Django: usar name="interests" y acceder como lista en request.POST.getlist('interests')

Estilización y mejora de usabilidad

Los elementos textarea y select pueden estilizarse con CSS para mejorar su apariencia:

textarea {
    resize: vertical; /* Permite redimensionar solo verticalmente */
    min-height: 100px;
    padding: 10px;
    font-family: inherit;
    border: 1px solid #ccc;
    border-radius: 4px;
}

select {
    padding: 8px;
    border: 1px solid #ccc;
    border-radius: 4px;
    background-color: white;
    width: 100%;
    max-width: 300px;
}

select[multiple] {
    height: auto;
    min-height: 150px;
}

Para mejorar la usabilidad de los selects múltiples, que pueden resultar poco intuitivos para algunos usuarios, podemos usar JavaScript para crear interfaces más amigables:

<div class="form-group">
    <label>Select technologies you know:</label>
    <div class="checkbox-group" id="tech-options">
        <div>
            <input type="checkbox" id="tech-html" name="technologies[]" value="html">
            <label for="tech-html">HTML</label>
        </div>
        <div>
            <input type="checkbox" id="tech-css" name="technologies[]" value="css">
            <label for="tech-css">CSS</label>
        </div>
        <div>
            <input type="checkbox" id="tech-js" name="technologies[]" value="js">
            <label for="tech-js">JavaScript</label>
        </div>
        <div>
            <input type="checkbox" id="tech-php" name="technologies[]" value="php">
            <label for="tech-php">PHP</label>
        </div>
    </div>
</div>

Esta alternativa con checkboxes es más intuitiva para selecciones múltiples que el select con atributo multiple.

Ejemplo práctico: Formulario de contacto completo

Veamos un ejemplo que combina textarea y selects en un formulario de contacto completo:

<form action="/submit-contact" method="post">
    <div class="form-group">
        <label for="name">Full Name:</label>
        <input type="text" id="name" name="name" required>
    </div>
    
    <div class="form-group">
        <label for="email">Email Address:</label>
        <input type="email" id="email" name="email" required>
    </div>
    
    <div class="form-group">
        <label for="subject">Subject:</label>
        <select id="subject" name="subject" required>
            <option value="">--Select a subject--</option>
            <option value="general">General Inquiry</option>
            <option value="support">Technical Support</option>
            <option value="billing">Billing Question</option>
            <option value="feedback">Website Feedback</option>
        </select>
    </div>
    
    <div class="form-group">
        <label for="services">Services you're interested in:</label>
        <select id="services" name="services[]" multiple size="4">
            <option value="web">Web Development</option>
            <option value="mobile">Mobile Apps</option>
            <option value="design">UI/UX Design</option>
            <option value="seo">SEO Optimization</option>
            <option value="marketing">Digital Marketing</option>
        </select>
        <small>Hold Ctrl/Cmd to select multiple options</small>
    </div>
    
    <div class="form-group">
        <label for="message">Your Message:</label>
        <textarea id="message" name="message" rows="6" cols="50" 
                  placeholder="Please describe your needs in detail..." 
                  required></textarea>
    </div>
    
    <button type="submit">Send Message</button>
</form>

Este formulario combina:

  1. Campos de texto básicos para información personal
  2. Un select simple para categorizar el asunto
  3. Un select múltiple para indicar intereses en servicios
  4. Un textarea para el mensaje detallado

Accesibilidad y buenas prácticas

Para garantizar que estos elementos sean accesibles para todos los usuarios:

  • Siempre asocia cada elemento con una etiqueta <label> usando el atributo for
  • Proporciona instrucciones claras, especialmente para selects múltiples
  • Usa el atributo aria-describedby para vincular elementos con instrucciones adicionales
  • Asegúrate de que el contraste de color sea suficiente
  • Verifica que los elementos sean navegables mediante teclado
<div class="form-group">
    <label for="feedback-message">Your feedback:</label>
    <textarea id="feedback-message" name="feedback" 
              rows="5" 
              aria-describedby="feedback-help" 
              required></textarea>
    <p id="feedback-help" class="form-hint">Please be specific and constructive with your feedback.</p>
</div>

Los elementos textarea y select son componentes fundamentales en formularios HTML que permiten recopilar información más compleja y estructurada que los inputs básicos. Cuando se implementan correctamente, ofrecen una experiencia de usuario intuitiva y eficiente para la entrada de datos.

Aprendizajes de esta lección

  • Comprender los tipos básicos de inputs HTML: text, password, checkbox y radio.
  • Conocer los inputs HTML5 especializados: email, url, tel, number y range, y sus ventajas.
  • Aprender a utilizar inputs de fecha y hora: date, time y datetime-local, con sus atributos y formatos.
  • Explorar inputs especiales como color, file, hidden y search, y sus casos de uso.
  • Entender el uso y características de textarea y select (simple y múltiple) para entrada de datos más complejos.

Completa HTML y certifícate

Únete a nuestra plataforma y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración