WordPressテーマ「SWELL」の目次機能はとても優秀ですが、
「サイドバーに固定した目次が、今読んでいる見出しに合わせて動いてくれたらもっと見やすいのに…」と思ったことはありませんか?
この記事では、読者がスクロールした位置に合わせて、
サイドバーの目次が自動的にハイライト(現在地表示)されるカスタマイズ方法を解説します!
jQueryを使わない軽量な「バニラJavaScript(Vanilla JS)」と
CSSだけで実装しているため、サイトの表示速度を落とさずに導入可能です。
💡 今回のカスタマイズで実現できること
📜 スクロール連動型ハイライト
・読んでいる見出し(H2・H3)に合わせて、サイドバーの目次が自動で色付けされます。
✨ きれいなアニメーション
・サイドバーの目次がパッと表示されるのではなく、ふわっとおしゃれにフェードインします。
📱 PC表示に最適化
・スマホでは追従サイドバー自体が表示されないため、PC読者の回遊率・利便性をグッと高めることができます。
導入手順(3ステップ)
ステップ1:SWELLの「目次ウィジェット」を追従エリアに配置する
- WordPress管理画面から 「外観」 > 「ウィジェット」 を開きます。
- 「 [SWELL] 目次 」 ウィジェットを探します。
- 「追従サイドバー(PC用)」 のエリアの中にドラッグ&ドロップで配置します。
ステップ2:JavaScript(JS)コードを追加する
- WordPress管理画面から 「外観」 > 「カスタマイズ」 を開きます。
- 「高度な設定」 をクリックします。
- 「</body_head>直前」(または「bodyタグ終了直前」のJavaScript設定エリア)に、以下のコードをそのまま貼り付けます。
<script>
document.addEventListener('DOMContentLoaded', () => {
const targetElement = document.querySelector('.c-widget > .p-toc');
if (targetElement && targetElement.previousElementSibling) {
const previousElement = targetElement.previousElementSibling;
if (previousElement && previousElement.tagName === 'DIV') {
const newSpan = document.createElement('span');
newSpan.innerHTML = previousElement.innerHTML;
Array.from(previousElement.attributes).forEach(attr => {
newSpan.setAttribute(attr.name, attr.value);
});
previousElement.replaceWith(newSpan);
}
targetElement.parentElement.classList.add('p-toc');
targetElement.parentElement.classList.add('-capbox');
targetElement.previousElementSibling.classList.remove('c-widget__title');
targetElement.previousElementSibling.classList.add('p-toc__ttl');
}
var varHtagElements = null;
var varSideBarItem = null;
window.addEventListener('load', function () {
setTimeout(function(){fnAfterContents();}, 10);
});
function fnAfterContents() {
varHtagElements = document.querySelectorAll('h2, h3');
var varHtagArray = Array.from(varHtagElements);
var varHtagPosition = varHtagArray.map(item => item.getBoundingClientRect().top);
var varHtagPositionWithScroll = varHtagPosition.map(top => Math.floor(top + window.scrollY));
varSideBarItem = document.querySelectorAll('#sidebar .p-toc__link');
if (varSideBarItem == null || varSideBarItem.length == 0) {
return;
}
const countHtag = varHtagElements.length;
const countSideBarItem = varSideBarItem.length;
const iMaxLoop = countHtag > countSideBarItem ? countSideBarItem : countHtag;
window.addEventListener('scroll', () => {
const currentPosition = window.scrollY + 200;
for (let iCount = 0; iCount < iMaxLoop; iCount++) {
varSideBarItem[iCount].classList.remove('currentTocPosition');
if (iCount >= iMaxLoop - 1 ) {
if (currentPosition >= varHtagPositionWithScroll[iCount]) {
varSideBarItem[iCount].classList.add('currentTocPosition');
}
} else {
if (currentPosition >= varHtagPositionWithScroll[iCount] && currentPosition < varHtagPositionWithScroll[iCount + 1]) {
varSideBarItem[iCount].classList.add('currentTocPosition');
}
}
}
});
}
});
</script>ステップ3:CSS(スタイルシート)を追加する
- 「外観」 > 「カスタマイズ」 > 「追加CSS」 を開きます( もしくは子テーマの
style.css)。 - 以下のコードを一番下に追加します。
/* 追従サイドバー目次 */
#fix_sidebar .widget_swell_index {
opacity: 0;
}
#sidebar .p-toc.-capbox {
animation: fadeIn 1s ease 0.3s forwards;
border: 2px solid var(--color_main);
margin: 1.5em 0 0;
}
@keyframes fadeIn {
to {
opacity: 1;
transform: none;
}
}
/* 現在読んでいる目次のハイライト設定 */
.p-toc__link.currentTocPosition {
color: white;
background-color: #0061b7 !important; /* お好みの背景色に変えてね */
font-size: 1.1em;
padding: 0 5px;
}CSS内にある #0061b7(鮮やかな青色)の部分を、
あなたのブログのメインカラーや好きなカラーコード(例: #ff0000 など)に書き換えるだけで、ハイライトの色を自由に変更できます!
動作確認をしよう!
設定が完了したら、実際にPCで長めの記事(H2やH3がいくつかある記事)を開いてスクロールしてみましょう。
読者が「今どのあたりを読んでいるのか」が視覚的にパッと分かるようになるため、長文記事でも離脱されにくくなる効果が期待できます。簡単にできるのでぜひ試してみてくださいね!
うまく動かないときのチェックリスト
・追従サイドバーに配置したウィジェットが「[SWELL] 目次」になっているか?
・JSやCSSのコードにコピー漏れ(カッコの閉じ忘れなど)がないか?
・プラグインやサーバーのキャッシュが残っていないか?(キャッシュクリアを試してください)
まとめ
・スクロール連動で、読者が「今どこを読んでいるか」迷子にならない!
・軽量なVanilla JS仕様だから、サイトの表示速度への影響も最小限。
・追加CSSで色を自由に変更できるので、ブログのテーマカラーに合わせやすい。
サイドバーの目次が今どこを指しているのか視覚的に分かるようになるだけで、長文記事の読みやすさは劇的に向上します。PCユーザーの離脱を防ぎ、他の見出しへのクリックを促す効果も期待できますよ!
少しのコピペ作業でブログのクオリティがグッと上がりますので、
ぜひあなたのSWELLブログでも試してみてくださいね!
PS
JavaScript(JS)コードを「</body_head>直前」に貼り付けるのは簡単だけど、プログラムが複数ある場合は管理が大変ですね。
子テーマを使うやり方もありますが、もっと簡単に管理できる方法を考えて記事にしたいと思います!

