本文へスキップ
  1. Web BENTO JS
  2. カテゴリ一覧
  3. 実用スクリプト
12 / UTILITY 12 パーツ

実用JSスニペット 12選

コピペで使える実用スクリプト(運用系スニペット)のサンプル集です。ダークモード切替・もっと見る・絞り込み・並び替えなど、プレビューは実際に操作できます。HTML / CSS / JS タブでコードを確認し、全部コピーを押せば1回の貼り付けで完成します。すべて依存ライブラリなしのバニラJSで、data-bnto-* 属性による自動初期化式です。

該当するパーツが見つかりませんでした。

ミニプレビュー

切り替え結果はここに反映。選択はlocalStorageに保存され、次回も維持されます。

ダークモード切替

<div class="bnto-dark" data-bnto-dark>
  <button type="button" class="tgl" aria-pressed="false">
    <span class="knob" aria-hidden="true"></span>ダークモード
  </button>
  <!-- .view = 色が切り替わる領域(実サイトでは body 全体などに) -->
  <div class="view">
    <b>ミニプレビュー</b>
    <p>切り替え結果はここに反映されます。</p>
  </div>
</div>
使い方のコツ

サイト全体に適用するには、.view ではなく document.documentElementis-dark を付け、配色をCSS変数(--bg / --tx など)で組んでおくのが定石です。保存キー KEYmy-site-theme のようにサイト固有の名前へ変更してください。

  • 新商品「春の限定セット」を発売しました
  • ゴールデンウィークの営業について
  • 公式SNSを開設しました
  • 配送料金改定のお知らせ
  • 夏季限定メニューの先行予約を開始
  • システムメンテナンスのお知らせ

もっと見るボタン

<!-- data-show="3" = 最初に見せる件数 -->
<div class="bnto-more" data-bnto-more data-show="3">
  <ul class="ls">
    <li>お知らせ 1</li>
    <li>お知らせ 2</li>
    <li>お知らせ 3</li>
    <li>お知らせ 4</li>
    <li>お知らせ 5</li>
    <li>お知らせ 6</li>
  </ul>
  <button type="button" class="btn">もっと見る</button>
</div>
使い方のコツ

「隠す処理」自体をJSで行うため、JSが無効の環境では全件が表示され、内容が読めなくなる事故が起きません。初期表示件数は data-show の数字を変えるだけで調整できます。

りんご トマト バナナ にんじん ぶどう なす

ボタンフィルタ(絞り込み)

<!-- ボタンの data-filter とカードの data-cat を対応させる -->
<div class="bnto-filter" data-bnto-filter>
  <div class="btns">
    <button type="button" class="fb is-active" data-filter="all" aria-pressed="true">すべて</button>
    <button type="button" class="fb" data-filter="fruit" aria-pressed="false">くだもの</button>
    <button type="button" class="fb" data-filter="veg" aria-pressed="false">やさい</button>
  </div>
  <div class="cards">
    <span class="cd" data-cat="fruit">りんご</span>
    <span class="cd" data-cat="veg">トマト</span>
    <!-- カードを必要な数だけ -->
  </div>
</div>
使い方のコツ

カテゴリを増やすときは、ボタンの data-filter とカードの data-cat を同じ値にするだけです。1枚のカードに複数カテゴリを持たせたい場合は data-cat="fruit red" のように空白区切りにし、判定を el.dataset.cat.split(' ').indexOf(f) !== -1 に変えます。

  • みかん¥480
  • いちご¥880
  • バナナ¥220
  • メロン¥1,580

並び替え(セレクト)

<!-- 各行に data-name / data-price(比較用の生データ)を持たせる -->
<div class="bnto-sort" data-bnto-sort>
  <label class="lb">並び替え
    <select class="sel">
      <option value="name">名前順</option>
      <option value="price-asc">価格が安い順</option>
      <option value="price-desc">価格が高い順</option>
    </select>
  </label>
  <ul class="ls">
    <li data-name="みかん" data-price="480"><b>みかん</b><span>¥480</span></li>
    <li data-name="いちご" data-price="880"><b>いちご</b><span>¥880</span></li>
    <!-- 行を必要な数だけ -->
  </ul>
</div>
使い方のコツ

appendChild は既存要素の「移動」なので、複製されずそのまま並び替わります。発売日順などを足したいときは data-date="2026-07-01" を持たせ、localeCompare で比較する選択肢を増やせばOKです。

  • 東京オフィスの営業時間
  • 大阪オフィスへのアクセス
  • オンライン相談の予約方法
  • 定休日と営業時間の変更について
  • 駐車場のご案内

簡易検索ハイライト

<div class="bnto-hilite" data-bnto-hilite>
  <input class="inp" type="search" placeholder="キーワードを入力" aria-label="リスト内を検索">
  <ul class="ls">
    <li>東京オフィスの営業時間</li>
    <li>大阪オフィスへのアクセス</li>
    <li>オンライン相談の予約方法</li>
    <!-- 行を必要な数だけ -->
  </ul>
</div>
使い方のコツ

マッチしない行を隠したい場合は、ループ内に li.hidden = q !== '' && low.indexOf(ql) === -1; を1行足すだけで「絞り込み検索」になります。FAQページや用語集との相性が抜群です。

商品価格在庫
クッキー缶¥1,80012
紅茶セット¥2,4005
ジャム3種¥1,25028
コーヒー豆¥98040

テーブルソート

<table class="bnto-tsort" data-bnto-tsort>
  <thead>
    <tr><th>商品</th><th>価格</th><th>在庫</th></tr>
  </thead>
  <tbody>
    <tr><td>クッキー缶</td><td>¥1,800</td><td>12</td></tr>
    <tr><td>紅茶セット</td><td>¥2,400</td><td>5</td></tr>
    <!-- 行を必要な数だけ -->
  </tbody>
</table>
使い方のコツ

「¥」やカンマ入りでも数値として正しく並びます(記号を取り除いてから比較)。日付列は 2026-07-01 のようなゼロ埋め形式にしておくと、文字列比較でも正しい順になります。料金表・スペック比較表にどうぞ。

外部リンク自動処理

<!-- data-bnto-extlink の中の外部リンクだけ自動処理される -->
<div class="bnto-extlink" data-bnto-extlink>
  <ul class="ls">
    <li><a href="./about.html">内部リンク(変化なし)</a></li>
    <li><a href="https://example.com/">外部サイトへのリンク</a></li>
    <li><a href="https://developer.mozilla.org/ja/">MDN Web Docs</a></li>
  </ul>
</div>
使い方のコツ

対象を本文全体に広げたいときは data-bnto-extlink を記事の親要素(<main> など)に付けるだけです。rel="noopener noreferrer" は、新しいタブから元ページを操作されるのを防ぐセキュリティ対策として必須級です。

© 2020 Web BENTO Sample Inc.

HTMLには「2020」と書かれていますが、表示は自動で今年になります。

コピーライト年 自動更新

<!-- 中の年はJSが毎回「今年」に書き換える(JS無効時の保険に一応書いておく) -->
<footer class="bnto-year">
  <p class="cp">© <span data-bnto-year>2020</span> Your Company</p>
</footer>
使い方のコツ

年が変わるたびにフッターを直す作業がなくなります。「2020–2026」のような期間表記にしたいときは el.textContent = '2020–' + new Date().getFullYear(); に変更してください。HTML側にも実際の年を書いておくと、JS無効環境でも不自然になりません。

固定ヘッダー(34px)
概要

スムーススクロールのミニデモです。上の目次リンクを押すと、この枠の中がなめらかにスクロールします。

料金

固定ヘッダー(34px)ぶん手前で止まるので、移動先の見出しがヘッダーに隠れません。

アクセス

data-offset の値を変えるだけで、停止位置をヘッダーの高さに合わせられます。

スムーススクロール(ヘッダー補正付き)

<!-- data-offset="34" = 固定ヘッダーの高さ(px)。この分だけ手前で止まる -->
<div class="bnto-smooth" data-bnto-smooth data-offset="34">
  <nav class="toc">
    <a href="#bnto-sec1">概要</a>
    <a href="#bnto-sec2">料金</a>
    <a href="#bnto-sec3">アクセス</a>
  </nav>
  <!-- .frame = デモ用のスクロール枠。ページ全体で使うときはこの枠は不要 -->
  <div class="frame">
    <div class="hd">固定ヘッダー(34px)</div>
    <section class="sec" id="bnto-sec1"><b>概要</b><p>…</p></section>
    <section class="sec" id="bnto-sec2"><b>料金</b><p>…</p></section>
    <section class="sec" id="bnto-sec3"><b>アクセス</b><p>…</p></section>
  </div>
</div>
使い方のコツ

実サイトでは bodydata-bnto-smooth data-offset="ヘッダーの高さ" を付けるだけで、ページ内の a[href^="#"] がすべて対象になります。history.pushState でURLのハッシュも書き換えるため、移動後のURLをそのまま共有でき、ブラウザの戻るボタンで前の位置に戻れます(不要ならその行を削除)。JSが無効でもブラウザ標準のジャンプで移動でき、リンク切れの心配もありません。

このボタンと注記には .no-print が付いているので、印刷プレビューには表示されません。

印刷ボタン

<!-- ボタンに data-bnto-printbtn を付けるだけ。.no-print = 印刷時に隠す -->
<div class="bnto-print">
  <button type="button" class="pb no-print" data-bnto-printbtn>このページを印刷</button>
  <p class="no-print nt">この注記は印刷には含まれません。</p>
</div>
使い方のコツ

本命は @media print の側です。ヘッダー・ナビ・広告など「紙に不要な要素」に .no-print を付けておくと、印刷物がぐっと読みやすくなります(ボタン自身にも付けるのを忘れずに)。逆に印刷時だけ見せたい要素は、通常時 display: none にしておき @media print 内で表示に切り替えます。

サンプル文章

ボタンを押すと、このボックスの文字サイズが切り替わります。選択はlocalStorageに保存され、次回も維持されます。

文字サイズ切替

<!-- data-target = 適用先セレクタ(省略時は html = ページ全体) -->
<div class="bnto-fontsize" data-bnto-fontsize data-target="#bnto-fs-sample">
  <div class="btns">
    <button type="button" class="fs" data-size="s" aria-pressed="false">小</button>
    <button type="button" class="fs" data-size="m" aria-pressed="true">標準</button>
    <button type="button" class="fs" data-size="l" aria-pressed="false">大</button>
  </div>
  <!-- デモ用の適用先。実サイトでは data-target を省略して html に適用 -->
  <div class="smp" id="bnto-fs-sample">
    <b>サンプル文章</b>
    <p>ボタンを押すと文字サイズが切り替わります。</p>
  </div>
</div>
使い方のコツ

このデモでは data-target でサンプルボックスだけに適用していますが、実サイトでは data-target を省略すると html 要素(ルート)に適用されます。文字サイズやレイアウトを rem で組んでおけば、ボタンひとつでページ全体が拡大・縮小されます。保存キーは data-key でサイト固有の名前に変更してください。

プラン料金サポート
ライト¥980/月メール
スタンダード¥2,480/月メール+電話
プロ¥4,800/月専任担当

テーブル⇄カード表示切替

<!-- 各 td の data-label = カード表示時の見出しラベル -->
<div class="bnto-tablecard" data-bnto-tablecard>
  <button type="button" class="bt-toggle" aria-pressed="false">カード表示にする</button>
  <table>
    <thead>
      <tr><th>プラン</th><th>料金</th><th>サポート</th></tr>
    </thead>
    <tbody>
      <tr><td data-label="プラン">ライト</td><td data-label="料金">¥980/月</td><td data-label="サポート">メール</td></tr>
      <tr><td data-label="プラン">スタンダード</td><td data-label="料金">¥2,480/月</td><td data-label="サポート">メール+電話</td></tr>
      <!-- 行を必要な数だけ -->
    </tbody>
  </table>
</div>
使い方のコツ

tddata-label には、対応する th と同じ文言を入れてください。ボタンではなく画面幅で自動的に切り替えたい場合は、.is-cards 用のCSSを @media (max-width: 600px) の中に(.is-cards を外して)移せば、JSなしのレスポンシブ表になります。料金表やスペック比較表のスマホ対応にどうぞ。

実用JSスニペットの基礎知識

このページのスニペットは、見た目の演出ではなくサイト運用の手間を減らすことに主眼を置いた実用系です。「毎年コピーライトの年を書き換える」「お知らせが増えるたびにページが縦に伸びる」「外部リンクにひとつずつ target="_blank" を付ける」——そんな小さな困りごとを、それぞれ数十行のバニラJavaScriptで解決します。jQueryもフレームワークも不要です。

使い方は、HTML / CSS / JSの3タブをそれぞれ貼り付けるか、「全部コピー」ボタンでひとまとめになったコードを1回貼り付けるだけです。初期化は data-bnto-* 属性の自動検出式なので、同じページに何個置いても、うっかりコードを2回貼っても壊れません。

「少ないJSで運用をラクにする」という発想

大きなフレームワークを導入しなくても、必要な箇所に小さなスクリプトを差し込むだけでサイトは十分に賢くなります。読み込みが軽く、依存の更新に追われることもなく、WordPressや静的サイトなど既存サイトへの後付けが簡単なのがこのアプローチの強みです。絞り込み・並び替え・テーブルソートは、件数が数百程度までならこの方式で快適に動きます。

プログレッシブエンハンスメントという考え方

JavaScriptが無効・読み込み失敗でもコンテンツ自体は読めるように作るのが基本です。たとえば「もっと見る」は、HTMLでは全件を書いておき、「隠す処理」はJSが担当する設計になっています。JSが動かなければ全件表示されるだけで、情報が失われません。フィルタや並び替えも同様に、初期状態のHTMLだけでページとして成立します。

localStorage を使うときの注意点

ダークモード設定のような「ユーザーの選択の記憶」には localStorage が便利ですが、プライベートブラウズやストレージがブロックされた環境では例外が発生することがあります。読み書きは必ず try/catch で包みましょう(このページのサンプルは実装済み)。また、キー名はサイト固有の名前にして他のスクリプトとの衝突を避け、個人情報は保存しないのが原則です。

「全部コピー」と「分けて貼る」の使い分け

「全部コピー」を使うと、HTML・CSS・JavaScriptがひとつの自己完結ブロックとしてコピーされるので、1回の貼り付けだけですぐ動きを確認できます。動作のお試しや、1ページ完結のLPに組み込むときはこの方法が手軽です。

一方、本番サイトへ本格的に組み込む場合は、CSSはスタイルシート(.cssファイル)へ、JavaScriptは</body>直前や共通の.jsファイルへ、HTMLは使いたい場所へと分けて貼るのが一般的です。スタイルとスクリプトを1か所に集約できるため、複数ページ・複数パーツで使い回すときの管理がしやすく、ブラウザのキャッシュも効きやすくなります。なお、同じパーツをページ内で何度も使う場合でも、CSSとJSを貼るのは1回だけで大丈夫です(初期化スクリプトが該当要素すべてに自動で効きます)。

よくある質問

コピーしたスニペットはそのまま動きますか?
はい。「全部コピー」を押すとHTML・CSS・JSがひとつの自己完結ブロックになってコピーされ、ページに貼り付けるだけで動きます。ライブラリの読み込みは一切不要です。
ダークモードの設定はどこに保存されますか?
ブラウザの localStorage に保存され、次回訪問時も維持されます。初回訪問時はOSの設定(prefers-color-scheme)を初期値として使います。プライベートブラウズなどで保存に失敗しても動作が止まらないよう、try/catch で保護しています。
jQueryや他のライブラリと併用できますか?
できます。すべて素のJavaScriptで書かれ、即時実行関数(IIFE)で囲んでいるためグローバル変数を汚しません。jQueryが読み込まれているWordPressサイトなどへの後付けも簡単です。
JavaScriptが無効の環境ではどうなりますか?
コンテンツが読めなくなることはありません。「もっと見る」は全件表示のまま、フィルタや並び替えは初期の並びのまま表示される、プログレッシブエンハンスメント設計です。コピーライト年だけはHTMLに書いた年のまま表示されます。
このページのパーツはAIコーディングツールでも使えますか?
はい。Claude CodeやCursorのようにWebページを読めるAIには、このページのURLとパーツ名(例:「もっと見るボタン」)を伝えるだけで実装を指示できます。AIがWebを読めない場合は、「全部コピー」で取得した自己完結ブロックをチャットに貼り付けて調整を頼むのが確実です。改変後のコードは、公開前に動作確認することをおすすめします。

関連カテゴリ

実用スクリプトと組み合わせて使いやすいパーツはこちらです。