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 formularioplaceholder
: Muestra un texto de ayuda que desaparece al escribirvalue
: Establece un valor predeterminadomaxlength
: Limita el número máximo de caracteresrequired
: 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.
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://
ohttps://
) - 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
ymax
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
ymax
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 defectorequired
: 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 AMmax="17:00"
limita la hora máxima a las 5:00 PMvalue="12:00"
preselecciona las 12:00 PMstep="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
yvalue
esYYYY-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:
- Seleccionar una fecha para el evento
- Especificar una hora de inicio
- Opcionalmente establecer una fecha y hora de finalización
- 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 atributofor
- 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:
- Cargar una imagen de perfil con vista previa
- Seleccionar un color de tema personalizado
- Guardar una búsqueda predeterminada
- 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 incluirenctype="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
ycols
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 visiblescols
: número aproximado de caracteres visibles por líneamaxlength
: límite máximo de caracteres permitidosminlength
: número mínimo de caracteres requeridosreadonly
: hace que el contenido no sea editabledisabled
: desactiva completamente el elementorequired
: 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óndisabled
: desactiva todo el selectorautofocus
: 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 conreq.body.interests
- En Django: usar
name="interests"
y acceder como lista enrequest.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:
- Campos de texto básicos para información personal
- Un select simple para categorizar el asunto
- Un select múltiple para indicar intereses en servicios
- 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 atributofor
- 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