どうも!初めましての方は初めまして、初心者のWebサイト勉強のとみーです!
WordPress の無料テーマ Cocoon では、サイドバーに目次を表示するウィジェットが利用できます。
サイドバーに目次があることで、記事を読んでいる最中に
その記事がどんな構成になっているか
を確認することができ、
特定の見出しに移動したい
と思った時もすぐさま移動できるため、読者にとっての使い勝手が非常に良いです。
しかし、情報量の多い記事を書けるようになってくると、それにつれて見出しの数が多くなっていきますよね。
すると、目次があっても記事の中で今どのあたりを読んでいるのかが分かりにくくなっていくことが考えられます。
サイドバーの目次-ハイライト機能実装後の完成イメージ
今回のカスタマイズをすると、記事内で現在読んでいる部分に対応するサイドバーの目次ウィジェットの見出し部分の色が変わります。
スクロールに合わせて色が変わるため、自分が記事のどのあたりにいるのかが一目瞭然です。
動画・画像の例ではオレンジ色ですが、もちろんお好きな色に変更できます!
Cocoon のサイドバー目次のコピペカスタマイズ方法
今回のカスタマイズは、次の2ステップで行います。
- STEP1CSSコードをコピペする
- STEP2JavaScriptコードをコピペする
style.css と javascript.js のバックアップを取っておこう
今回のカスタマイズでは、
という2つのファイルを操作します。
そのため、万が一が起きても元に戻せるように、カスタマイズ前に忘れずにバックアップを取っておきましょう。
1番簡単なのはファイルの中身をコピーして、メモ帳やテキストエディタに保存しておくやり方です。
STEP1:CSS コードのコピペ
まずは、CSS コードをコピペします。
次の2ステップで行いましょう!
- STEP1style.css を開く
管理画面サイドメニュー「外観」→「テーマエディター」→「style.css」
- STEP2style.css にコードをコピぺする
style.css を開く
WordPress の管理画面サイドメニューの「外観」から「テーマエディター」を開きましょう。
初期設定では「Cocoon Child」が選択されており、「style.css」が開いてあるはずです。
違うものが選択されている場合は、それぞれ「Cocoon Child」、「style.css」を選んでください。
style.css にコードをコピペする
#toc-2 li.current {
background-color: #ffbc0099; /* ハイライト色 */
}
ここで設定しているのは、現在読んでいるコンテンツに対応する見出しの色です。
ハイライトする色を変えたい場合は、「#ffbc0099」の部分を好きな色のコードに変えましょう。
STEP2:JavaScript コードのコピペ
続いて、JavaScript コードをコピペします。
こちらも2ステップです!
- STEP1javascript.js を開く
管理画面サイドメニュー「外観」→「テーマエディター」→「javascript.js」
- STEP2javascript.js にコードをコピぺする
javascript.js を開く
先ほどの「style.css」と同じページで、「javascript.js」を開きましょう。
javascript.js にコードをコピペする
$(function() {
const headerLinks = $('#toc-2 li a');
let contentsPos = new Array();
function init() {
for (let i = 0; i < headerLinks.length; i++) {
const headerID = headerLinks.eq(i).attr('href');
const top = $(headerID).offset().top - 20;
const bottom = null;
contentsPos[i] = { top: top, bottom: bottom };
if (i > 0) {
contentsPos[i - 1].bottom = top;
}
};
const footerTop = $("footer").offset().top - 20;
contentsPos[contentsPos.length - 1].bottom = footerTop;
}
function currentCheck() {
const windowScrollTop = $(window).scrollTop();
headerLinks.parent().removeClass('current');
if (contentsPos[0].top <= windowScrollTop && contentsPos[contentsPos.length - 1].bottom > windowScrollTop) {
for (let i = 0; i < contentsPos.length; i++) {
if (contentsPos[i].top <= windowScrollTop && contentsPos[i].bottom > windowScrollTop) {
headerLinks.eq(i).parent().addClass('current');
break;
}
}
}
}
init();
$(window).on('load scroll', currentCheck);
$(document).on('change', 'input.toggle-checkbox', function() {
setTimeout(init, 350);
});
$(document).on('change', 'input.toc-checkbox', function() {
setTimeout(init, 550);
});
});
$(function() {
// ナビゲーションリンクを設定
// #toc-2: サイドバーの目次ウィジェット
// li: その各見出し
// a: そのリンク
const headerLinks = $('#toc-2 li a');
// コンテンツの位置情報の配列作成
// {
// top: 各見出しに対応するコンテンツの先頭位置
// bottom: 各見出しに対応するコンテンツの終了位置
// }
let contentsPos = new Array();
// contentsPos の初期化関数
function init() {
for (let i = 0; i < headerLinks.length; i++) {
// 見出し i のURL(アンカーポイント・リンク先)を取得
// 通常「#toc1」のような id属性が得られる
const headerID = headerLinks.eq(i).attr('href');
// コンテンツ i の先頭位置
const top = $(headerID).offset().top - 20;
// コンテンツ i の終了位置
// 暫定的に null を入れておく(後で更新)
const bottom = null;
// 配列として格納
contentsPos[i] = { top: top, bottom: bottom };
// コンテンツの下部の位置を調整
if (i > 0) {
// 前のコンテンツの終了位置 = 今のコンテンツの先頭位置
contentsPos[i - 1].bottom = top;
}
};
// footerの先頭位置を取得
const footerTop = $("footer").offset().top - 20;
// 最後のコンテンツの終了位置 = footerの先頭位置
contentsPos[contentsPos.length - 1].bottom = footerTop;
}
// 初期化の実行
init();
// 現在位置を確認してコンテンツ位置に対応
function currentCheck() {
// 現在のサイト上部からの位置を取得
const windowScrollTop = $(window).scrollTop();
// 一旦マークを解除
headerLinks.parent().removeClass('current');
// 現在位置が全コンテンツ内にあるかチェック
if (contentsPos[0].top <= windowScrollTop && contentsPos[contentsPos.length - 1].bottom > windowScrollTop) {
for (let i = 0; i < contentsPos.length; i++) {
// 現在位置がコンテンツ i 内にあるかチェック
if (contentsPos[i].top <= windowScrollTop && contentsPos[i].bottom > windowScrollTop) {
// class = "current"を aタグの親である li タグに設定
headerLinks.eq(i).parent().addClass('current');
break;
}
}
}
}
// ロード・スクロール時に見出しをマーク更新
$(window).on('load scroll', currentCheck);
// アコーディオンが開閉したら座標更新
$(document).on('change', 'input.toggle-checkbox', function() {
setTimeout(init, 350);
});
// 目次が開閉したら座標更新
$(document).on('change', 'input.toc-checkbox', function() {
setTimeout(init, 550);
});
});
コピペカスタマイズは以上になります。
まとめ
今回のカスタマイズは、読者のスクロールに合わせてサイトの様子(色)が変化します。
このような変化を動的というのですが、動的な変化があることでおしゃれ感が増します!
ぜひ参考にしてみてください。
コメント
素敵なサイトですね♪
こちらのブログを参考に目次ハイライトの設定をさせていただきました。
また、目次が自動送り(読んでいる箇所の目次部分が自動で表示される)設定になっているのも素敵だと思い、よろしければ私のサイトでもそのようにしたいと思っております。
方法や参考にしたサイトなどご教授いただけると大変嬉しく思います。
(素人の質問ですみません、、、)
※紹介していただけるとのことでしたので、ブログのリンクもお伝えさえてください。
https://babychamp-blog.com/tabi-usagi/
旅うさぎさん
コメントいただきましてありがとうございます。記事を公開している身として、参考にしていただけて嬉しい限りです!
ブログの方は記事内にてご紹介させていただきます。
目次の自動スクロール機能について、こちらは自前で実装しているものになります。
いつ頃公開できるかは未定なのですが、せっかくのご要望ですので当ページか別の記事で今後まとめたいと思います。