Cerrar video

Cómo crear una sección de servicios con iconos flotantes en una composición circular con divi sin plugins

por | Nov 30, 2023 | Tutorial gratuito | 15 Comentarios

En este tutorial gratuito aprenderás a crear una sección de servicios con iconos flotantes en una composición circular con divi sin plugins (ver demo).

La composición consta de una sección que incluye una fila con dos columnas. En la primera columna, tenemos un círculo central con iconos distribuidos alrededor. Cada icono representa un servicio y presenta un efecto hover; al desplazar el cursor sobre cada icono, se revela la información correspondiente dentro del círculo de la columna 1.

Mientras que en la segunda columna, se encuentra únicamente un título acompañado de una breve descripción general de los servicios. Además, se incluye un botón como llamada a la acción.

Cómo crear una sección de servicios con iconos flotantes en una composición circular con divi sin plugins

Este tipo de composición y funcionalidad no solo puede aplicarse a servicios, sino que también permite mostrar cualquier tipo de información que necesites con dicha disposición. Por ejemplo, puede ser utilizada para mostrar características, testimonios, una sección de equipo, entre otras opciones. En resumen, esta composición es versátil y adaptable a casi cualquier tipo de información; aquí dependerá más de tu creatividad.

Por cierto, esta composición se visualiza perfectamente en computadoras, tabletas y celulares.

En el transcurso de este tutorial vamos a requerir de algunos fragmentos de código CSS y JS que te voy a compartir a continuación para que llegado el momento solamente los copies y pegues:

1. Estilos CSS para convertir la columna 1 en un circulo:

width: 460px !important;
min-width: 460px;
height: 460px;
border-radius: 100%;
border: 1px solid #DFE2EE;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;

2. Estilos CSS para los iconos:

width: 22%;
height: 22%;
background: #ffffff;
background: linear-gradient(135deg, #ffffff 0%, #ffffff 100%);
border-radius: 100px;
box-shadow: 0px 6px 13px rgba(145, 145, 145, 0.2);
display: flex;
align-items: center;
justify-content: center;
transition: 0.6s;
cursor: pointer;

3. Estilos CSS Generales:

/* Estilos OV Circular */
.ov-info-circular { 
  position: absolute;
  top: 0;
  width: 100%;
  max-width: 60%;
  height: 100%;
  display: flex;
  flex-direction: column;
  justify-content: center;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.6s ease, visibility 0.6s ease;
}
.ov-info-circular.open { 
  opacity: 1 !important;
  visibility: visible !important;
}

.ov-icono-circular:hover,
.ov-icono-circular.active {
  background:linear-gradient(135deg, #C56CD6 0%,#4741D7 100%) !important;
}
.ov-icono-circular:hover .et-pb-icon,
.ov-icono-circular.active .et-pb-icon {
  color: #ffffff !important;
}

4. Código JavaScript para aplicar la funcionalidad:

<script>
document.addEventListener("DOMContentLoaded", function () {
    const iconoCircular = document.querySelectorAll(".ov-icono-circular");
    const infoCircular = document.querySelectorAll(".ov-info-circular");
    let infoActual = null;

    infoCircular[0].classList.add("open");
    infoActual = infoCircular[0];

    iconoCircular[0].classList.add("active");

    function handleEvent(index) {
        iconoCircular.forEach((ic) => {
            ic.classList.remove("active");
        });

        iconoCircular[index].classList.add("active");

        if (infoActual) {
            infoActual.classList.remove("open");
        }

        infoCircular[index].classList.add("open");
        infoActual = infoCircular[index];
    }

    // Agregar el evento según el tipo de dispositivo
    iconoCircular.forEach((icon, index) => {
        if ('ontouchstart' in window || navigator.maxTouchPoints) {
            icon.addEventListener("click", function (e) {
                e.stopPropagation();
                handleEvent(index);
            });
        } else {
            icon.addEventListener("mouseover", function () {
                handleEvent(index);
            });
        }
    });

    document.addEventListener("click", function (e) {
        let isInfoCircularClicked = false;

        infoCircular.forEach((info) => {
            if (info.contains(e.target) || e.target === info) {
                isInfoCircularClicked = true;
            }
        });

        if (!isInfoCircularClicked) {
            return;
        }
    });
});
</script>

Descarga la demo del ejercicio haciendo click en el botón de abajo, es completamente gratis pero si deseas donarme un café será bien recibido 😋


Descargar JSON desde

¿Te ha gustado este tutorial? 🚀

¡Los Tutoriales Premium te van a encantar! Desde solo $12 USD al mes accede a más de 200 (¡y contando!) tutoriales únicos y exclusivos sobre Divi y WordPress. ¡Únete ahora y aumenta al 200% tus habilidades de diseño web con Divi!

Tutoriales Relacionados

15 Comentarios

  1. Markho Dietsch

    Hola excelente el tutorial, pero no me mantiene el circulo en los iconos cuando lo hago con imagenes png, habla alguna solución.

    gracias!

    Responder
    • Oscar Viedma

      Hola Markho, ¿Cuál es el link de tu ejercicio? Lo inspecciono para saber que sucede por fa.

      Saludos

      Responder
  2. Lorena Ramirez

    Hola Oscar, gracias por haber respondido por youtube, lo del desborde ya lo solucione. Extrañamente era el menu de Divi. Pero lo que si sigue fallando es el tamaño en movil y el hover en desktop. Este es el proyecto. De antemano mil gracias
    https://www.emprendeconcristina.com/sobre-mi/
    Te reenvio por aqui porque no se si youtube apruebe colocar la url

    Responder
    • Oscar Viedma

      Hola Lorena, estoy revisando tu web y veo bien el tamaño en todas las resoluciones. El hover en escritorio también logro verlo bien.

      ¿Ya lograste solucionar estos detalles?

      Responder
  3. CARLOS

    hola Oscar, buenos dias mira mi comentario no tiene nada que ver con el tutorial necesito que te pongas en contacto conmigo, tengo unas dudas que quiero que me aclares antes de suscribirme a los tutoriales de pago buen dia.

    Responder
    • Oscar Viedma

      Hola Carlos, no sé si ya hemos hablado. Pero en la página de suscripción tienes un chat por el cual podemos charlar 🙂

      Responder
  4. Patricia

    Buenas tardes,
    ¿Cómo podría poner mis propios iconos personalizados? Teniendo en cuenta el módulo únicamente deja seleccionar los propios iconos que aporta divi. Gracias, un saludo!

    Responder
    • Oscar Viedma

      Hola Patricia, puedes probar usando el módulo «imagen» en lugar del módulo «icono». Desde el módulo imagen puedes cargar cualquier icono en formato png o jpg que desees.

      Responder
  5. irene

    Hola Oscar, me gustaría saber cómo podría integrar mis propios iconos en este tipo de sección circular.

    Responder
    • Oscar Viedma

      Hola Irene, no sé si seas «Patricia» porque me ha preguntado lo mismo jeje. Aquí dejo mi respuesta también: puedes probar usando el módulo «imagen» en lugar del módulo «icono». Desde el módulo imagen puedes cargar cualquier icono en formato png o jpg que desees.

      Responder
  6. Francisco

    Hola Oscar, he hecho dos secciones con los iconos flotantes en la misma pagina, el problema es que en la segunda seccion no se muestra de inicio el texto en el centro, solo se muestra en la primera seccion, incluso si hago dos secciones, una visible para pc y otra visible para tablet y movil, solo se muestra el icono activo y el mensaje en el centro en la primera seccion, o en la seccion que esta mas arriba, solo funciona una sección, no funcionan las dos secciones a la vez, te dejo el link para que veas el problema. Como se podría activar en las dos secciones el icono con el texto en el centro? Gracias

    Responder
    • Oscar Viedma

      Hola Francisco, entiendo. Para que sea compatible con más de dos secciones tienes que hacer lo siguiente:

      1. A cada sección le vas a aplicar la clase «ov-seccion-circular» (sin comillas). Desde ajustes de la sección / Avanzado / ID y Clases de CSS / Clase CSS…

      2. El código de la funcionalidad JavaScript lo vas a agregar una sola vez hasta el final de tu página. Pero ahora va ser este:

      <script>
      document.addEventListener("DOMContentLoaded", function () {
          // Seleccionar todas las secciones
          const secciones = document.querySelectorAll(".ov-seccion-circular");
          
          // Aplicar la funcionalidad a cada sección independientemente
          secciones.forEach((seccion) => {
              const iconoCircular = seccion.querySelectorAll(".ov-icono-circular");
              const infoCircular = seccion.querySelectorAll(".ov-info-circular");
              let infoActual = null;
              
              // Activar el primero por defecto
              if (infoCircular[0]) {
                  infoCircular[0].classList.add("open");
                  infoActual = infoCircular[0];
                  iconoCircular[0].classList.add("active");
              }
              
              function handleEvent(index) {
                  iconoCircular.forEach((ic) => {
                      ic.classList.remove("active");
                  });
                  iconoCircular[index].classList.add("active");
                  
                  if (infoActual) {
                      infoActual.classList.remove("open");
                  }
                  infoCircular[index].classList.add("open");
                  infoActual = infoCircular[index];
              }
              
              // Agregar eventos
              iconoCircular.forEach((icon, index) => {
                  if ('ontouchstart' in window || navigator.maxTouchPoints) {
                      icon.addEventListener("click", function (e) {
                          e.stopPropagation();
                          handleEvent(index);
                      });
                  } else {
                      icon.addEventListener("mouseover", function () {
                          handleEvent(index);
                      });
                  }
              });
          });
      });
      </script>
      

      Con esto debe quedar. Cualquier cosa me dices por fa.

      Saludos

      Responder
  7. Narce Coss

    Hola, no me permite cambiar las dimensiones vw en el tamaño en modo para movil se queda igual todo en pixeles, de ahi en fuera todo esta super bien.

    Responder
    • Oscar Viedma

      Hola, Narce. ¿Qué versión de Divi estás utilizando, la 4 o la 5? Te pregunto porque en Divi 4, para ajustar el tamaño en dispositivos móviles, debes posicionarte sobre la opción, hacer clic en el icono del teléfono y seleccionar la vista móvil. ¿Lo estás realizando de esa manera? Saludos.

      Responder

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tutoriales Exclusivos

Tutoriales exclusivos OV Divi

Lleva tus sitios web creados con divi al siguiente nivel.

Accede a tutoriales exclusivos y únicos de divi y saca el máximo provecho del mejor tema y constructor visual para WordPress.

$12 USD / mes

Pin It on Pinterest