Tengo una página que muestra muchas fotos que se pueden abrir con lightgallery.js
Ya hice algunos subtítulos HTML personalizados que funcionan bien. Pero ahora quiero agregar una etiqueta a la imagen misma. ¿Cómo puedo hacer eso?
Mostraré un ejemplo de cómo se ve mi página de fotos:
Cuando abres una imagen, esto es lo que parece:
La parte izquierda es un título HTML personalizado que vinculé con este atributo: data-sub-html .
Código de ejemplo de mi código en bucle:
$photomasonry .= ' <div class="tile scale-anm noselect"> <a href="https://studio.website.nl/'.$getphotos['preview'].'" data-sub-html="#caption'.$imgcount.'" class="item masonrytile" data-src="https://studio.website.nl/'.$getphotos['preview'].'"> <img src="https://studio.website.nl/'.$getphotos['preview'].'"/> <span class="idlabel">'.$getphotos['id'].'</span> <span class="sizelabel">'.$size.'</span> </a> </div>'; $photomasonry .= ' <div id="caption'.$imgcount.'" style="display:none"> <img src="https://studio.website.nl/images/logo.png"> <h4 class="subhtmlh4">Maak iets moois met deze foto</h4> <div class="gallerypopupbtns"> <a href="design-magazijn/stockfotos/'.$_GET['alias'].'/'.$getphotos['id'].'"><button class="btnstyle purplebtn" type="button" name="button">Maak iets moois</button></a> </div> </div>'; $imgcount++;Pero ahora quiero este ícono de tamaño púrpura (L, XL, XX) como una etiqueta en la imagen cuando se abre la galería de luz. ¿Cómo puedo hacer esto? El html de la galería de luz solo se genera después de cargar la página.
Quiero agregar un elemento dentro de esta parte:
<div class="lg-img-wrap"> <img class="lg-object lg-image" src="https://studio.website.nl/images/photos/previews/preview-bb58317c8d05e29b32963e7a295a5b9f.jpg"> </div>Pero no solo eso, el contenido es dinámico, así que muestra el tamaño correcto para la imagen correcta. Ya creé esto para la página de descripción general de la foto, pero no al hacer clic en una foto.
De acuerdo con los documentos de la galería de luz, puede usar el evento lgAfterOpen para ejecutar el código una vez que se abre la galería. Sin embargo, lightgallery hace que esto sea un poco difícil ya que no puede acceder a la imagen en la que se hizo clic desde este evento, pero puede acceder desde el evento lgBeforeOpen . Con esto en mente, lo lograría haciendo dos cosas.
En primer lugar, agregue el tamaño como atributo de datos de cada imagen:
<img src="https://studio.website.nl/'.$getphotos['preview'].'" data-size="'.$size.'"/>En segundo lugar, agregue las siguientes funciones al inicializar lightgallery:
// example gallery definition const lg = document.getElementById('custom-events-demo'); // add the following functions lg.addEventListener('lgBeforeOpen', (event) => { //add datasize property to target so it can be accessed in the afterOpen function event.target.dataset.size = event.explicitOriginalTarget.dataset.size; }); lg.addEventListener('lgAfterOpen', (event) => { // get size from data attribute var size = event.target.dataset.size; // get the .lg-img-wrap div to append size to var imgWrap = document.querySelector(".lg-container.lg-show .lg-img-wrap"); // create and append span var sizeSpan = document.createElement("span"); sizeSpan.classList.add("sizelabel"); sizeSpan.innerHTML = size; imgWrap.appendChild(sizeSpan); }); //initialise lightgallery lightGallery(lg); Es posible que esté utilizando una versión diferente de lightgallery, pero cuando probé esto, el .lg-img-wrap era un elemento de picture , no un div , por lo que reemplacé la última línea de la función de escucha de eventos con lo siguiente para obtener el tamaño a mostrar:
imgWrap.parentElement.appendChild(sizeSpan);Es posible que necesite un poco de CSS adicional para colocar el rango de tamaño como desee, pero solo para que se muestre todo lo que necesita es:
.sizelabel { position: relative; } Nota: no creo que esto funcione si navega a una imagen diferente desde lightgallery, ya que no actualizará el tamaño y, de hecho, es posible que el tamaño se elimine. Para solucionar esto, probablemente necesite hacer algo usando el evento lgAfterSlide y el índice de la imagen, pero de su captura de pantalla parece que no espera que el usuario se desplace por las imágenes dentro de lightgallery de todos modos, por lo que esto puede no ser un problema. .