目次
はじめに
スマホでページネーション付きのリストを実装した時に、最後のページをクリックするとリストの高さが変わって、リストを見失ってしまいます。
これを解決するために、ページネーションをクリックしたらリストのトップへスムースクロールさせることにしました。
導入
まずこれを実現するために、2つのライブラリを利用します。
- vuejs-paginate
- vue-scrollto
vuejs-paginateはページネーションを実装するライブラリです。
これについての解説は下記の記事を参考にしてください。
-
-
「vuejs-paginate」を使ってページネーションを実装する
「vuejs-paginate」は、ページネーションを実装するライブラリです。シンプルなAPIで提供されており、容易に実装することができます。CSSによってページネーションコンポーネントのスタイルをカスタマイズすることができます。コピペで実装できるサンプルを公開してます。
続いて、vue-scrolltoは特定の地点へスムーススクロールさせるライブラリです。
今回の実装の根幹になります。
解説は以下の記事を参考にしてください。
-
-
「vue-scrollto」を使ってイージングスクロールを実装する
「vue-scrollto」は、クリックイベントによって要素までイージングスクロールを実装するライブラリです。window.requestAnimationFrameを使用してアニメーションを実行するため、最高のパフォーマンスが得られます。イージングはbezier-easingを使って行われますコピペで実装できるサンプルを公開してます。
完成イメージ
HTML
ページネーションにクリックイベントclick-handlerを設定します。
<div id="app">
<ul class="list-group">
<li class="list-group-item" v-for="item in getItems">{{item}}</li>
</ul>
<paginate
:page-count="getPageCount"
:page-range="3"
:margin-pages="2"
:click-handler="clickCallback"
:prev-text="'<'"
:next-text="'>'"
:container-class="'pagination'"
:page-class="'page-item'">
</paginate>
</div>
スクリプト
var items = [];
for(var i=1; i<=105; i++){
items.push('item-'+i);
}
Vue.component('paginate', VuejsPaginate)
new Vue({
el: '#app',
data: {
items: items,
parPage: 10,
currentPage: 1
},
methods: {
clickCallback: function (pageNum) {
this.currentPage = Number(pageNum);
this.$scrollTo('#app', 1000, {offset: -60});
}
},
computed: {
getItems: function() {
let current = this.currentPage * this.parPage;
let start = current - this.parPage;
return this.items.slice(start, current);
},
getPageCount: function() {
return Math.ceil(this.items.length / this.parPage);
}
}
})
クリックイベントclickCallback内に this.$scrollTo(element, duration, options) を設定します。
サンプル
さいごに
ページネーションをクリックしたらリストのトップへスムースクロールさせる方法でした。
今日はこの辺でー