TOP ──BLOG ──Web

JavaScriptで時限バナーを自動表示する方法

ネットショップを管理しているとキャンペーンなどで、この期間・時間だけバナーを表示したいということはありませんか?

著者が仕事でよく言われたのは、日付が変わるタイミングでバナーの上げ下ろしをしたいという事でした。深夜に手作業なんてしたくないということで、バナーの表示を自動化する方法を紹介させていただきます。jQueryも使っていないので、ファイルを追加で読み込む必要もありません。

仕組み

やっていることは単純です。

  1. バナーを非表示の状態で設置しておく

    HTMLにはあらかじめバナーを書いておき、初期状態では見えないようにしておきます。

  2. JavaScriptで現在時刻を調べる

    ページが読み込まれたタイミングで、いまが指定した期間内かどうかを判定します。

  3. 期間内なら表示に切り替える

    条件を満たしていれば非表示を解除します。期間外なら何も起きません。

「時間が来たらバナーを作る」のではなく、「最初から置いてあるものを見えるようにする」というイメージです。

HTMLを用意する

まずはバナー本体です。初期状態で隠しておくために hidden 属性を付けています。

<div id="js-timed-banner" hidden>
  <a href="https://example.com/campaign/">
    <img src="/images/campaign-banner.jpg" width="800" height="400"
         alt="秋の感謝セール 最大50%OFF">
  </a>
</div>

見た目の調整はCSSに書きます。

#js-timed-banner {
  max-width: 800px;
  margin: 0 auto;
}
#js-timed-banner img {
  width: 100%;
  height: auto;
}
/* hidden 属性を確実に効かせるための保険 */
[hidden] {
  display: none !important;
}
補足

[hidden] { display: none !important; } を入れているのは、あとから #js-timed-banner に display: flex などを指定したときに hidden 属性が打ち消されてしまうのを防ぐためです。テンプレートによっては起こりやすい事故なので、入れておくと安心です。

JavaScriptで表示を切り替える

開始日時と終了日時を書き換えるだけで使えます。

<script>
  (function () {
    var banner = document.getElementById('js-timed-banner');
    if (!banner) return;

    // 開始日時と終了日時(末尾の +09:00 で日本時間として固定する)
    var start = new Date('2026-09-22T00:00:00+09:00');
    var end   = new Date('2026-09-23T00:00:00+09:00');

    var now = new Date();
    if (now >= start && now < end) {
      banner.hidden = false;
    }
  })();
</script>

</body> の直前など、バナーのHTMLより後ろに置いてください。バナーより先に実行されると getElementById が要素を見つけられません。

日時の書き方について

new Date('2026-09-22T00:00:00+09:00') という書き方をしているのがポイントです。

書き方 基準になる時刻
new Date(2026, 8, 22, 0, 0, 0) 閲覧者のデバイスのタイムゾーン
new Date('2026-09-22T00:00:00+09:00') 日本時間で固定

前者の書き方だと、海外から見ている人や端末のタイムゾーン設定がずれている人には、意図した時刻に切り替わりません。開始時刻を日本時間で揃えたいなら、+09:00 を付けた書き方が確実です。

ポイント

数値で月を指定する new Date(2026, 8, 22) の形式は、月が0から始まるため9月が 8 になります。1ヶ月ずれる原因としてよくあるので、文字列で書いたほうが間違いがありません。

コピペ用の完成コード

HTMLとJavaScriptをまとめたものです。日時と画像パス、リンク先を書き換えてお使いください。

<div id="js-timed-banner" hidden>
  <a href="https://example.com/campaign/">
    <img src="/images/campaign-banner.jpg" width="800" height="400"
         alt="秋の感謝セール 最大50%OFF">
  </a>
</div>

<style>
  #js-timed-banner { max-width: 800px; margin: 0 auto; }
  #js-timed-banner img { width: 100%; height: auto; }
  [hidden] { display: none !important; }
</style>

<script>
  (function () {
    var banner = document.getElementById('js-timed-banner');
    if (!banner) return;

    var start = new Date('2026-09-22T00:00:00+09:00');
    var end   = new Date('2026-09-23T00:00:00+09:00');

    var now = new Date();
    if (now >= start && now < end) {
      banner.hidden = false;
    }
  })();
</script>

ページを開いたまま日付をまたぐ場合

上のコードは、ページを読み込んだ瞬間に1回だけ判定します。そのため23時59分にページを開いて放置した人の画面では、0時になってもバナーは出てきません。

深夜0時ちょうどに切り替えたい場合や、長時間開かれるページに設置する場合は、定期的に判定し直します。

<script>
  (function () {
    var banner = document.getElementById('js-timed-banner');
    if (!banner) return;

    var start = new Date('2026-09-22T00:00:00+09:00');
    var end   = new Date('2026-09-23T00:00:00+09:00');

    function update() {
      var now = new Date();
      banner.hidden = !(now >= start && now < end);
    }

    update();                  // 読み込み時に1回
    setInterval(update, 1000); // 以降1秒ごとに判定
  })();
</script>

こちらなら終了時刻を過ぎたときに自動で消えてくれます。読み込み時に1回だけの方式だと、開きっぱなしのページにバナーが残り続けてしまうので。

1秒ごとの判定といっても日時を比べるだけなので、負荷はほぼありません。気になるようなら setInterval(update, 30000) くらいに延ばしても、実用上は困らないと思います。

注意点

今回はあくまで一番簡単にできるを目指して作りましたので、少し注意点があります。

デバイスの時計を見ている

new Date() は閲覧者のデバイスの時計を読んでいます。そこまでする人はいないと思いますが、端末の日付を対象の時間にずらすと、期間外でもバナーが表示されてしまいます。

タイムゾーンのズレは先ほどの +09:00 で対処できますが、意図的に時計を変更されるケースまでは防げません。

隠しているだけで、秘密にはできない

このやり方は、HTMLにバナーを置いたうえで見えなくしているだけです。ページのソースを見れば、公開前のキャンペーン内容も画像も読めてしまいます。

注意

価格や内容を公開前に知られたくない場合、この方法は使えません。フライング表示を確実に防ぐ必要があるなら、サーバー側で出し分ける(PHPなどで期間内のときだけHTMLを出力する)実装にしてください。クライアントサイドの時限表示は、差し替え作業を自動化するための仕組みと考えておくのが安全です。

JavaScriptが無効だと出ない

初期状態を非表示にしているので、JavaScriptが動かない環境ではバナーは出ません。時限バナーは装飾的な要素であることが多いので実害は少ないですが、重要な告知には向きません。

ECモールのタグに注意

ECモールのテンプレートから持ってきたコードには、onclick="this.href=_wa.link(this.href)" のようなアクセス解析用のタグが付いていることがあります。これはそのモール内でのみ動作するもので、自社サイトにそのまま貼るとクリック時にエラーになります。コピーするときは外してください。

よくある質問

設置したのにバナーが表示されません。

よくある原因は3つです。<script> をバナーのHTMLより前に置いていて要素が見つかっていないケース、HTMLの id とJavaScript側の指定が一致していないケース、そして日時の指定ミスです。数値形式で書いた場合は月が0から始まる点を特に疑ってください。ブラウザの開発者ツールでコンソールにエラーが出ていないか確認するのが早いです。

複数のバナーを時間帯で出し分けたいです。

バナーごとに違う id を振り、それぞれに開始・終了日時を持たせれば実現できます。数が増えてきたら、HTML側に data-start / data-end 属性で日時を持たせてJavaScript側でまとめて処理すると、コードが1つで済みます。

終了時刻を過ぎたら自動でバナーを消せますか?

setInterval を使う方式なら自動で消えます。読み込み時に1回だけ判定する方式では、開いたままのページにバナーが残り続けるため、終了時刻の精度が必要な場合は定期判定にしてください。

WordPressでも使えますか?

使えます。テーマのテンプレートファイルに直接書くか、カスタムHTMLウィジェットに貼り付けてください。同じバナーを複数ページに出す場合は、インクルード用のファイルにまとめて読み込む形にすると変更が1箇所で済みます。

最後に

実際にネットショップなどで使用するときは、バナー表示のソースコードをインクルード化して複数のファイルに読み込むことが多いかと思います。

業務を進める上でファイルを少なく簡略化することが、運用していく上でとても大事だと感じましたので今回こちらのやり方を紹介させていただきました。深夜に手作業で差し替える必要がなくなるだけでも、だいぶ違います。ぜひ試してみて下さい。

あわせて読みたい

代表 morino のポートレート

この記事を書いた人

morino

Webサイト・ECサイト制作、SNS運用、体験型ゲーム制作をひとりで手がけています。