Горизонтальный параллакс эффект

Есть блок с горизонтальной прокруткой. Каким образом к нему можно добавить эффект параллакс фона, то есть, задний план должен прокручиваться вправо-влево медленнее, чем основное содержимое. Для примера добавлю простейший код.

.parallax {
  width: 600px;
  height: 200px;
  overflow-y: scroll;
  background-size: cover;
  background-image: url('https://get.wallhere.com/photo/2700x1045-px-architecture-bridge-building-cityscape-clouds-evening-landscape-lights-Manhattan-modern-New-York-City-panoramas-reflection-sea-skyscraper-urban-water-1104024.jpg');
}

.inner {
  width: 900px;
  height: 200px;
  color: #fff;
}
<div class="parallax">
  <div class="inner">.........F......F...........................F...........................F.......................F................................................F.................</div>
</div>


Ответы (1 шт):

Автор решения: Егор Банин

А вы пробовали сделать то, что хотите? То есть сделать пару блоков с прокруткой, и чтобы один из блоков прокручивался вместе со вторым.

<div id="a" style="width: 300px; overflow: hidden">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAYAAADo3z3CAAAAAXNSR0IArs4c6QAAAGhJREFUSIljjD/75D8DEmA5J83wx+gpBp/lnDTDj8uPGFjimZGVM1ycPI9BPzcJp36YGm2+eAy9uOzFZQbMnj8L/2KYhexOmF50dSznpBmYcLpgmIJRDw93MOrh4Q5GPTzcwaiHhzsAADNGLBBYK+UPAAAAAElFTkSuQmCC" width="600" style="image-rendering: pixelated">
</div>
<div id="b" style="width: 300px; overflow: auto">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAYAAADo3z3CAAAAAXNSR0IArs4c6QAAAGFJREFUSIljYBgFo2BYAUZaGGpvX/IfXezgwR6a2EUqYBloB9AC4AtwJvo7Z2ABRgxjCx1sAD2JEqsPH8BlBjWzAwu5DoXpI8cx1AgccsGQyMPEFILEBuKQ8DA+QKxHYeoAwXojviQDoRQAAAAASUVORK5CYII=" width="600" style="image-rendering: pixelated">
</div>

Вот пара блоков. Чтобы реагировать на прокрутку надо повесить обработчик scroll-события (хороший источник знаний о js -- документация MDN). Это просто.

var $a = document.querySelector('#a');
var $b = document.querySelector('#b');
$b.addEventListener('scroll', function(e) {
    window.requestAnimationFrame(function() {
        $a.scrollLeft = $b.scrollLeft * 0.3;
    });
});

Осталось разместить один блок над другим и готово.

var $a = document.querySelector('#a');
var $b = document.querySelector('#b');
$b.addEventListener('scroll', function(e) {
    window.requestAnimationFrame(function() {
        $a.scrollLeft = $b.scrollLeft * 0.3;
    });
});
<div id="a" style="width: 300px; overflow: hidden">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAYAAADo3z3CAAAAAXNSR0IArs4c6QAAAGhJREFUSIljjD/75D8DEmA5J83wx+gpBp/lnDTDj8uPGFjimZGVM1ycPI9BPzcJp36YGm2+eAy9uOzFZQbMnj8L/2KYhexOmF50dSznpBmYcLpgmIJRDw93MOrh4Q5GPTzcwaiHhzsAADNGLBBYK+UPAAAAAElFTkSuQmCC" width="600" style="image-rendering: pixelated">
</div>
<div id="b" style="width: 300px; overflow: auto; margin-top: -100px">
    <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAAKCAYAAADo3z3CAAAAAXNSR0IArs4c6QAAAGFJREFUSIljYBgFo2BYAUZaGGpvX/IfXezgwR6a2EUqYBloB9AC4AtwJvo7Z2ABRgxjCx1sAD2JEqsPH8BlBjWzAwu5DoXpI8cx1AgccsGQyMPEFILEBuKQ8DA+QKxHYeoAwXojviQDoRQAAAAASUVORK5CYII=" width="600" style="image-rendering: pixelated">
</div>

Не бойтесь пробовать сделать то, что хотите. В процессе реализации вы обязательно узнаете что-то новое, уточните задачу и через несколько итераций решите её, получив ценный опыт.

→ Ссылка