JSFiddle - React, Tailwind, and code Playground
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/ScrollMagic.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ScrollMagic/2.0.5/plugins/debug.addIndicators.min.js"></script>
<div class="block">
<h1>Hello world!</h1>
</div>
<div class="block">
<h1>Hello world!</h1>
</div>
<div class="block">
<h1>Hello world!</h1>
</div>
<div class="block">
<h1>Hello world!</h1>
</div>
<div class="viewer-wrap">
<section class="scene section" id="sticky">
<div class="viewer"></div>
</section>
<!-- Сюда добавляем наш блок -->
<div class="block super-crutch">
<h1>Hello world!</h1>
</div>
</div>
<div class="block"> <!-- а вот этот блок перемещается во viewer-wrap -->
<h1>Hello world!</h1>
</div>
<div class="block">
<h1>Hello world!</h1>
</div>
CSS
html,
body {
height: 100%;
margin: 0;
padding: 0;
}
body {
width: 100%;
}
.block {
width: 100%;
height: 500px;
background: tomato;
}
.super-crutch {
position: absolute; /* Базовое значение*/
top: 0; /* выравнием поверху */
left: 0;
margin-top: 350px; /* т.к. высота вьювера известна, делаем отступ от него */
}
.header {
color: white;
}
.section {
background: #FFFFFF;
color: black;
}
.scene {
height: 350px;
width: 100%;
background: #EAEAEA;
}
h1 {
font-size: 40px;
color: #fff;
margin: 0;
}
.center {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-pack: center;
-webkit-justify-content: center;
-ms-flex-pack: center;
justify-content: center;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
align-items: center;
height: 100%;
}
.viewer-wrap {
position: relative; /* Выставляем как родительский блок для блока-костыля */
}
.viewer {
height: 100%;
margin-left: auto;
margin-right: auto;
width: 100%;
background-image: url(http://mav.klendev.ru/5278/static/km/ComplexFoodtracks/css/base/Baw-01.png);
background-repeat: no-repeat;
background-position: 50% 0;
background-size: 100% 350px;
}
.viewer.frame1 {
background-image: url(http://mav.klendev.ru/5278/static/km/ComplexFoodtracks/css/base/Baw-01.png);
}
.viewer.frame2 {
background-image: url(http://mav.klendev.ru/5278/static/km/ComplexFoodtracks/css/base/Baw-01.png);
}
.viewer.frame3 {
background-image: url(http://mav.klendev.ru/5278/static/km/ComplexFoodtracks/css/base/Baw-02.png);
}
.viewer.frame4 {
background-image: url(http://mav.klendev.ru/5278/static/km/ComplexFoodtracks/css/base/Baw-02.png);
}
.viewer.frame5 {
background-image: url(http://mav.klendev.ru/5278/static/km/ComplexFoodtracks/css/base/Baw-02.png);
}
.viewer.frame6 {
background-image:...
JavaScript
var viewer = document.querySelector('.viewer'),
frame_count = 9,
offset_value = 100;
// init controller
var controller = new ScrollMagic.Controller({
globalSceneOptions: {
triggerHook: 0,
reverse: true
}
});
// build pinned scene
new ScrollMagic.Scene({
triggerElement: '#sticky',
duration: frame_count * offset_value,
reverse: true
})
.setPin('#sticky')
//.addIndicators()
.addTo(controller);
// build step frame scene
for (var i = 1, l = frame_count; i <= l; i++) {
new ScrollMagic.Scene({
triggerElement: '#sticky',
offset: i * offset_value
})
.setClassToggle(viewer, 'frame' + i)
//.addIndicators()
.addTo(controller);
}
// Берем объект вьювера под контроль
var isActiveViewer = document.querySelector('#sticky');
// Наше решение проблемы
var crutch = document.querySelector('.super-crutch');
window.onscroll = function() {
// Если наш вьювер активен
if(isActiveViewer.style.position == 'fixed') {
// Выставляешь значение для нашего блока тоже fixed, это создаст эффект неразоединения
crutch.style.position = 'fixed'
} else {
// Когда вьювер неактивен, наш блок тоже ездит без проблем
crutch.style.position = 'absolute'
}
}