function infiniteMarqueeClientsOne(selector, speed, direction = -1) { const marquee = document.querySelector(selector); const originalHTML = marquee.innerHTML; const clones = 2; for (let i = 0; i < clones; i++) { marquee.insertAdjacentHTML("beforeend", originalHTML); } const firstSetWidth = marquee.scrollWidth / (clones + 1); // Mantener x siempre en [-firstSetWidth, 0) // Si va a la derecha, arrancá "corrida" para que haya contenido antes let x = (direction > 0) ? -firstSetWidth : 0; function tick() { x += speed * direction; // wrap continuo en el rango [-firstSetWidth, 0) if (x <= -firstSetWidth) x += firstSetWidth; if (x > 0) x -= firstSetWidth; marquee.style.transform = `translateX(${x}px)`; requestAnimationFrame(tick); } tick(); } // izquierda infiniteMarqueeClientsOne(".clients_line.one", 1.25, -1); // derecha infiniteMarqueeClientsOne(".clients_line.two", 1.25, 1);