pagetop

BLOG

【jquery】イメージを固定してスクロールごとに変化させる

  • HOME

  • BLOG

  • 【jquery】イメージを固定してスクロールごとに変化させる

Article

【jquery】イメージを固定してスクロールごとに変化させる

javascript

イメージが固定されていて、スクロールした内容に応じてイメージが変化するjqueryをメモします。
jquery以外のプラグインは不要で、割と簡単にできちゃいます。

 

scrollsticky

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を追加し表示、外れたら削除し非表示にします。

 

以上です。
簡単でした。

デモはこちら

Spread the love