- JavaScriptを使用して目次のチェックボックス状態をCookieに保存するようにしてみました。
- ページ再読み込み後も状態を維持するためにイベントリスナーで設定しています。
- ちらつき防止のためのCSSも設定しました。
1. JavaScriptコード
前回は、サイドバーに目次を追加しました。
チェックボックスの状態をJavaScriptを使ってCookieに保存し、ページを再読み込みした後もその状態を維持するようにしてみました。
/** 2024-08-30 チェックボックスの状態を保存する関数 */
// チェックボックスの状態を保存する関数
function saveCheckboxState() {
const checkbox = document.getElementById('toc-checkbox-3');
document.cookie = `toc-checkbox-3=${checkbox.checked}; max-age=31536000; path=/`;
}
// チェックボックスの状態を読み込む関数
function loadCheckboxState() {
const checkbox = document.getElementById('toc-checkbox-3');
const cookies = document.cookie.split(';');
for (let cookie of cookies) {
const [name, value] = cookie.trim().split('=');
if (name === 'toc-checkbox-3') {
checkbox.checked = value === 'true';
break;
}
}
}
// 即時関数を使用してコードを実行
(function() {
loadCheckboxState();
const checkbox = document.getElementById('toc-checkbox-3');
checkbox.addEventListener('change', saveCheckboxState);
// チェックボックスを表示
document.body.classList.add('js-loaded');
})();
このJavaScriptコードは以下のように動作します:
saveCheckboxState()
関数:
チェックボックスの状態を取得し、Cookieに保存します。loadCheckboxState()
関数:
Cookieからチェックボックスの状態を読み込み、チェックボックスに適用します。- JavaScriptコードは即時関数内で実行
DOMの読み込みを待つ必要がなく、コードがより早く実行されます。
ページ読み込み時にチェックボックスの状態を読み込み、チェックボックスの変更イベントにリスナーを設定します。
2. ちらつき防止のためのロード済みチェック(CSS)
ちらつきを防ぐためにCSSも設定します。
JavaScriptコードが実行されると、body
要素に js-loaded
クラスが追加されます。
これにより、CSSルールが適用され、チェックボックスが表示されます。
/** 2024-08-30 チェックボックスの状態を保存する */
/* JavaScriptが読み込まれる前の暫定表示 */
#main-scroll .toc-checkbox:checked~.toc-content {
opacity: .2;
left:0px;
visibility: hidden;
}
#main-scroll .toc-checkbox:checked~.toc-title::after {
content: '\f101';
}
/* JavaScriptが読み込まれたら表示する */
.js-loaded #main-scroll .toc-checkbox:checked~.toc-title::after {
content: '\f100';
}
.js-loaded #main-scroll .toc-checkbox:checked~.toc-content {
left:16px;
opacity: 1;
visibility: visible;
}
CSSで、.toc-checkbox
クラスを持つ要素(チェックボックス)を初期状態で非表示にします。
こちらもどうぞ。

![[WordPress] カテゴリーが更新されない?](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iMTk4IiB2aWV3Qm94PSIwIDAgMzIwIDE5OCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==)
![[JavaScript]下にスクロールするとヘッダーメニューを半透明にするようにした](data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMjAiIGhlaWdodD0iMTk4IiB2aWV3Qm94PSIwIDAgMzIwIDE5OCI+PHJlY3Qgd2lkdGg9IjEwMCUiIGhlaWdodD0iMTAwJSIgZmlsbD0iI2ZmZmZmZiIvPjwvc3ZnPg==)

「クッキーに同意する」とどんな問題があるの?
先日、ブログを開いたら「クッキーに同意する」という表示がありました。そのまま閲覧を続けていたのですが、ということは「同意」したことになりますよね。 特に問題はないでしょうか? 最近、あちこちでクッキーに同意するかが表示されますが、そんなに気にしなくてよいものでしょうか?「クッキーに同意」というのが、そもそも何に同意しているのか分からなくて、なんか不安になりますよね。 これは、基本的には「法律上の義務で確認している」ものです。主にネット広告の情報分析で利用されますが、最近のスマ...
![[WordPress] カテゴリーが更新されない?](https://chiilabo.com/wp-content/uploads/2022/09/image-6-36-320x198.jpg)
[WordPress] カテゴリーが更新されない?
WordPressで記事のカテゴリーを増やしたら、投稿パネルの「カテゴリー」が更新されない、というケースがありました。カテゴリーを増やした別のPCからログインして、記事を編集しようとすると、記事編集画面のカテゴリーが以前のままなのです。カテゴリーの追加が反映されていません。設定から「カテゴリー」を表示すると、正しく表示されるのですが……どうもブラウザ(Chrome)にキャッシュが残っているようです。記事編集画面を更新しても戻りません。そこで、Chromeの設定から「Cooki...
![[JavaScript]下にスクロールするとヘッダーメニューを半透明にするようにした](https://chiilabo.com/wp-content/uploads/2024/05/image-9-37-320x198.jpg)
[JavaScript]下にスクロールするとヘッダーメニューを半透明にするようにした
Xのタイムラインを見ていたら、画面のメニューバーの透過度が上下のスクロールに応じて変化していることに気づきました。少し下にスクロールすると半透明になり、少し上にスクロールすると元に戻っています。自分のサイトのヘッダーメニュー(mobile-header-menu-buttons)でも、このような処理をするように、JavaScriptを作りたいと思います。画面内の情報の表示範囲が増えるからです。javascript.jsとstyle.css機能ユーザーがページを下にスクロールす...
QRコードを読み込むと、関連記事を確認できます。
![[JavaScript]目次の開閉状態をCookieで記憶させた](https://api.qrserver.com/v1/create-qr-code/?data=?size=200x200&data=https%3A%2F%2Fchiilabo.com%2F2024-08%2Fjavascript-checkbox-state-cookie-memory%2F)