A menudo uso un ícono de intercalación para mostrar si un colapso en Bootstrap 5 está abierto o cerrado.
Por ejemplo, tendré un html como este:
<h4 class="border" role="button" data-bs-toggle="collapse" href="#plinks"> <i id="plinks-closed" class="fa fa-caret-right"></i> <i id="plinks-open" style="display:none;" class="fa fa-caret-down"></i> Plinks </h4>y algunos js como este para cambiar el ícono de intercalación cuando se abre o cierra el colapso:
$('#plinks').on('show.bs.collapse', function () { $( "#plinks-closed").hide(); $( "#plinks-open").show(); }); $('#plinks').on('hide.bs.collapse', function () { $( "#plinks-closed").show(); $( "#plinks-open").hide(); });A veces tengo muchos de estos y uso muchos ID diferentes y secciones js para que funcionen, y todas esas secciones js para cada ID parecen un poco desordenadas e ineficientes.
Lo que estoy buscando es una forma más universal, no específica de identificación, de tomar el cursor derecho e intercambiarlo por el cursor izquierdo en un elemento que asigno .caret-collapse. Rellenaría automáticamente el "intervalo de intercalación cerrado" al cargar y luego lo cambiaría automáticamente por el "intervalo de intercalación abierto" cuando se abra el colapso.
Me imagino que el html se vería así:
<h4 class="border caret-collapse" role="button" data-bs-toggle="collapse" href="#plinks"> <span class="caret-collapse-container"></span> Plinks </h4>En cuanto al js, supongo que verificaría el clic en .caret_collapse y luego haría algún tipo de búsqueda "secundaria" para el contenedor .caret-collapse y agregaría/eliminaría el código del icono, pero he tenido No tuve suerte haciendo que algo así sucediera y pensé en preguntar aquí en lugar de frustrarme más.
Lo estás complicando demasiado. Por un lado, evite las identificaciones en CSS y JS siempre que sea posible. No permiten la reutilización. Por otro lado, solo puede apuntar a clases para alternar desde el elemento de colapso.
Esta demostración no funciona, posiblemente debido a un marcado defectuoso, pero le da una idea.
const myEls = document.querySelectorAll('[data-bs-toggle="collapse"]'); myEls.forEach(el => { el.addEventListener('shown.bs.collapse', function() { el.find('i').classList.toggle('fa-caret-right'); el.find('i').classList.toggle('fa-caret-left'); }); }); <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css" integrity="sha512-Fo3rlrZj/k7ujTnHg4CGR2D7kSs0v4LLanw2qksYuRlEzO+tcaEPQogQ0KaoGN26/zrn20ImR1DfuLWnOo7aBA==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <h4 class="border" role="button" data-bs-toggle="collapse" href="#plinks"> <i class="fa fa-caret-right"></i> Plinks </h4> <div class="collapse" id="plinks"> <div class="card card-body"> Some placeholder content for the collapse component. This panel is hidden by default but revealed when the user activates the relevant trigger. </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p" crossorigin="anonymous"></script>