1const initMarquee = (el) => { 2 const track = el.querySelector(".track"); 3 const content = el.querySelector(".content"); 4 5 if (!track || !content) return; 6 7 // 1. Récupération et validation du data-speed 8 const rawSpeed = el.getAttribute("data-speed"); 9 const defaultSpeed = 80; // Valeur de secours 10 11 // On convertit en nombre et on vérifie si c'est un nombre valide > 0 12 let speed = parseFloat(rawSpeed); 13 if (isNaN(speed) || speed <= 0) { 14 speed = defaultSpeed; 15 } 16 17 // 2. Remplissage intelligent du track 18 // On clone jusqu'à ce que le track fasse au moins 2x la largeur du parent 19 while (track.offsetWidth < el.clientWidth * 2) { 20 track.appendChild(content.cloneNode(true)); 21 } 22 23 // 3. Calcul de la durée basée sur la vitesse (v = d / t => t = d / v) 24 // On utilise la moitié de la largeur du track car l'anim va de 0 à -50% 25 const distanceToScroll = track.offsetWidth / 2; 26 const duration = distanceToScroll / speed; 27 28 // 4. Application de l'animation 29 track.style.animation = `at-marquee-scroll ${duration}s linear infinite`; 30}; 31 32// Initialisation au chargement 33window.addEventListener("DOMContentLoaded", () => { 34 document.querySelectorAll(".at-marquee-wrapper").forEach(initMarquee); 35});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.