https://codepen.io/cfxd/pen/Zdvygp
Требования
- Должно выглядеть четким без JS (можно просто установить
enabled = false
на вершине JS для двойной проверки)
- Полноэкранное изображение должно отображаться фиксированным при загрузке страницы
- Карты должны быть расположены в ряды по две и в альтернативном положении (макет не может быть основан на столбцах по причинам реагирования)
- Все карты
100vh
и шириной 50%
- Изображение 1 смещается на половину ширины, затем карты по очереди закрепляются и прокручиваются
- Нижний колонтитул «раскрывается» после прокрутки всех карт
Я чувствую, что, возможно, я упускаю что-то, что облегчает расширение, потому что если я получу, скажем, 6 рядов карточек, код для всех сцен станет громоздким. Даже используя цикл for, код очень нечитаемый. Есть ли способ сделать это немного легче и более управляемым?
Кроме того, в рабочей среде возникают серьезные проблемы с выравниванием при изменении размера браузера. Вы можете воспроизвести это, используя полный код страницы , а затем:
- Прокрутка до конца с Dev Tools закрыты
- Open Dev Tools
Я слышал, что обсуждалось, что этот тип проблемы с изменением размера должен решаться в CSS, но мне не ясно, относится ли это к этому случаю, и если да, то где вообще начинать.
Любые указатели приветствуются.
<div class="container">
<div class="img-full">Fullscreen Image</div>
<div class="rows">
<div class="row row-1">
<div class="card card-content pin-1-1">Content 1</div>
<div class="card card-image pin-1-2">Image 1</div>
</div>
<div class="row row-2">
<div class="card card-content pin-2-1">Content 2</div>
<div class="card card-image pin-2-2">Image 2</div>
</div>
</div>
</div>
<footer>Footer</footer>
body {
margin: 0;
}
.container {
margin-bottom: 20vh;
}
.img-full {
width: 100%;
height: 100vh;
background-color: #e6eae1;
display: flex;
align-items: center;
justify-content: center;
}
.rows {
position: relative;
}
.row {
display: flex;
flex-wrap: nowrap;
}
.row:nth-child(even) {
flex-direction: row-reverse;
}
.card {
width: 50%;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
}
.card-content {
background: #ccc;
}
.card-image {
background-color: #70A9A1;
}
footer {
background: #C52;
height: 20vh;
position: fixed;
right: 0;
bottom: 0;
left: 0;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
z-index: -1;
}
(function() {
var enabled = true;
var controller = new ScrollMagic.Controller();
if(enabled) {
new ScrollMagic.Scene({
triggerElement: '.img-full',
triggerHook: 'onLeave',
duration: '150%',
})
.setPin('.img-full', {pushFollowers: false})
.addTo(controller);
new ScrollMagic.Scene({
triggerElement: '.pin-1-2',
triggerHook: 'onEnter',
duration: '50%',
})
.setPin('.pin-1-2', {pushFollowers: false})
.addTo(controller);
new ScrollMagic.Scene({
triggerElement: '.pin-1-1',
triggerHook: 'onLeave',
duration: '50%',
})
.setPin('.pin-1-1', {pushFollowers: false})
.addTo(controller);
new ScrollMagic.Scene({
triggerElement: '.pin-1-2',
triggerHook: 'onLeave',
duration: '100%',
offset: (document.querySelector('.pin-1-2').offsetHeight / 2),
})
.setPin('.pin-1-2', {pushFollowers: false})
.addTo(controller);
new ScrollMagic.Scene({
triggerElement: '.pin-2-2',
triggerHook: 'onEnter',
duration: '50%',
})
.setPin('.pin-2-2', {pushFollowers: true})
.addTo(controller);
new ScrollMagic.Scene({
triggerElement: '.pin-2-2',
triggerHook: 'onLeave',
duration: '100%',
offset: (document.querySelector('.pin-2-2').offsetHeight / 2),
})
.setPin('.pin-2-2', {pushFollowers: true})
.addTo(controller);
new ScrollMagic.Scene({
triggerElement: '.pin-2-1',
triggerHook: 'onEnter',
duration: '150%',
})
.setPin('.pin-2-1', {pushFollowers: true})
.addTo(controller);
}
})();