1) Код суфлёра (класс для элемента highlight-v1
<script src='
https://unpkg.co/gsap@3/dist/gsap.min.js'></script> <script src='
https://unpkg.com/gsap@3/dist/ScrollTrigger.min.js'></script> <script src='
https://cdn.jsdelivr.net/gh/studio-freight/lenis@latest/bundled/lenis.js'></script> <script> $('.highlight-v1 .tn-atom').addClass('text-highlight-v1'); // const lenis = new Lenis({ // duration: 1.2, // easing: (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)) // }); function raf(time) { lenis.raf(time); ScrollTrigger.update(); requestAnimationFrame(raf); } requestAnimationFrame(raf); let paragraphs = [...document.querySelectorAll('.text-highlight-v1')]; let spans = []; paragraphs.forEach(paragraph => { let htmlString = ''; let childNodes = paragraph.childNodes; for (let i = 0; i < childNodes.length; i++) { let node = childNodes[i]; if (node.nodeType === Node.TEXT_NODE) { htmlString += node.textContent.split('').map(char => <span>${char}</span>).join(''); } else if (node.nodeName === 'BR') { htmlString += '<br>'; } } paragraph.innerHTML = htmlString; }) spans = [...document.querySelectorAll('.text-highlight-v1 span')]; function revealSpans() { for (let i = 0; i < spans.length; i++) { let rect = spans[i].parentElement.getBoundingClientRect(); let { left, top } = spans[i].getBoundingClientRect(); top = top - (window.innerHeight * 0.1) - 700; let opacityValue = 0.5 - ((top * 0.01) + (left * 0.001)) < 0.1 ? 0.1 : 0.5 - ((top * 0.01) + (left * 0.001)).toFixed(3); opacityValue = opacityValue > 1 ? 1 : opacityValue.toFixed(3); spans[i].style.opacity = opacityValue; } } window.addEventListener('scroll', () => { revealSpans() }) revealSpans() </script>