ブラウザの背景全体に画像を表示する(ランダム配置とアニメーション) | デザインってオモシロイ -MdN Design Interactive-

ブラウザの背景全体に画像を表示する(ランダム配置とアニメーション)

2024.4.20 SAT

【サイトリニューアル!】新サイトはこちらMdNについて

いまWebの現場で使われている「jQuery」デザイン メソッド


第3回 ブラウザの背景全体に画像を表示する(ランダム配置とアニメーション)


ブラウザの背景全体に一枚のグラフィック画像を表示するサンプル作成。表示だけでは簡単なので背景画像をランダムに表示させたり、複数枚をフェードアニメーションで切り替えるサンプルを作成しました。

解説:(有)ムーニーワークス ハヤシユタカ



今回はブラウザ全体に写真を配置してダイナミックなビジュアルサイトを作成するサンプルを作成します。CSSなどでも背景に写真を配置することができますが、様々なウインドウサイズによって表示領域を制御するためにjQueryを使用して作成してみました。一枚画像の表示だけでは簡単なので、背景画像をランダムに表示させたり、複数枚をフェードアニメーションで切り替えるサンプルを作成しました。写真をメインにしたり、グラフィカルなサイトを作成する場合に便利なサンプルになっていると思います。


今回作成したサンプル

今回のサンプル
●サンプルを見る:「背景に写真を配置したサンプル
●サンプルを見る:「背景画像をランダムにし一定時間でアニメーションさせるサンプル


ビジュアル画像をHTMLに読み込ませる


今回は背景に表示させる画像はCSSでの背景画像指定ではなく、表示させる領域を制御するためにdiv#background内にimg要素にて配置します。

画像が拡大縮小されるからといってwidthとheightの属性は記述しないと拡大縮小率がおかしくなるので用意した画像サイズを指定します。

用意する画像サイズに決まりはないですが、あまり小さいと大きなモニタで画質が悪くないので注意しましょう。ちなみに今回はワイドモニタを想定して比率を調整しました。

表示に使用した画像はこちらです↓(本記事ではリサイズしています)。


(▲クリックして拡大)
■■■■ HTMLコード
<div id="background">
<img src="img/img.jpg" alt="" width="1280" height="853">
</div>



ブラウザサイズによっての背景画像の表示に配慮しよう


写真を全面に配置する場合の注意する点としては、ブラウザのサイズによって見える範囲が極端に違うとイメージが伝わりにくくなるので、異なるブラウザサイズでもビジュアルイメージを崩さないように画像を中央を基準にリサイズさせます。ウィンドウサイズが指定したコンテンツのサイズを下回った場合には、画像のリサイズを中止しスクロールバーを表示させるなどの配慮しましょう。

今回使用する空と海の写真では、中央を基準に表示されるので地面や空や左右は切れても綺麗な海のイメージは伝えることができるかと思います。また、極端に縦長や横長にしたブラウウザなどでは小さいサイズ、また全体的に小さくなったブラウザでは縦横にスクロールバーを表示させるので画像が小さくて見えなくなるということを防ぎます。

ブラウザウィンドウは使用する人によって広げ方が違うので、中央基準で上下左右はトリミングしてもイメージが崩れないグラフィックを用意するとよいでしょう。サンプルファイルのブラウザウィンドウを変更して表示範囲を試してみてください。


(▲クリックして拡大)

(▲クリックして拡大)

ブラウザ枠を1280×1024pxにして表示場合に表示例です(左図)。画像は中央からリサイズに四隅が一部表示されなくなるが全体のイメージは保つことができます。また、一定のサイズ以下にブラウザが縮小されると画像の縮小は停止し、スクロールバーを表示させるようにしました(右図)。

こうすることで極端に画像が小さくなってしまったり、縦横比のおかしな際にイメージを崩さないように配慮しましょう。



ウインドウ全体に中央に画像を表示させるコード


Javascriptでブラウザのウインドウと表示させる画像のサイズを取得し、その値を元にして拡大率と画像を注意に配置させる為にx座標とy座標を求めます。

これらの値を画像に適用させることによって縦と横の拡大率の大きい方にあわせて画像がリサイズされます。画像を囲むdiv要素の#backgroundには、ブラウザの表示領域と同じ縦幅と横幅が設定され、画像はその要素内の中央位置に配置され、領域をはみ出た場合はその分だけ非表示にする設定のため、リサイズの結果、画像のサイズの方が領域のサイズよりも大きい場合は、はみ出た分だけ画像の上下左右がトリミングされた状態で表示されます。

領域および画像のリサイズを停止させる最小サイズはoptionsの値で設定することができ、リサイズが行われないことで、ブラウザ表示領域よりも画像がはみ出た場合は、その分だけブラウザのスクロールが可能となります。

ウインドウサイズと同じ高さと横幅を設定しているため、拡大率の小さいほうは、上下左右がトリミングされた形で表示されます。また画像縮小をやめてスクロールバーを表示させるブラウザサイズはoptionsで設定できます。


■■■■ JSコード
//script.js
(function(){
  var options = {
    minWidth: 800,
    minHeight: 600,
  };

  // 要素のキャッシュ
  var
    $window = $(window),
    $contents = $('#contentContainer'),
    $background = $('#background'),
    $img = $background.find('img');

  // 背景画像が画面中央に配置されるように調整
  function adjustImage(_obj) {
    var
    ww = $window.width(),
    wh = $window.height(),
    iw = _obj.width(),
    ih = _obj.height(),
    scale = Math.max( ww / iw, wh / ih ),
    sw = Math.floor( iw * scale ),
    sh = Math.floor( ih * scale ),
    moveX = Math.floor( (ww - sw) / 2 ),
    moveY = Math.floor( (wh - sh) / 2 );
    
    _obj.css({
      width: sw,
      height: sh,
      left: moveX,
      top: moveY
      });
  }

  // ブラウザウィンドウサイズに合わせて画像をリサイズ
  function resize() {
    var
    ww = $window.width(),
    wh = $window.height(),
    _opw = options.minWidth,
    _oph = options.minHeight,
    _res = {
     w: _opw > ww ? _opw : ww,
     h: _oph > wh ? _oph : wh
    };

    $background.css({
     width: _res.w,
     height: _res.h
    });

    $contents.css({
     width: _res.w,
     height: _res.h
    });
  
    $background.find('img').each(function(){
      adjustImage($(this));
    });
  }

  $window.on('resize', resize);
  $window.on('load', function(){
   setTimeout( function(){
    $contents.css('background','none').fadeIn();
   }, 400);
   resize();
  });

}());

背景画像は一番下に配置させるためにCSSにて#backgroundを一番下のレイヤーに配置し、positionで位置をブザウザの左上基準にさせる。


■■■■ CSSでコード
//style.css

#background{
  z-index: -9999;
  overflow: hidden;
  position: absolute;
  top: 0;
  left: 0;
}
#background img{
  position: absolute;
  top: 0;
  left: 0;
}


背景画像をランダムで表示させ、一定時間ごとに画像を切り替える


1枚の画像を全面に表示させているが、ページにアクセスするたびに複数の画像をランダムに表示させ、一定時間ごとに画像を切り替えてみます。

1枚の画像を配置するサンプル(index.html)では、img要素を直接HTMLに記述していたが、ランダムで配置するサンプル(index_random.html)では、Javascript上で複数画像をプリロードしてからimg要素を生成し、ランダムに選ばれた画像を最初に表示させ、表示後は一定時間ごとに画像がフェードインしながら切り替わるようにしました。

画像はJavascript(script_random.js)の冒頭に記述されている変数option内に、画像ファイル名を記述することで任意に画像を差し替えることが可能だす。


■■■■ JSコード
//script_random.js
(function(){
  var options = {
    minWidth: 800,
    minHeight: 600,
    images: {
     dir: 'img/',
     path: [
     '01.jpg',
     '02.jpg',
     '03.jpg'
     ],
     current: 0,
     duration: 8000
    }
  };
  
  // 変数の初期化と要素のキャッシュ
  var
    $window = $(window),
    $contents = $('#contentContainer'),
    $background = $('<div id="background">').prependTo($contents),
    imgs = [];
  
  // 初期設定
  function init() {
    // 画像のプリロード
    var _imgspath = options.images.path,
    _imgsdir = options.images.dir,
    _rnd = Math.floor(Math.random()*_imgspath.length);
    
    for(var i = 0; len = _imgspath.length, i < len; i++){
     imgs.push(jQuery("<img>").attr("src", _imgsdir + _imgspath[i]));
    }
    imgs.current = _rnd;
     
    setTimeout( function(){
      changeBgImage(_rnd);
      $contents.css('background','none').fadeIn();
      }, 1200);

    resize();
  };
  
  // 背景画像の切り替え処理
  function changeBgImage(_cur) {
    var _images = options.images,  _$img;
       
    _cur = _cur > _images.path.length-1 ? 0 : _cur;
    _$img = imgs[_cur].appendTo($background).hide();
    _images.current = ++_cur;
    
    setTimeout( function(){ adjustImage(_$img) }, 100);
    setTimeout( function(){ changeBgImage(_cur) }, options.images.duration || 2000);
  }
  
  // 背景画像が画面中央に配置されるように調整
  function adjustImage(_obj) {
   var 
   ww = $window.width(),
   wh = $window.height(),
   iw = _obj.width(),
   ih = _obj.height(),
   scale = Math.max( ww / iw, wh / ih ),
   sw = Math.floor( iw * scale ),
   sh = Math.floor( ih * scale ),
   moveX = Math.floor( (ww - sw) / 2 ),
   moveY = Math.floor( (wh - sh) / 2 );

   _obj.css({
      width: sw,
      height: sh,
      left : moveX,
      top : moveY
   });
   _obj.fadeIn(1000);
  }

  // ブラウザウィンドウサイズに合わせて画像をリサイズ
  function resize() {
    var
    ww = $window.width(),
    wh = $window.height(),
    _opw = options.minWidth,
    _oph = options.minHeight,
    _res = {
      w: _opw > ww ? _opw : ww,
      h: _oph > wh ? _oph : wh
    };
    $background.css({
      width: _res.w,
      height: _res.h
    });
    $contents.css({
     width: _res.w,
     height: _res.h
    });
  
    $background.find('img').each(function(){
      adjustImage($(this));
    });
  }

  $window.on('resize', resize);
  $window.on('load', function(){   
   init();
  });

}());


今回は以上になります。

次回はベーシックですが、ページトップへ戻るのスムーズスクロールとページ戻るボタンの出現方法をCSS3のアニメーションやjQueryを使用するなど複数パターンを作ってみたいと思います。


『現場でかならず使われている jQueryデザインのメソッド』

今回紹介したサンプルは『現場でかならず使われている jQueryデザインのメソッド』にてサンプルダウンロードとコードの解説を行っております。
jQuery_cover

作成したサンプルや本の紹介はこちらをご覧ください。

2014/9/25





●本連載で使用している書籍「現場でかならず使われている jQueryデザインのメソッド」

jQuery_cover jQueryの特長は、通常のJavaScriptよりもシンプルなコードでWebサイトの動的なふるまいを記述できる点です。CSSと同じセレクタが利用できるので、HTML+CSSをひと通り理解していれば、文法や記述ルールはすぐに習得できます。書は、このようなjQueryの実践感覚を身につくように、アコーディオンやタブパネル、ツールチップといった頻出の基礎技術から、背景全面動画、パララックススクロールなどの現在流行している最新の手法まで、多彩なjQueryのテクニックを解説。現場の制作メソッドがぎっしり詰まった必携の一冊です!

ハヤシユタカ氏 Profile
【ハヤシユタカ】2001年、有限会社ムーニーワークスを設立。WEB制作の他、書籍執筆、セミナー講演、企業研修などを行う。また、クリエイター育成機関デジタルハリウッドでは1999年より教鞭をとる。2004年からは、デジタルハリウッド大学大学院、明治大学大学院非常勤講師を歴任。2012年からはデジハリオンラインスクールにてWEB関連講座のeラーニング教材の開発に携わり、会社・自宅のPCからいつでも「HTML5」「WordPress」を学べる講座を担当。2013年御苗場Vol12.横浜にて「The Zoological Garden ~言葉のない対話~」エプソン賞受賞。

こちらの連載もあわせてご覧ください
●WordPressでブログでなくビジネスサイトをつくろう:http://www.mdn.co.jp/di/articles/2782/
●ゼロからはじめるHTML5でのサイト制作:http://www.mdn.co.jp/di/articles/2605/
●HTML5でサイトをつくろう:http://www.html5-memo.com/
●Webデザインクリップ:http://webdesignmatome.com/

【著書・共著】
●現場でかならず使われている jQueryデザインのメソッド (2014/4/25)
●HTML5デザイン 仕事のネタ帳 CSS3+JavaScript+CSSフレームワークと活用するプロのテクニック (2014/3/24)
●現場で役立つCSS3デザインパーツライブラリ (2013/5/17)
●WordPress 3.x 現場のワークフローで覚えるビジ?ネスサイト制作 (2012/9/20)
●WebデザイナーのためのHTML5入門 (2012/08)
●ポケット詳解 jQuery Mobile辞典 (2012/05)
●すべての人に知っておいてほしい HTML5 & CSS3 の基本原則(2012/10/20)
●すべての人に知っておいてほしい スタイルシートデザインの基本原則(2012/5/25)
twitter facebook このエントリーをはてなブックマークに追加 RSS
【サイトリニューアル!】新サイトはこちらMdNについて

この連載のすべての記事

アクセスランキング

8.30-9.5

MdN BOOKS|デザインの本

Pick upコンテンツ

現在