このページはWordpressでできているのですが、このたび自動でh2を集計して目次を作る機能を作ってみました。
今は各ページこんな感じで表示されていると思います。
仕組み
テーマはSimplicityというのを利用していますので、これ専用で作ってます。
もしこれを入れたくてかつ他のテーマの人は適宜書き換えてください。(class名等が違うはずなので)
今回はJavaScriptとcssだけで完結させて、phpは一切触っていません。
JavaScript
jQuery(window).ready(function() { var $ = jQuery; var createIndex = function(clazz, tag) { return '<li><a class="aih-buttons" href="javascript:void(0);" name="aih-' + clazz + '">' + tag + '</a></li>'; }; var indices = ''; var n = 1; $('h2').each(function() { $('<a>').attr('id', 'aih' + n).insertBefore(this); indices += createIndex('aih' + n, $(this).text()); ++n; } ); indices += createIndex('related-entries', '関連記事'); indices += createIndex('comment-area', 'コメント'); var index = $('<div>'); index.attr('id', 'article-index' ); index.html('<div id="article-index-header"><a id="article-index-switch" href="javascript:void(0);">▼目次</a></div><div id="article-index-main"><ul id="article-index-list">' + indices + '</ul></div></div>'); index.insertBefore('#the-content'); index.ready(function() { var toggle = function() { var text = ($(this).is(':visible') ? '▲' : '▼') + '目次'; $('#article-index-switch').text(text); }; $('#article-index-switch').click(function() { $('#article-index-main').toggle(300, toggle); } ); $('.aih-buttons').click(function() { var target = $(this).attr('name').substr('aih-'.length); var top = $('#' + target).position().top | 0; if (top > 16) { top -= 16; } $('body,html').animate( { scrollTop: top }, 800); } ); } ); } );
まずJavaScript
h2の前にスクロール先となるaタグを挿入しています。($(h2).eachの部分)
スクロール先の識別にはname属性を利用しています。
<li>の項目がクリックされたら($(‘.aih-buttons’).clickの部分)スクロール先のtopを取得してそこにスクロールするjQueryの命令を呼んでいるだけです。
おまけで、関連記事とコメントも目次に足しています。
CSS
#article-index { border-bottom: dashed 3px #ccc; margin-bottom: 12px; margin-top: 8px; } #article-index-list { margin-top: 2px; } #article-index-main { display: none; } #article-index-header { font-size: 120%; font-weight: bold; }
これは表示を調整しているくらいです。
最初に目次表示されていると邪魔なので#article-index-mainのdisplayはnoneにして初期は非表示にしています。