【jQuery】ランダムな背景色・背景画像を設定する完全ガイド|Math.random・グラデーション・セッション固定・フェード切り替えまで

アクセスするたびに背景が変わるWebページはユーザーに新鮮な印象を与えます。jQueryと Math.random() を組み合わせると、完全ランダムな背景色・事前定義した色セットからの選択・グラデーション・背景画像のランダム表示などさまざまなパターンが実現できます。

この記事でわかること

  • Math.random()でランダムな背景色・背景画像を設定する基本
  • 事前定義した色テーマ・画像リストからランダムに選ぶ
  • ランダムなグラデーション背景を生成する
  • sessionStorageでセッション内は同じ背景を保持する
  • フェードアニメーション付きで切り替える
  • ボタンクリックで動的にランダム変更する
スポンサーリンク

ランダムな背景色を設定する

完全ランダムな16進数カラーコードを生成する

$(function () {
  // 0〜16777215(#000000〜#ffffff)のランダムな整数を生成
  var r = Math.floor(Math.random() * 16777216);
  // 16進数に変換し、6桁になるよう先頭を0埋め
  var hex = '#' + r.toString(16).padStart(6, '0');

  $('body').css('background-color', hex);
  console.log('背景色:', hex);
});
完全ランダムは暗すぎる・見づらい色が出る問題
Math.random() で全16進数から選ぶと、非常に暗い(#050505)や彩度ゼロのグレー系など、テキストが読めなくなる色が選ばれることがあります。実用的にはHSL形式で明度・彩度の範囲を指定する方法や、事前定義した色セットから選ぶ方法がおすすめです。

HSL形式で明度・彩度を制限したランダム色

$(function () {
  // 色相(H): 0〜360 全範囲
  // 彩度(S): 50〜80% (鮮やかさを保つ)
  // 明度(L): 60〜80% (明るすぎず暗すぎない)
  var h = Math.floor(Math.random() * 360);
  var s = Math.floor(Math.random() * 31) + 50;  // 50〜80
  var l = Math.floor(Math.random() * 21) + 60;  // 60〜80
  var hsl = 'hsl(' + h + ', ' + s + '%, ' + l + '%)';

  $('body').css('background-color', hsl);
});

事前定義した色テーマからランダムに選ぶ

デザインの統一感を保ちながらランダム性を出したい場合は、ブランドカラーやシーズンカラーなどの色セットを配列で定義して選択します。

$(function () {
  // テーマカラーを事前定義
  var themes = [
    { bg: '#dbeafe', text: '#1e40af', name: '青テーマ' },
    { bg: '#dcfce7', text: '#166534', name: '緑テーマ' },
    { bg: '#fce7f3', text: '#9d174d', name: 'ピンクテーマ' },
    { bg: '#fef3c7', text: '#92400e', name: '黄テーマ' },
    { bg: '#f3e8ff', text: '#6b21a8', name: '紫テーマ' }
  ];

  // ランダムに1つ選択
  var theme = themes[Math.floor(Math.random() * themes.length)];

  $('body').css({
    'background-color': theme.bg,
    'color':            theme.text
  });

  console.log('選択されたテーマ:', theme.name);
});
背景色に合わせてテキスト色も変える
背景色だけ変えるとテキストが読めなくなる場合があります。テーマオブジェクトに text カラーも含め、color プロパティも同時に変更することで可読性を確保します。

ランダムなグラデーション背景を生成する

2色のランダムなHSL色を組み合わせてグラデーション背景を生成します。隣接する色相を使うことで自然な配色になります。

$(function () {
  function randomGradient() {
    // ベースとなる色相をランダムに選ぶ
    var h1 = Math.floor(Math.random() * 360);
    // 60〜120度ずれた色相で配色(補色・類似色)
    var h2 = (h1 + Math.floor(Math.random() * 61) + 60) % 360;

    var color1 = 'hsl(' + h1 + ', 70%, 75%)';
    var color2 = 'hsl(' + h2 + ', 70%, 55%)';

    // グラデーション方向もランダムに(0〜360度)
    var angle = Math.floor(Math.random() * 361);

    return 'linear-gradient(' + angle + 'deg, ' + color1 + ', ' + color2 + ')';
  }

  $('body').css('background', randomGradient());
});

背景画像をランダムに設定する

事前に用意した画像リストからランダムに1枚を選んで背景に設定します。画像の事前読み込みを行うと切り替え時のちらつきを防げます。

$(function () {
  var images = [
    '/images/bg1.jpg',
    '/images/bg2.jpg',
    '/images/bg3.jpg',
    '/images/bg4.jpg'
  ];

  // ランダムに1枚選ぶ
  var chosen = images[Math.floor(Math.random() * images.length)];

  // 背景画像を設定(事前読み込みしてからフェードイン)
  var img = new Image();
  img.onload = function () {
    $('body').css({
      'background-image':    'url(' + chosen + ')',
      'background-size':     'cover',
      'background-position': 'center'
    });
  };
  img.src = chosen;  // 読み込み開始
});

sessionStorageでセッション内は同じ背景を保持する

毎回異なる背景では、ページ内リンクを移動するたびに背景が変わってしまいます。sessionStorage に選んだ値を保存することで、同じブラウザタブ(セッション)内では同じ背景を維持できます。

$(function () {
  var themes = ['#dbeafe', '#dcfce7', '#fce7f3', '#fef3c7', '#f3e8ff'];
  var KEY = 'bg_theme';

  // sessionStorageから取得、なければランダムに選んで保存
  var saved = sessionStorage.getItem(KEY);
  if (!saved) {
    saved = themes[Math.floor(Math.random() * themes.length)];
    sessionStorage.setItem(KEY, saved);
  }

  $('body').css('background-color', saved);
});
sessionStorage・localStorage・Cookieの使い分け

  • sessionStorage: タブを閉じるとリセット。「このセッション内では同じ背景」に最適
  • localStorage: ブラウザを閉じても保持。「次回アクセスでも同じ背景」にする場合
  • Cookie: 有効期限を設定できる。「1日は同じ背景」などに使える

sessionStorage/localStorageの詳細はsessionStorage・localStorage・Cookie比較を参照してください。

フェードアニメーション付きで切り替える

背景が瞬時に変わると視覚的に唐突な印象を与えます。フェードアニメーションを加えることで滑らかに切り替わります。

$(function () {
  var themes = [
    { bg: '#dbeafe', text: '#1e40af' },
    { bg: '#dcfce7', text: '#166534' },
    { bg: '#fce7f3', text: '#9d174d' },
    { bg: '#fef3c7', text: '#92400e' }
  ];

  var theme = themes[Math.floor(Math.random() * themes.length)];

  // フェードアウト → 背景色変更 → フェードイン
  $('body').fadeTo(0, 0, function () {         // 即座に透明に
    $(this).css('background-color', theme.bg)
           .css('color', theme.text)
           .fadeTo(600, 1);                    // 600msでフェードイン
  });
});

ボタンクリックで動的にランダム変更する

ページ読み込み時だけでなく、ボタンクリックで何度でもランダムに背景を変えるパターンです。クリエイティブなポートフォリオやゲームなどで活用できます。

<button id="randomize-btn">背景をランダムに変更</button>
$(function () {
  var themes = [
    '#dbeafe', '#dcfce7', '#fce7f3', '#fef3c7',
    '#f3e8ff', '#ffedd5', '#f0fdf4', '#eff6ff'
  ];
  var lastIndex = -1;  // 直前と同じ色が連続しないようにする

  function randomize() {
    var index;
    do {
      index = Math.floor(Math.random() * themes.length);
    } while (index === lastIndex && themes.length > 1);  // 直前と違う色を選ぶ
    lastIndex = index;

    $('body').animate({ opacity: 0 }, 200, function () {
      $(this).css('background-color', themes[index])
             .animate({ opacity: 1 }, 300);
    });
  }

  randomize();  // 初期実行
  $('#randomize-btn').on('click', randomize);
});
直前と同じ値が連続しないようにする
do...while ループで直前と同じインデックスを避けることで、「クリックしたのに背景が変わらない」という状況を防げます。ランダム表示の詳細はランダムで要素を表示する完全ガイドも参照してください。

方法の比較と使い分け

方法 ランダム性 デザイン制御 向いているケース
完全ランダム16進数 最大 なし(予測不能な色) 実験的・アーティスティックな演出
HSL範囲指定 高い 明度・彩度の範囲を指定 見やすさを保ちながらランダム性を出す
テーマカラー配列 配列数に依存 完全にコントロール可能 ブランドカラーを維持しつつバリエーション
ランダムグラデーション 高い 色相・彩度・明度を制御 華やかな背景・ヒーローセクション
背景画像ランダム 画像数に依存 完全にコントロール可能 写真ギャラリー・ポートフォリオ

まとめ

ランダムな背景設定には、デザインの制御度に応じて方法を選ぶのがポイントです。

  • 完全ランダムな色は Math.random() + 16進数変換、またはHSL形式で明度範囲を制限する
  • デザインの統一感を保つにはテーマカラー配列から選択する
  • セッション内で同じ背景を維持するには sessionStorage で保存
  • 視覚的な滑らかさのために fadeTo()/animate() でフェードを加える

関連記事: ランダムで要素を表示する完全ガイド / sessionStorage・localStorage・Cookieの比較 / アニメーション完全ガイド

よくある質問(FAQ)

QMath.random()は本当にランダムですか?
AMath.random() は擬似乱数であり、理論上は予測可能ですがWeb表示の用途では十分な乱雑性があります。暗号学的に安全な乱数が必要な場合は crypto.getRandomValues() を使ってください。ただし背景色のランダム化では Math.random() で問題ありません。
Qリロードするたびに背景が変わるのを止めて、1日1回だけにしたいです。
AlocalStorageにテーマと保存日時を記録し、日付が変わったときだけ再選択してください:var saved = localStorage.getItem("theme"); var date = localStorage.getItem("date");保存した日付が今日と異なる場合だけランダム選択して再保存します。
Q特定のページだけ背景色を変えたいです。
A$("body") ではなく $("#hero-section")$(".page-top") など特定のコンテナ要素に .css("background-color", color) を適用してください。または location.pathname で現在のページを判定して条件分岐できます。
Q背景画像を設定したら表示されません。
Abackground-image を設定する要素に幅・高さが指定されていない場合、画像が表示されません。body または対象要素に min-height: 100vh を設定してください。また、画像パスが正しいか(絶対パスか相対パス)を確認してください。
Qランダムで選ばれた色をユーザーに教えたいです。
A色コードを変数に保存しておき $("#color-display").text(hex) などで表示できます。テーマオブジェクトに name プロパティを持たせれば「青テーマが選ばれました」のような説明テキストも表示できます。