<div class="search-box-container">
<div class="search-box-demo">
<div class="search-header">
<h2>Busca en Nuestro Sitio</h2>
<p>Encuentra lo que buscas rápidamente</p>
</div>
<div class="search-wrapper" id="searchWrapper">
<div class="search-box" id="searchBox">
<div class="search-icon">🔍</div>
<input type="text" class="search-input" id="searchInput" placeholder="Buscar productos, artículos o temas...">
<button class="clear-btn" id="clearBtn">×</button>
<button class="search-btn" id="searchBtn">Buscar</button>
</div>
<div class="suggestions-dropdown" id="suggestionsDropdown">
<div class="suggestion-group">
<div class="group-title">Búsquedas Populares</div>
<div class="suggestion-item" data-value="audífonos inalámbricos">
<span class="suggestion-icon">🎧</span>
<span class="suggestion-text">Audífonos Inalámbricos</span>
</div>
<div class="suggestion-item" data-value="teléfono inteligente">
<span class="suggestion-icon">📱</span>
<span class="suggestion-text">Teléfono Inteligente</span>
</div>
<div class="suggestion-item" data-value="computadora portátil">
<span class="suggestion-icon">💻</span>
<span class="suggestion-text">Computadora Portátil</span>
</div>
</div>
<div class="suggestion-group">
<div class="group-title">Búsquedas Recientes</div>
<div class="suggestion-item" data-value="altavoz bluetooth">
<span class="suggestion-icon">🔊</span>
<span class="suggestion-text">Altavoz Bluetooth</span>
</div>
<div class="suggestion-item" data-value="reloj inteligente">
<span class="suggestion-icon">⌚</span>
<span class="suggestion-text">Reloj Inteligente</span>
</div>
</div>
</div>
</div>
</div>
</div>
.search-box-container {
background: linear-gradient(135deg, #f8f9ff 0%, #ffffff 100%);
padding: 40px 20px;
border-radius: 20px;
max-width: 600px;
margin: 0 auto;
box-shadow: 0 15px 35px rgba(0, 0, 0, 0.05);
}
.search-box-demo {
background: white;
border-radius: 15px;
padding: 30px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.03);
}
.search-header {
text-align: center;
margin-bottom: 30px;
}
.search-header h2 {
margin: 0 0 10px 0;
color: #333;
font-size: 2rem;
font-weight: 700;
}
.search-header p {
color: #666;
font-size: 1.1rem;
margin: 0;
}
.search-wrapper {
position: relative;
}
.search-box {
position: relative;
display: flex;
align-items: center;
background: #f8fafc;
border: 2px solid #e2e8f0;
border-radius: 12px;
padding: 5px;
transition: all 0.3s ease;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
}
.search-box:focus-within {
border-color: #667eea;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
background: white;
}
.search-box.focused {
border-radius: 12px 12px 0 0;
}
.search-icon {
font-size: 1.3rem;
color: #999;
padding: 0 15px;
transition: color 0.3s ease;
}
.search-box:focus-within .search-icon {
color: #667eea;
}
.search-input {
flex: 1;
padding: 15px 0;
border: none;
background: transparent;
font-size: 1.1rem;
color: #333;
outline: none;
}
.search-input::placeholder {
color: #999;
}
.search-input:focus::placeholder {
color: #cbd5e1;
}
.clear-btn {
width: 36px;
height: 36px;
border: none;
background: #f1f5f9;
color: #999;
border-radius: 50%;
font-size: 1.2rem;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
margin: 0 5px;
opacity: 0;
visibility: hidden;
transform: scale(0.8);
}
.search-input:not(:placeholder-shown) + .clear-btn,
.search-input:focus + .clear-btn {
opacity: 1;
visibility: visible;
transform: scale(1);
}
.clear-btn:hover {
background: #e2e8f0;
color: #666;
transform: scale(1.1);
}
.search-btn {
padding: 15px 25px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 10px;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: all 0.3s ease;
margin-left: 5px;
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3);
}
.search-btn:hover {
transform: translateY(-2px);
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5);
}
.suggestions-dropdown {
position: absolute;
top: 100%;
left: 0;
right: 0;
background: white;
border: 2px solid #e2e8f0;
border-top: none;
border-radius: 0 0 12px 12px;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
opacity: 0;
visibility: hidden;
transform: translateY(-10px);
transition: all 0.3s ease;
z-index: 100;
max-height: 300px;
overflow-y: auto;
}
.search-box.focused + .suggestions-dropdown {
opacity: 1;
visibility: visible;
transform: translateY(0);
}
.suggestion-group {
padding: 15px 0;
border-bottom: 1px solid #f1f5f9;
}
.suggestion-group:last-child {
border-bottom: none;
}
.group-title {
padding: 0 20px 10px;
color: #667eea;
font-size: 0.85rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 1px;
}
.suggestion-item {
display: flex;
align-items: center;
gap: 15px;
padding: 12px 20px;
cursor: pointer;
transition: all 0.2s ease;
}
.suggestion-item:hover {
background: #f8fafc;
}
.suggestion-item.active {
background: #667eea;
color: white;
}
.suggestion-icon {
font-size: 1.2rem;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
}
.suggestion-text {
font-size: 1rem;
font-weight: 500;
}
.suggestion-item.active .suggestion-text {
color: white;
}
.recent-search {
display: flex;
align-items: center;
justify-content: space-between;
padding: 10px 20px;
border-bottom: 1px solid #f1f5f9;
}
.recent-search:last-child {
border-bottom: none;
}
.remove-search {
background: none;
border: none;
color: #999;
cursor: pointer;
font-size: 1.2rem;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
transition: all 0.2s ease;
}
.remove-search:hover {
background: #fee2e2;
color: #ef4444;
}
/* Animaciones */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
@keyframes slideInDown {
from {
opacity: 0;
transform: translateY(-20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.search-header {
animation: fadeInUp 0.6s ease-out;
}
.search-box {
animation: slideInDown 0.6s ease-out 0.2s both;
}
.suggestion-item {
animation: fadeInUp 0.3s ease-out;
}
.suggestion-item:nth-child(1) { animation-delay: 0.1s; }
.suggestion-item:nth-child(2) { animation-delay: 0.2s; }
.suggestion-item:nth-child(3) { animation-delay: 0.3s; }
/* Responsivo */
@media (max-width: 768px) {
.search-box-container {
padding: 30px 15px;
}
.search-box-demo {
padding: 25px;
}
.search-header h2 {
font-size: 1.7rem;
}
.search-input {
font-size: 1rem;
padding: 12px 0;
}
.search-btn {
padding: 12px 20px;
font-size: 0.9rem;
}
.search-icon {
font-size: 1.1rem;
padding: 0 12px;
}
.suggestions-dropdown {
max-height: 250px;
}
.suggestion-text {
font-size: 0.9rem;
}
}
@media (max-width: 480px) {
.search-box {
flex-direction: column;
gap: 10px;
padding: 15px;
}
.search-input {
width: 100%;
}
.search-controls {
display: flex;
width: 100%;
gap: 10px;
}
.clear-btn {
margin: 0;
}
.search-btn {
flex: 1;
margin: 0;
}
.suggestions-dropdown {
position: fixed;
top: auto;
bottom: 0;
left: 0;
right: 0;
height: 70vh;
border-radius: 20px 20px 0 0;
transform: translateY(100%);
}
.search-box.focused + .suggestions-dropdown {
transform: translateY(0);
}
}
document.addEventListener('DOMContentLoaded', function() {
// Obtener elementos del DOM
const searchWrapper = document.getElementById('searchWrapper');
const searchBox = document.getElementById('searchBox');
const searchInput = document.getElementById('searchInput');
const clearBtn = document.getElementById('clearBtn');
const searchBtn = document.getElementById('searchBtn');
const suggestionsDropdown = document.getElementById('suggestionsDropdown');
const suggestionItems = document.querySelectorAll('.suggestion-item');
const searchHeader = document.querySelector('.search-header');
let activeIndex = -1;
let recentSearches = [];
// Inicializar caja de búsqueda
function initSearchBox() {
loadRecentSearches();
setupEventListeners();
}
// Configurar escuchadores de eventos
function setupEventListeners() {
// Eventos de enfoque
searchInput.addEventListener('focus', function() {
searchBox.classList.add('focused');
loadRecentSearches();
});
searchInput.addEventListener('blur', function() {
// Retrasar ocultar para permitir hacer clic en sugerencias
setTimeout(() => {
searchBox.classList.remove('focused');
activeIndex = -1;
clearActiveSuggestion();
}, 200);
});
// Eventos de entrada
searchInput.addEventListener('input', function() {
const value = this.value.trim();
if (value) {
// Mostrar sugerencias basadas en entrada
filterSuggestions(value);
} else {
// Mostrar sugerencias predeterminadas
showDefaultSuggestions();
}
});
// Eventos de teclado
searchInput.addEventListener('keydown', function(e) {
handleKeyDown(e);
});
// Botón de limpiar
clearBtn.addEventListener('click', function() {
searchInput.value = '';
searchInput.focus();
showDefaultSuggestions();
});
// Botón de búsqueda
searchBtn.addEventListener('click', function() {
performSearch(searchInput.value.trim());
});
// Elementos de sugerencia
suggestionItems.forEach((item, index) => {
item.addEventListener('click', function() {
const value = this.getAttribute('data-value');
searchInput.value = value;
performSearch(value);
});
item.addEventListener('mouseenter', function() {
setActiveSuggestion(index);
});
});
// Hacer clic fuera para cerrar
document.addEventListener('click', function(e) {
if (!searchWrapper.contains(e.target)) {
searchBox.classList.remove('focused');
activeIndex = -1;
clearActiveSuggestion();
}
});
}
// Manejar eventos de teclado
function handleKeyDown(e) {
const items = Array.from(suggestionItems);
switch(e.key) {
case 'ArrowDown':
e.preventDefault();
activeIndex = (activeIndex + 1) % items.length;
setActiveSuggestion(activeIndex);
break;
case 'ArrowUp':
e.preventDefault();
activeIndex = (activeIndex - 1 + items.length) % items.length;
setActiveSuggestion(activeIndex);
break;
case 'Enter':
e.preventDefault();
if (activeIndex >= 0 && activeIndex < items.length) {
const value = items[activeIndex].getAttribute('data-value');
searchInput.value = value;
performSearch(value);
} else {
performSearch(searchInput.value.trim());
}
break;
case 'Escape':
searchBox.classList.remove('focused');
activeIndex = -1;
clearActiveSuggestion();
break;
}
}
// Establecer sugerencia activa
function setActiveSuggestion(index) {
clearActiveSuggestion();
if (index >= 0 && index < suggestionItems.length) {
suggestionItems[index].classList.add('active');
activeIndex = index;
}
}
// Limpiar sugerencia activa
function clearActiveSuggestion() {
suggestionItems.forEach(item => {
item.classList.remove('active');
});
}
// Filtrar sugerencias basadas en entrada
function filterSuggestions(query) {
// En una implementación real, esto haría una llamada a la API
// Para fines de demostración, filtraremos las sugerencias existentes
const lowerQuery = query.toLowerCase();
suggestionItems.forEach(item => {
const text = item.getAttribute('data-value').toLowerCase();
if (text.includes(lowerQuery)) {
item.style.display = 'flex';
} else {
item.style.display = 'none';
}
});
}
// Mostrar sugerencias predeterminadas
function showDefaultSuggestions() {
suggestionItems.forEach(item => {
item.style.display = 'flex';
});
}
// Realizar búsqueda
function performSearch(query) {
if (query) {
// Agregar a búsquedas recientes
addToRecentSearches(query);
// Mostrar estado de carga
searchBtn.classList.add('loading');
searchBtn.disabled = true;
// Simular proceso de búsqueda
setTimeout(() => {
// En una implementación real, esto redirigiría a resultados de búsqueda
alert(`Buscando: "${query}"\nEn una aplicación real, esto mostraría resultados de búsqueda.`);
// Restablecer estado del botón
searchBtn.classList.remove('loading');
searchBtn.disabled = false;
// Cerrar menú desplegable
searchBox.classList.remove('focused');
activeIndex = -1;
clearActiveSuggestion();
}, 1500);
}
}
// Cargar búsquedas recientes
function loadRecentSearches() {
// En una implementación real, esto cargaría desde localStorage o API
recentSearches = [
'altavoz bluetooth',
'reloj inteligente',
'audífonos inalámbricos'
];
// Actualizar búsquedas recientes en DOM
updateRecentSearches();
}
// Actualizar visualización de búsquedas recientes
function updateRecentSearches() {
const recentGroup = document.querySelector('.suggestion-group:last-child');
const groupTitle = recentGroup.querySelector('.group-title');
if (recentSearches.length > 0) {
groupTitle.textContent = 'Búsquedas Recientes';
// Actualizar elementos de búsqueda reciente
// (La implementación dependería de tus requisitos específicos)
} else {
groupTitle.textContent = 'No hay Búsquedas Recientes';
}
}
// Agregar a búsquedas recientes
function addToRecentSearches(query) {
// Eliminar si ya existe
const index = recentSearches.indexOf(query);
if (index > -1) {
recentSearches.splice(index, 1);
}
// Agregar al principio
recentSearches.unshift(query);
// Mantener solo las últimas 5
if (recentSearches.length > 5) {
recentSearches = recentSearches.slice(0, 5);
}
// Guardar en localStorage
try {
localStorage.setItem('recentSearches', JSON.stringify(recentSearches));
} catch (e) {
console.warn('No se pudieron guardar las búsquedas recientes en localStorage');
}
}
// Inicializar la caja de búsqueda
initSearchBox();
});