CSS Opacity эффект на элементе по скроллу
Подскажите, пожалуйста, как реализован opacity эффект на <footer>
на этом сайте.
Как они подвязались именно на style="--scroll-progress: 0.22838412344220574;"
скрытие текста а не всего блока ? Может кто-то показать на примере ?
Ответы (3 шт):
Автор решения: Qwertiy
→ Ссылка
Даже не открывал, но, например, так:
document.addEventListener('scroll', e => {
var root = document.documentElement
var sp = root.scrollTop / root.scrollHeight
root.style.setProperty('--scroll-progress', sp)
})
html {
background: white;
}
body {
background: blue;
opacity: calc(1 - var(--scroll-progress, 0));
margin: 0;
}
<div style="height: 3210px"></div>
Автор решения: BlackStar1991
→ Ссылка
Нашел решение через Scroll-driven Animations API но что-то оно не до конца закрашивает текст в конце.
body {
margin: 0;
font-size: 18px;
padding: 0 20px;
}
.main {
min-height: 100vh;
margin-bottom: 10px;
}
@keyframes opacity-in {
from {
opacity: 0;
}
}
footer {
color: #f00;
}
footer p {
animation-name: opacity-in;
animation-fill-mode: both;
animation-timing-function: linear;
view-timeline-name: --opacity-show;
animation-timeline: --opacity-show;
animation-range: 0% 100%;
}
<main class="main">
<div>
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Hic dolor voluptatum repellendus laboriosam reprehenderit deleniti, voluptas libero molestiae voluptatem provident perspiciatis consectetur ad placeat qui, nostrum officiis eos nisi autem.
</div>
<div>
Laboriosam explicabo, dolorum necessitatibus libero totam veritatis quam facilis accusamus, blanditiis id deserunt laborum delectus, eligendi commodi dolorem modi nostrum ex architecto voluptatibus ducimus. Voluptatem atque maiores dolore architecto ratione.
</div>
<div>
Sint at enim, dolorem magnam quia eaque sunt, nostrum commodi maiores explicabo obcaecati eum vitae consectetur labore ut non veritatis laborum earum modi autem reiciendis in ipsum? Incidunt, dignissimos, repellat!
</div>
<div>
Iusto minus numquam incidunt, facilis tempora velit possimus! Error quisquam, fugit totam libero fugiat harum incidunt pariatur! Eligendi minima corrupti dicta debitis corporis dignissimos, ipsa distinctio officia voluptates saepe laudantium.
</div>
<div>
Quisquam fugit repellendus placeat natus tempora, magnam molestias maiores provident voluptates quos praesentium facere non veniam nulla rem nam dolor est iste odio, aut numquam totam deleniti? Omnis, minima, nemo.
</div>
<div>
Voluptates eligendi eos explicabo vel dicta consequatur, facere esse consectetur praesentium! Sunt consequuntur nisi aut quas magnam aspernatur, commodi voluptatem temporibus corporis, nobis rem nemo eos suscipit reprehenderit placeat repellat.
</div>
<div>
Hic error beatae a repellat aut ducimus asperiores saepe ratione nobis possimus ad mollitia illum quasi explicabo dolor eveniet repellendus molestiae, totam laudantium nam commodi, sed nostrum nihil. Minima, nemo.
</div>
<div>
Laborum veritatis distinctio iure illum consequuntur, perspiciatis, nisi facilis vel voluptas animi, magnam expedita corporis quis maxime unde. Tenetur, consectetur voluptates optio nam illo ex ab cupiditate voluptas inventore fugiat.
</div>
<div>
Amet vitae soluta numquam necessitatibus, assumenda voluptates ut quas iste ex quidem! Accusantium tenetur dolorum, alias est. Nesciunt saepe quo soluta alias quidem molestias praesentium consectetur ea natus maxime. Impedit!
</div>
<div>
Obcaecati, amet ipsa explicabo aspernatur fuga. Ipsum vitae nobis odio asperiores non sed, officiis repudiandae, eum adipisci explicabo minima repellendus cumque excepturi reprehenderit. Magni, ipsa est. Quasi tempora obcaecati assumenda!
</div>
</main>
<footer>
<p>FOOTER TEXT Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id deleniti, eos accusamus, cupiditate aut dolorum! Iusto explicabo, assumenda quasi, eligendi doloribus blanditiis corrupti illo recusandae id, expedita non maxime officia.</p>
<p>FOOTER TEXT Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id deleniti, eos accusamus, cupiditate aut dolorum! Iusto explicabo, assumenda quasi, eligendi doloribus blanditiis corrupti illo recusandae id, expedita non maxime officia.</p>
<p>FOOTER TEXT Lorem ipsum dolor sit amet, consectetur adipisicing elit. Id deleniti, eos accusamus, cupiditate aut dolorum! Iusto explicabo, assumenda quasi, eligendi doloribus blanditiis corrupti illo recusandae id, expedita non maxime officia.</p>
</footer>
Автор решения: De.Minov
→ Ссылка
Вариант с использованием Intersection Observer API:
комментарии в коде
const footer = document.querySelector('footer');
const animProgress = .5; // Анимируем до середины элемента
// Инициализируем observer
new IntersectionObserver((entries) => {
entries.forEach(entry => {
// Если элемент в зоне видимости
if(entry.isIntersecting) {
// Получаем область видимости, и берём от неё процент для прогресса
const progress = Math.min(1, entry.intersectionRatio / animProgress);
// Добавляем прогресс элементу
entry.target.style.setProperty('--scroll-progress', progress);
}
});
}, {
root: null,
rootMargin: '0px',
threshold: Array.from({ length: 101 }, (_, i) => i / 100) // Таким образом получаем threshold от 0 до 1 до фулл отображения элемента
}).observe(footer);
body {
margin: 0;
}
p {
margin: 0;
}
.demo {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100vh;
}
.footer {
background-color: #502223;
color: #fff;
}
.footer-inner {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 40px;
width: 100%;
padding: 20px;
box-sizing: border-box;
opacity: var(--scroll-progress, 1);
}
.items,
.links {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 2em;
width: 100%;
}
.item {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
gap: 20px;
width: 100%;
border-top: 1px solid #fff;
padding-top: 20px;
}
.links span {
width: 100%;
}
.image {
display: block;
width: 100%;
aspect-ratio: 2.5;
background-color: #fff;
}
<div class="demo">Scroll down</div>
<footer class="footer">
<div class="footer-inner">
<div class="items">
<div class="item">
<span>Menu</span>
<p>About Us<br>Our Team<br>Expertise<br>Careers<br>Internships<br>News & Insights<br>Contact</p>
</div>
<div class="item">
<span>Expertise</span>
<p>Commercial Arbitration<br>Investment Arbitration<br>Arbitration-Related Litigation</p>
</div>
<div class="item">
<span>Connect</span>
<p>[email protected]<br>+0 123 456 78 90<br><br>LinkedIn<br>X</p>
</div>
</div>
<div class="links">
<span>Privacy Policy</span>
<span>Cookies Policy</span>
<span>Branding & Website by Fable&Co.</span>
</div>
<div class="image"></div>
</div>
</footer>
Вариант с использованием GSAP и ScrollTrigger
комментарии в коде
// GreenSocks советуют использовать это в начале
gsap.registerPlugin(ScrollTrigger);
// Запускаем анимацию изначальную для `.footer-inner`
gsap.from('.footer-inner', {
opacity: 0, // т.е. `opacity` будет анимироваться от 0 до установленного значения (в демо до 1)
// Подключаем взаимодействие со скроллом.
scrollTrigger: {
trigger: 'footer', // Триггером будет `footer`
start: 'top bottom', // старт анимации будет от его верхней части, относительно нижней части вьюпорта
end: 'top+=50% bottom', // а закончится от его верхней части + 50% от его высоты, так же относительно нижней части вьюпорта
markers: false, // можно включить, чтобы отобразить маркеры границы анимации
scrub: true, // свойство, для связки анимации с прокруткой
}
})
body {
margin: 0;
}
p {
margin: 0;
}
.demo {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100vh;
}
.footer {
background-color: #502223;
color: #fff;
}
.footer-inner {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: flex-start;
gap: 40px;
width: 100%;
padding: 20px;
box-sizing: border-box;
}
.items,
.links {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 2em;
width: 100%;
}
.item {
display: flex;
flex-direction: column;
justify-content: flex-start;
align-items: stretch;
gap: 20px;
width: 100%;
border-top: 1px solid #fff;
padding-top: 20px;
}
.links span {
width: 100%;
}
.image {
display: block;
width: 100%;
aspect-ratio: 2.5;
background-color: #fff;
}
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/ScrollTrigger.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/gsap.min.js"></script>
<div class="demo">Scroll down</div>
<footer class="footer">
<div class="footer-inner">
<div class="items">
<div class="item">
<span>Menu</span>
<p>About Us<br>Our Team<br>Expertise<br>Careers<br>Internships<br>News & Insights<br>Contact</p>
</div>
<div class="item">
<span>Expertise</span>
<p>Commercial Arbitration<br>Investment Arbitration<br>Arbitration-Related Litigation</p>
</div>
<div class="item">
<span>Connect</span>
<p>[email protected]<br>+0 123 456 78 90<br><br>LinkedIn<br>X</p>
</div>
</div>
<div class="links">
<span>Privacy Policy</span>
<span>Cookies Policy</span>
<span>Branding & Website by Fable&Co.</span>
</div>
<div class="image"></div>
</div>
</footer>