イメージが固定されていて、スクロールした内容に応じてイメージが変化するjqueryをメモします。
jquery以外のプラグインは不要で、割と簡単にできちゃいます。
HTMLを記述する
HTMLを記述します。
<div class="wrap"> <div class="images-container"> <p class="scroll-area1"><img src="img/1.jpg" alt=""></p> <p class="scroll-area2"><img src="img/2.jpg" alt=""></p> <p class="scroll-area3"><img src="img/3.jpg" alt=""></p> <p class="scroll-area4"><img src="img/4.jpg" alt=""></p> </div> <div class="container"> <div class="scroll-area1"> <h2>DEMO TITLE1</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisci elit, 略 mollit anim id est laborum.</p> </div> <div class="scroll-area2"> <h2>DEMO TITLE2</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisci elit, 略 mollit anim id est laborum.</p> </div> <div class="scroll-area3"> <h2>DEMO TITLE3</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisci elit, 略 mollit anim id est laborum.</p> </div> <div class="scroll-area4"> <h2>DEMO TITLE4</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisci elit, 略 mollit anim id est laborum.</p> </div> </div> </div>
wrap内にあるcontainerの中にある個々のブロックのスクロールに応じて、images-containerの中の固定されてイメージが変化します。
ブロックとイメージをリンクさせているクラスがscroll-area+NOとなります。
CSSを記述する
CSSを記述します。
.wrap{ width:100%; margin:0 auto; text-align:center; padding:200px 0; position: relative; display: flex; justify-content: space-between; position: relative; background: #fff; } /*コンテンツ*/ .container { width: 40%; } .container div { padding-top: 50vh; padding-right:10vh } .container div:last-child { padding-bottom: 50vh; } .container div h2 { font-size: 3rem; text-align:left; } .container div p { margin-top: 30px; text-align:left; line-height:170%; } /*イメージ*/ .images-container { width: 55%; height: 100vh; display: flex; align-items: center; position: sticky; position: -webkit-sticky; top:0; } .images-container img { max-width: 100%; height: auto; } .images-container p { height:650px; margin: auto; display: block; visibility: hidden; position: absolute; top: 0; bottom: 0; transition: .8s !important; opacity: 0; } .images-container p:first-child, .images-container p.active { visibility: visible; opacity: 1; }
イメージが入っている、images-containerの幅と高さを設定します。height: 100vhで全画面固定し、さらにposition: stickyを使用してスクロール固定します。
ここで蛇足ですが、position: stickyの注意点をメモしておきます。
- 最新のFirefox、Chrome、Safari、Edgeでサポート
- 親要素にoverflow: hiddenを入れない
- Chromeではtheadとtr要素でstickyが使えない
- Safariではプレフィックスが必要(position: -webkit-sticky)
- IEはサポートしていない
IEが曲者ですが、2023年3月時点でシェア0.46%ですから、stickyについてはスルーしちゃいます!
話を戻します。
.images-container pにtransitionプロパティでイメージが切り替わる際のフェードインアニメーションを設定します。また、visibility: hiddenで不可視状態にします。
.images-container p:first-childで最初のイメージ、.images-container p.activeでスクロールで表示されたイメージをvisibility: visibleで表示します。
javascriptを記述する
javascriptを記述します。
$(function(){ $(window).scroll(function () { $('.container div').each(function () { boxNum = $(this).attr("class"), scrollTop = $(window).scrollTop(); areaTop = $(this).offset().top; if (scrollTop > areaTop) { $('.images-container .' + boxNum).addClass('active'); } else{ $('.images-container .' + boxNum).removeClass('active'); } }); }); });
.container div内のclass、scroll-area+NOを取得して、スクロール後images-container内のscroll-area+NOと同じクラスになったら、.activeを追加し表示、外れたら削除し非表示にします。
以上です。
簡単でした。