Нужна помощь в доработке небольшого скрипта
Всем привет! Подскажите, как доработать скрипт. Изначально буквы в элементах span имеют opacity:.2, в зависимости от того, насколько прокручен скролл, элементы должны приобретать либо opacity:1, либо возвращаться в прежнее значение 0.2. Например, скролла нет. Все буквы полупрозрачны. Скролл немного прокручен вниз - закрасились буквы С,Л,О а буквы В,О остались полупрозрачными. Вернули скрол чуть назад - ранее закрашенные буквы Л,О вернулись в исходную полупрозрачность, а С осталась подсвеченной - мы до нее назад не докрутили.
Сейчас код на таком этапе
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<div style="width:500px;margin:20px auto;background: #f3f4f4;border-radius: 12px;padding: 30px;">
<p class="text-2">
<span class="sp">С</span>
<span class="sp">Л</span>
<span class="sp">О</span>
<span class="sp">В</span>
<span class="sp">О</span>
</p>
</div>
<script>
var chars = document.querySelectorAll('.sp');
addEventListener('scroll', function() {
var d = document.documentElement;
// приводим значение скролла к интервалу [0-1]
upd(d.scrollTop / (d.scrollHeight - d.clientHeight))
});
upd(0)
function upd(v) {
// умножаем на диапазон возможных значений (индексов)
v *= chars.length - 1;
for (let i = 0; i < chars.length; i++) {
// расcтояние между текущим элементом и значением скролла в нашем диапазоне
let d = Math.abs(i - v);
// вычисляем значение прозрачности, как 1 минус расстояние
// тут браузер не ругается при opacity<0, поэтому к диапазону 0-1 можно не приводить
if(v === 0) {
chars[i].style.opacity = 0.2;
} else {
chars[i].style.opacity = 1 - d;
chars[i].style.transform = `scale(${1 - i + v})`
}
}
}
</script>
</body>
</html>
Доделать до требуемого результата у меня не получается, нужна ваша помощь. Заранее благодарю! |
Как-то так:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>.sp {transition: opacity .6s;}</style>
</head>
<body>
<div style="position:fixed;width:500px;margin:20px auto;background: #f3f4f4;border-radius: 12px;padding: 30px;">
<p class="text-2">
<span class="sp">С</span>
<span class="sp">Л</span>
<span class="sp">О</span>
<span class="sp">В</span>
<span class="sp">О</span>
</p>
</div>
<div style="height:1000px"></div>
<script>
var chars = document.querySelectorAll('.sp');
addEventListener('scroll', function() {
var d = document.documentElement;
// приводим значение скролла к интервалу [0-1]
upd(d.scrollTop / (d.scrollHeight - d.clientHeight))
});
upd(0)
function upd(scrollValue) {
// умножаем на диапазон возможных значений (индексов)
const { length } = chars;
chars.forEach((char, index) => {
// приводим положение символа к интервалу [0-1]
const position = index / (length - 1);
// вычисляем разницу положения сивола и положения скролла
const diff = scrollValue - position;
// если символ раньше скролла или скролл внизу и символ последний
if (diff > 0 || (position === 1 && scrollValue === 1)) {
char.style.opacity = 1;
} else {
char.style.opacity = 0.2;
};
})
}
</script>
</body>
</html>
Если же нужна какая-то дополнительная "плавность", то тут надо углубляться в математику.) |
:-?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.sp {
transition: opacity .6s;
}
</style>
</head>
<body>
<div style="position:fixed;width:500px;margin:20px auto;background: #f3f4f4;border-radius: 12px;padding: 30px;">
<p class="text-2">
<span class="sp">С</span>
<span class="sp">Л</span>
<span class="sp">О</span>
<span class="sp">В</span>
<span class="sp">О</span>
</p>
</div>
<div style="height:1000px"></div>
<script>
let chars = document.querySelectorAll('.sp');
function upd() {
var d = document.documentElement;
showLetters(d.scrollTop / (d.scrollHeight - d.clientHeight));
}
addEventListener('scroll', upd);
upd()
function showLetters(scrollValue) {
const {
length
} = chars;
const max = Math.round(length * scrollValue);
chars.forEach((char, index) => {
const diff = scrollValue && index <= max;
char.style.opacity = diff ? 1 : 0.2;
})
}
</script>
</body>
</html>
|
Aetae,
рони, Парни браво! Спасибо вам огромное! |
Цитата:
|
| Часовой пояс GMT +3, время: 01:39. |