要素を無限スクロールできるようにしたいと思って色々調べましたが、あまり情報がなく、何とか自力で実装したのでメモっておきます。
無限スクロールについて調べると、要素が次々と表示される無限スクロールについての情報ばかり出てくるんですよね。
でも今回実装したかったのは、新しい要素を次々と表示させるのではなく、リストなどの要素を繰り返し表示させるというものです。
例えば3つの要素があったとして、「要素1→要素2→要素3→要素1→要素2→要素3→要素1」みたいな感じで、最後の要素の次に最初の要素が表示されるように、ループさせるというもの。
一応、以下が自力で実装したものです。
See the Pen
scroll-roop by KUBO (@KUBOGEN)
on CodePen.
HTML
<div class=”box”>
<div class=”scroll-list”>>
<div class=”scroll-item scroll-item1″><h2>1</h2></div>
<div class=”scroll-item scroll-item2″><h2>2</h2></div>
<div class=”scroll-item scroll-item3″><h2>3</h2></div>
</div>
</div>
<div class=”box”>
<div class=”scroll-list”>>
<div class=”scroll-item scroll-item1″><h2>1</h2></div>
<div class=”scroll-item scroll-item2″><h2>2</h2></div>
<div class=”scroll-item scroll-item3″><h2>3</h2></div>
</div>
</div>
CSS
.box {
width: 400px;
height: 400px;
border: 1px solid #333;
overflow: auto;
scroll-snap-type: y mandatory;
box-sizing: border-box;
}
.scroll-list {
width: 100%;
height: 100%;
}
.scroll-item {
width: 400px;
height: 400px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
scroll-snap-align: start;
}
.scroll-item1 {
background: red;
}
.scroll-item2 {
background: green;
}
.scroll-item3 {
background: blue;
}
.box {
width: 400px;
height: 400px;
border: 1px solid #333;
overflow: auto;
scroll-snap-type: y mandatory;
box-sizing: border-box;
}
.scroll-list {
width: 100%;
height: 100%;
}
.scroll-item {
width: 400px;
height: 400px;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
scroll-snap-align: start;
}
.scroll-item1 {
background: red;
}
.scroll-item2 {
background: green;
}
.scroll-item3 {
background: blue;
}
jQuery
$(function(){
$(‘.box’).scroll(function() {
box_offset = $(‘.box’).offset().top;
item_offset = $(‘.scroll-item:last-child’).offset().top;
if ( box_offset == item_offset ) {
$(‘.scroll-list’).append($(‘.scroll-item:first-child’));
}
});
});
$(function(){
$(‘.box’).scroll(function() {
box_offset = $(‘.box’).offset().top;
item_offset = $(‘.scroll-item:last-child’).offset().top;
if ( box_offset == item_offset ) {
$(‘.scroll-list’).append($(‘.scroll-item:first-child’));
}
});
});
まずboxクラスがついている表示領域のdiv要素の位置と、最後の要素の位置を取得。
box_offset = $(‘.box’).offset().top;
item_offset = $(‘.scroll-item:last-child’).offset().top;
item_offset = $(‘.scroll-item:last-child’).offset().top;
そして、それらの位置が同じ場合は、scroll-listに最初の要素を追加します。
if ( box_offset == item_offset ) {
$(‘.scroll-list’).append($(‘.scroll-item:first-child’));
}
$(‘.scroll-list’).append($(‘.scroll-item:first-child’));
}
していることはこの2つだけ。
なお、スクロールした際に表示領域にピタッと止まる、スナップスクロールも併せて実装しています。
少し不安定ですし、これはあまりスマートなやり方ではないだろうと思いますが、他に情報が全然なかったので、とりあえず備忘録として残しておきます。
もっと良い方法あったら教えてください。
Leave a Comment