Categoría · Secciones de Características Nivel de Dificultad · Avanzado Publicado el · 10 de septiembre de 2025

Atracción Magnética FAQ

Un componente FAQ interactivo con efectos hover magnéticos y animaciones basadas en atracción

#FAQ #Magnético #Atracción #Interactivo #Hover #Física

Diseño Responsivo

Soporte para Modo Oscuro

No

líneas

428

Compatibilidad del Navegador

No

Vista Previa en Vivo

Interactúa con el componente sin salir de la página.

500px

Componente de Atracción Magnética FAQ

Un componente FAQ interactivo con efectos hover magnéticos y animaciones basadas en atracción para una experiencia de usuario inspirada en física.

Características

  • Atracción Magnética: Los elementos responden a la proximidad del cursor con efectos de atracción realistas
  • Animaciones Basadas en Física: Movimiento natural usando cálculos de distancia y propiedades de transformación
  • Transiciones Suaves: Animaciones elegantes para expandir y contraer elementos del FAQ
  • Retroalimentación Visual Dinámica: Cambios visuales indican el estado de atracción magnética
  • Optimizado para Rendimiento: Animaciones aceleradas por hardware para rendimiento suave de 60fps
  • Totalmente Responsive: Se adapta a todos los tamaños de pantalla manteniendo efectos magnéticos

Estructura HTML

<div class="magnetic-faq-container">
  <div class="faq-header">
    <h2 class="faq-title">Sistema FAQ Magnético</h2>
    <p class="faq-subtitle">Atrayendo respuestas con fuerza magnética</p>
  </div>
  
  <div class="faq-toggle">
    <span class="toggle-label">MENSUAL</span>
    <label class="switch">
      <input type="checkbox" id="billing-toggle">
      <span class="slider"></span>
    </label>
    <span class="toggle-label">ANUAL</span>
    <span class="discount-badge">AHORRA 30%</span>
  </div>
  
  <div class="faq-grid">
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Qué es el diseño de atracción magnética?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>El diseño de atracción magnética usa animaciones basadas en física para crear elementos interactivos que responden a la proximidad del cursor con efectos de atracción realistas.</p>
      </div>
    </div>
    
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Cómo funcionan los efectos magnéticos?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>Los efectos usan JavaScript para calcular la distancia del cursor y aplicar transformaciones CSS para crear comportamientos realistas de atracción y repulsión.</p>
      </div>
    </div>
    
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Están optimizados estos efectos para rendimiento?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>Sí, las animaciones usan aceleración por hardware y requestAnimationFrame eficiente para rendimiento suave de 60fps.</p>
      </div>
    </div>
    
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Puedo personalizar la fuerza de atracción?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>¡Absolutamente! El componente usa propiedades CSS personalizadas y parámetros JavaScript para fácil personalización de fuerza magnética y efectos.</p>
      </div>
    </div>
  </div>
</div>

Estilos CSS

.magnetic-faq-container {
  max-width: 1200px;
  margin: 2rem auto;
  padding: 2rem;
  font-family: 'Inter', sans-serif;
  background: #0f172a;
  position: relative;
  overflow: hidden;
  border-radius: 20px;
  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.5);
  min-height: 100vh;
}

.magnetic-faq-container::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: 
    radial-gradient(circle at 20% 30%, rgba(99, 102, 241, 0.1) 0%, transparent 40%),
    radial-gradient(circle at 80% 70%, rgba(139, 92, 246, 0.1) 0%, transparent 40%),
    radial-gradient(circle at 40% 80%, rgba(236, 72, 153, 0.1) 0%, transparent 30%);
  pointer-events: none;
  animation: float 15s ease-in-out infinite;
}

.faq-header {
  text-align: center;
  margin-bottom: 3rem;
  position: relative;
  z-index: 2;
}

.faq-title {
  font-size: 2.5rem;
  margin-bottom: 0.5rem;
  color: #e2e8f0;
  text-shadow: 0 2px 10px rgba(0, 0, 0, 0.3);
}

.faq-subtitle {
  color: #94a3b8;
  font-size: 1.1rem;
}

.faq-toggle {
  display: flex;
  justify-content: center;
  align-items: center;
  gap: 1rem;
  margin-bottom: 3rem;
  position: relative;
  z-index: 2;
}

.toggle-label {
  font-size: 1rem;
  color: #cbd5e1;
  font-weight: 500;
}

.switch {
  position: relative;
  display: inline-block;
  width: 60px;
  height: 30px;
}

.switch input {
  opacity: 0;
  width: 0;
  height: 0;
}

.slider {
  position: absolute;
  cursor: pointer;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  background: #1e293b;
  border: 1px solid #334155;
  transition: .4s;
  border-radius: 34px;
}

.slider:before {
  position: absolute;
  content: "";
  height: 22px;
  width: 22px;
  left: 4px;
  bottom: 3px;
  background: #6366f1;
  transition: .4s;
  border-radius: 50%;
  box-shadow: 0 2px 8px rgba(99, 102, 241, 0.5);
}

input:checked + .slider {
  background: #1e293b;
  border-color: #6366f1;
}

input:checked + .slider:before {
  transform: translateX(30px);
  background: #8b5cf6;
  box-shadow: 0 2px 10px rgba(139, 92, 246, 0.6);
}

.discount-badge {
  background: linear-gradient(135deg, #ec4899 0%, #f43f5e 100%);
  color: white;
  padding: 0.25rem 0.75rem;
  border-radius: 20px;
  font-size: 0.8rem;
  font-weight: 600;
  margin-left: 0.5rem;
  box-shadow: 0 4px 12px rgba(236, 72, 153, 0.4);
}

.faq-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
  gap: 2rem;
  position: relative;
  z-index: 2;
}

.faq-item {
  background: #1e293b;
  border: 1px solid #334155;
  border-radius: 16px;
  overflow: hidden;
  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  box-shadow: 0 8px 32px rgba(0, 0, 0, 0.3);
  position: relative;
  transform: translateZ(0);
  will-change: transform;
}

.faq-item::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(90deg, transparent, #6366f1, transparent);
  transform: translateX(-100%);
  animation: scan 3s linear infinite;
}

.faq-item:hover {
  background: #1e293b;
  border-color: #6366f1;
  box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4);
  transform: translateY(-5px);
}

.faq-item.magnetic-active {
  border-color: #8b5cf6;
  box-shadow: 0 0 20px rgba(139, 92, 246, 0.3);
}

.magnetic-dot {
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background: #6366f1;
  margin-right: 1rem;
  flex-shrink: 0;
  box-shadow: 0 0 8px #6366f1;
  transition: all 0.3s ease;
}

.faq-item.magnetic-active .magnetic-dot {
  background: #8b5cf6;
  transform: scale(1.3);
  box-shadow: 0 0 15px #8b5cf6;
}

.faq-question {
  display: flex;
  align-items: center;
  padding: 1.5rem;
  cursor: pointer;
  position: relative;
}

.faq-question h3 {
  margin: 0;
  font-size: 1.2rem;
  color: #e2e8f0;
  flex: 1;
  transition: color 0.3s ease;
}

.faq-item.magnetic-active .faq-question h3 {
  color: #8b5cf6;
}

.question-icon {
  font-size: 1.5rem;
  color: #94a3b8;
  transition: all 0.3s ease;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
}

.faq-item.magnetic-active .question-icon {
  color: #8b5cf6;
  transform: scale(1.2);
}

.faq-item.active .question-icon {
  transform: rotate(45deg);
}

.faq-item.magnetic-active.active .question-icon {
  transform: rotate(45deg) scale(1.2);
}

.faq-answer {
  padding: 0 1.5rem;
  max-height: 0;
  overflow: hidden;
  transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  background: #1e293b;
  border-top: 1px solid #334155;
}

.faq-item.active .faq-answer {
  padding: 0 1.5rem 1.5rem;
  max-height: 200px;
}

.faq-answer p {
  margin: 1rem 0 0 0;
  color: #cbd5e1;
  line-height: 1.6;
}

@keyframes float {
  0%, 100% {
    transform: translateY(0);
  }
  50% {
    transform: translateY(-20px);
  }
}

@keyframes scan {
  0% {
    transform: translateX(-100%);
  }
  100% {
    transform: translateX(100%);
  }
}

@media (max-width: 768px) {
  .magnetic-faq-container {
    padding: 1rem;
  }
  
  .faq-grid {
    grid-template-columns: 1fr;
    gap: 1.5rem;
  }
  
  .faq-title {
    font-size: 2rem;
  }
  
  .faq-question {
    padding: 1rem;
  }
  
  .faq-question h3 {
    font-size: 1rem;
  }
  
  .plan-name {
    font-size: 1.5rem;
  }
}

Funcionalidad JavaScript

document.addEventListener('DOMContentLoaded', function() {
  const toggle = document.getElementById('billing-toggle');
  const amounts = document.querySelectorAll('.amount');
  
  toggle.addEventListener('change', function() {
    amounts.forEach(amount => {
      if (this.checked) {
        amount.textContent = amount.getAttribute('data-yearly');
      } else {
        amount.textContent = amount.getAttribute('data-monthly');
      }
    });
  });
  
  // Magnetic effect functionality
  const faqItems = document.querySelectorAll('.faq-item[data-magnetic]');
  
  faqItems.forEach(item => {
    const question = item.querySelector('.faq-question');
    
    // FAQ accordion functionality
    question.addEventListener('click', () => {
      const isActive = item.classList.contains('active');
      
      // Close all other items
      faqItems.forEach(otherItem => {
        if (otherItem !== item) {
          otherItem.classList.remove('active');
        }
      });
      
      // Toggle current item
      if (isActive) {
        item.classList.remove('active');
      } else {
        item.classList.add('active');
      }
    });
    
    // Magnetic attraction effect
    const handleMouseMove = (e) => {
      const rect = item.getBoundingClientRect();
      const x = e.clientX - rect.left;
      const y = e.clientY - rect.top;
      const centerX = rect.width / 2;
      const centerY = rect.height / 2;
      const distanceX = x - centerX;
      const distanceY = y - centerY;
      const distance = Math.sqrt(distanceX * distanceX + distanceY * distanceY);
      const maxDistance = 200;
      
      if (distance < maxDistance) {
        const strength = 1 - (distance / maxDistance);
        const moveX = (distanceX / maxDistance) * strength * 15;
        const moveY = (distanceY / maxDistance) * strength * 15;
        
        item.style.transform = `translate(${moveX}px, ${moveY}px)`;
        item.classList.add('magnetic-active');
      } else {
        item.style.transform = 'translate(0, 0)';
        item.classList.remove('magnetic-active');
      }
    };
    
    const handleMouseLeave = () => {
      item.style.transform = 'translate(0, 0)';
      item.classList.remove('magnetic-active');
    };
    
    document.addEventListener('mousemove', handleMouseMove);
    item.addEventListener('mouseleave', handleMouseLeave);
  });
});

Guía de Implementación

  1. Copia la estructura HTML en tu proyecto
  2. Agrega los estilos CSS a tu hoja de estilos
  3. Incluye el código JavaScript en tu archivo de script
  4. Personaliza la fuerza magnética y efectos de atracción para que coincidan con tu marca
  5. Actualiza las preguntas y respuestas del FAQ para reflejar tus ofertas

El componente de atracción magnética FAQ presenta animaciones basadas en física que responden a la proximidad del cursor con efectos de atracción realistas. El diseño usa cálculos de distancia y propiedades de transformación CSS para crear movimiento natural, con retroalimentación visual que indica el estado de atracción magnética para una experiencia de usuario inmersiva.

HTML

62

líneas

CSS

293

líneas

JavaScript

73

líneas


                <div class="magnetic-faq-container">
  <div class="faq-header">
    <h2 class="faq-title">Sistema FAQ Magnético</h2>
    <p class="faq-subtitle">Atrayendo respuestas con fuerza magnética</p>
  </div>
  
  <div class="faq-toggle">
    <span class="toggle-label">MENSUAL</span>
    <label class="switch">
      <input type="checkbox" id="billing-toggle">
      <span class="slider"></span>
    </label>
    <span class="toggle-label">ANUAL</span>
    <span class="discount-badge">AHORRA 30%</span>
  </div>
  
  <div class="faq-grid">
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Qué es el diseño de atracción magnética?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>El diseño de atracción magnética usa animaciones basadas en física para crear elementos interactivos que responden a la proximidad del cursor con efectos de atracción realistas.</p>
      </div>
    </div>
    
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Cómo funcionan los efectos magnéticos?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>Los efectos usan JavaScript para calcular la distancia del cursor y aplicar transformaciones CSS para crear comportamientos realistas de atracción y repulsión.</p>
      </div>
    </div>
    
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Están optimizados estos efectos para rendimiento?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>Sí, las animaciones usan aceleración por hardware y requestAnimationFrame eficiente para rendimiento suave de 60fps.</p>
      </div>
    </div>
    
    <div class="faq-item" data-magnetic>
      <div class="faq-question">
        <div class="magnetic-dot"></div>
        <h3>¿Puedo personalizar la fuerza de atracción?</h3>
        <div class="question-icon">+</div>
      </div>
      <div class="faq-answer">
        <p>¡Absolutamente! El componente usa propiedades CSS personalizadas y parámetros JavaScript para fácil personalización de fuerza magnética y efectos.</p>
      </div>
    </div>
  </div>
</div>

              
62líneas
2375caracteres
HTMLIdioma

Fragmentos de Código Relacionados

Explora packs de plantillas

¿Necesitas bloques más grandes? Descubre landings y colecciones de componentes.

Abrir la biblioteca de plantillas →