【スポンサーリンク】

[JavaScript]目次の開閉状態をCookieで記憶させた

[JavaScript]目次の開閉状態をCookieで記憶させた
  • 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コードは以下のように動作します:

  1. saveCheckboxState() 関数:
    チェックボックスの状態を取得し、Cookieに保存します。
  2. loadCheckboxState() 関数:
    Cookieからチェックボックスの状態を読み込み、チェックボックスに適用します。
  3. 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] カテゴリーが更新されない?
[WordPress] カテゴリーが更新されない?
WordPressで記事のカテゴリーを増やしたら、投稿パネルの「カテゴリー」が更新されない、というケースがありました。 カテゴリーを増やした別のPCからログインして、記事を編集しようとすると、記事編集画面のカテゴリーが以前のままなのです。カテゴリーの追加が反映されていません。 設定から「カテゴリー」を表示すると、正しく表示されるのですが……どうもブラウザ(Chrome)にキャッシュが残っているようです。 記事編集画面を更新しても戻りません。 そこで、Chromeの設定から「C...

[JavaScript]下にスクロールするとヘッダーメニューを半透明にするようにした
[JavaScript]下にスクロールするとヘッダーメニューを半透明にするようにした
Xのタイムラインを見ていたら、画面のメニューバーの透過度が上下のスクロールに応じて変化していることに気づきました。 少し下にスクロールすると半透明になり、少し上にスクロールすると元に戻っています。 自分のサイトのヘッダーメニュー(mobile-header-menu-buttons)でも、このような処理をするように、JavaScriptを作りたいと思います。 画面内の情報の表示範囲が増えるからです。 javascript.jsとstyle.css 機能 ユーザーがページを下に...

QRコードを読み込むと、関連記事を確認できます。

[JavaScript]目次の開閉状態をCookieで記憶させた
【スポンサーリンク】
タイトルとURLをコピーしました