Very important watch the tutorial: https://fancybricks.co/doc/05-accordion-timeline/
05 Accordion - Timeline
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero uctus non, massa. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet.
<script> // Obtener todos los elementos con la clase .fb-docs__list const fbDocsLists = document.querySelectorAll(".fb-log__accordion"); // Iterar a través de cada elemento y aplicar la lógica fbDocsLists.forEach((fbDocsList) => { const lastItem = fbDocsList.querySelector(".fb-log__item:last-child"); const lastItemHeight = lastItem.offsetHeight; const beforeHeight = `calc(100% - ${lastItemHeight}px)`; fbDocsList.style.setProperty("--before-height", beforeHeight); }); </script>
<script> // Función para observar cambios en el DOM y asignar aria-expanded y aria-controls function observeAccordionItems() { const accordionItems = document.querySelectorAll('.fb-accessible__item'); // Crea un nuevo observador const observer = new MutationObserver(mutationsList => { mutationsList.forEach(mutation => { const item = mutation.target; const button = item.querySelector('.fb-accessible__title'); const isOpen = item.classList.contains('brx-open'); // Asigna el atributo 'aria-expanded' en función del estado button.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); }); }); // Observa cambios en los atributos de clase de los elementos del acordeón accordionItems.forEach((item, index) => { const button = item.querySelector('.fb-accessible__title'); const controlId = `sect${index + 1}`; // Asigna el atributo 'aria-controls' con valores únicos button.setAttribute('aria-controls', controlId); // Inicialmente, verifica si el elemento tiene la clase 'brx-open' y actualiza aria-expanded const isOpen = item.classList.contains('brx-open'); button.setAttribute('aria-expanded', isOpen ? 'true' : 'false'); // Observa cambios en los atributos de clase de los elementos del acordeón observer.observe(item, { attributes: true, attributeFilter: ['class'] }); }); } // Llama a la función para comenzar a observar cambios observeAccordionItems(); </script>