Я не совсем уверен, как бы вы назвали этот эффект прокрутки - масштабирование прокрутки страницы?- но это может быть достигнуто в современных браузерах с помощью преобразования масштаба CSS и небольшого JavaScript.
Стиль ваших разделов страницы
Я сложил свои разделы друг над другом, предоставив им положение absolute
и исправление их CSS-координат.
HTML:
<section style="background-color: red;">
<h1>This is section number one!!</h1>
</section>
<section style="background-color: blue;">
<h1>This is section number two!!</h1>
</section>
CSS:
html, body {
position: relative;
margin: 0;
height: 100%;
overflow: hidden;
}
section {
position: absolute;
width: 100%;
height: 100%;
left: 0; right: 0;
top: 0; bottom: 0;
text-align: center;
}
Установите начальный масштаб каждого раздела.
Я хотел, чтобы каждый раздел был на треть меньше предыдущего.Это означало, что масштаб первого раздела будет 1;масштаб второй будет 1/3;третий будет 1/9, четвертый 1/27 и так далее.Поэтому, если n является индексом каждого раздела, разделы должны быть масштабированы на (1/3) ^ n.Масштабирование разделов довольно просто с помощью функции CSS3 .
JavaScript:
document.addEventListener( 'DOMContentLoaded', function() {
var sections = document.getElementsByTagName( 'section' ),
i = 0;
for ( i; i < sections.length; i++ ) {
sections[i].style.transform = 'scale(' + Math.pow( 1/3, i ) + ')';
}
} );
Изменение масштаба при прокрутке
Поскольку страница делаетчтобы не переполнить, нужно прослушать событие wheel .Мы также должны сохранить переменную, состоящую из того, как далеко мы прокрутили между минимумом (0) и максимумом (я выбрал 1000; вы можете изменить чувствительность прокрутки с большим или меньшим значением).Когда происходит событие wheel, мы находим, сколько пользователь прокрутил из свойства deltaY события, настраиваем наш счетчик прокрутки на столько и соответствующим образом масштабируем наши секции.
Чтобы вычислить, сколько мы должны масштабировать, это тольконемного сложнее, чем расчет начальных масштабов.Это все еще является степенью 1/3, хотя теперь мы должны вычесть шкалу, умноженную на общее количество секций, деленное на максимальное значение счетчика из нашего n .
. Вы также можетеиспользуйте requestAnimationFrame
для более плавного опыта.
JavaScript:
var counter = 0,
counter_max = 1000,
total = document.getElementsByTagName( 'section' ).length;
window.addEventListener( 'wheel', function( e ) {
counter += e.deltaY;
if ( counter > counter_max ) counter = counter_max;
if ( counter < 0 ) counter = 0;
requestAnimationFrame( applyScale );
} );
function applyScale() {
var sections = document.getElementsByTagName( 'section' ),
i = 0;
for ( i; i < sections.length; i++ ) {
var scale = Math.pow( 1/3, i - counter * total / counter_max );
sections[i].style.transform = 'scale(' + scale + ')';
}
}
Результат
Ручка, которая реализует вышеупомянутое, может быть найдена в https://codepen.io/jla-/pen/aMNgxy
Это должно быть полезным для начала.Добавление якорей вверху страницы потребует прослушивателя click
, который анимирует переменную счетчика до соответствующего значения, вызывая функцию applyScale
в каждом кадре анимации.