はてなブログのトップページに「前のページ」を実装する
はてなブログのトップページって、「全文形式」にしろ「一覧形式」にしろ、次のページへ飛びますと「前のページ」のリンクがなく、ブラウザの戻るで戻るしかないですよね。
なぜなんですかね? 必要ないですか?
ブラウザにマウスジェスチャーを入れていればさほど気にはなりませんが、「前のページ」を実装する方法を考えてみました。
01SessionStorage での実装
実は、以前同じことを考え、SessionStorage を使う方法で実現させたことがあります。
苦労した結果ではありますが(笑)、考えてみれば history.back()
を使ったほうが手っ取り早いですね。
02history.back() での実装
まず、ページャーの html ソースを見てみます。
<div class="pager autopagerize_insert_before"> <span class="pager-next"> <a href="http://ドメイン/?page=10桁の数字(記事のID?)" rel="next">次のページ</a> </span> </div>
こうなっていますので、pager-next
の前に
<span class="pager-prev"> <a href="#" onClick="history.back(); return false;">前のページ</a> </span>
を挿入すればいいはずです。
前のページがない場合
ただ、いくつか問題があります。まず、最初にホームを表示した場合には前のページがありませんので、挿入しないようにしないといけません。この場合は、ページの url をみてクエリパラメーターがあるかないかで分岐しましょう。
location.href.indexOf('?page=') が -1 ならサイトのホーム
検索やブックマークからきた場合
トップページの2ページめや3ページ目が Google にインデックスされたり、どこかでブックマークされることもありそうです。この場合も他のサイトに戻ってしまいます。この場合は、リファラをみて自分のサイトかどうかで分岐しましょう。他のサイトから来たのであればホームに飛ばすしかなさそうです。
document.referrer.indexOf(document.domain) が -1 なら他のサイトから来た
「前のページ」を実装する Javascript
こうなりました。
<script> (function(){ if(document.body.classList.contains('page-index')){ if(location.href.indexOf('?page=') !== -1){ var pager = document.getElementsByClassName('pager')[0]; var elemSpan = document.createElement('span'); var prev; if(document.referrer.indexOf(document.domain) !== -1) { prev = '<a href="#" onClick="history.back(); return false;">前のページ</a>'; }else{ prev = '<a href="/">ホーム</a>'; } elemSpan.innerHTML = prev; elemSpan.classList.add('pager-prev') pager.insertBefore(elemSpan, pager.firstChild); } } }()); </script>
- ホームの場合は「前のページ」を表示しません
- 「次のページ」をクリックして移動した場合は前のページに戻ります
- 他のサイトから来た場合は「ホーム」を表示しホームに戻ります
03サンプル CSS
} .page-index .pager-prev, .page-index .pager-next { display: inline-block; position: relative; width: 70px; height: 70px; background: #afb364; text-align: center; border-radius: 70px; margin: 0 10px; transition: all 500ms; color: #fff; } .page-index .pager-prev::before, .page-index .pager-next::before { font-family: blogicon; font-size: 40px; line-height: 70px; } .page-index .pager-prev:hover, .page-index .pager-next:hover { background: #747827; color: #afb364; } .page-index .pager-prev a, .page-index .pager-next a { text-indent: -9999px; position: absolute; display: block; width: 100%; height: 100%; top: 0; left: 0; } .page-index .pager-prev::before { content: "\f005"; } .page-index .pager-next::before { content: "\f006"; }
上の CSS が適用された画像です。「次のページ」にマウスオーバーした状態です。