普段はjQueryに頼りきりでネイティブで書かなきゃいけないような仕事はないんですが、とはいえなんとなくネイティブでも書けないとなぁ。という淡い危機感があったので「jQueryでbackground: coverみたいなことをする方法」をネイティブ化してみました。
結果的にwindowサイズの取得とresizeイベントでIE8対応が必要だったくらいで、あとはすんなりですね。
※IE8〜11、Safari(Mac)、Firefox、Chromeで動作確認しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>【ネイティブ化】JavaScriptでbackground: coverみたいなことをする方法</title> <style type="text/css"> html, body { height: 100%; } body { margin: 0; } #coverParent { width: 100%; height: 100%; overflow: hidden; position: absolute; top: 0; left: 0; z-index: -1; } #cover { position: absolute; } </style> </head> <body> <div id="coverParent"><img src="image01.jpg" width="1920" height="1280" alt="" id="cover"></div> <script> (function(){ // 使用する変数を宣言 var win_w, win_h, win_ratio, cover_w, cover_h, cover_ratio, style; // 参照する要素をキャッシュ var cover = document.getElementById('cover'); // 画像の縦の比率を求める cover_w = cover.getAttribute('width'); cover_h = cover.getAttribute('height'); cover_ratio = cover_w / cover_h; // ウィンドウのリサイズイベントに合わせて計算する var fit = function(){ // ウィンドウサイズを取得 win_w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; win_h = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; // ウィンドウの縦の比率を求める win_ratio = win_w / win_h; // 画像の比率がウィンドウより大きければ、画像の高さを100%にする if(cover_ratio > win_ratio){ style = [ 'width: auto', 'height: 100%', 'margin-top: 0', 'margin-left: ' + (-(win_h * cover_ratio) / 2) + 'px', 'top: 0', 'left: 50%' ]; // そうじゃない場合は、画像の幅を100%にする }else{ style = [ 'width: 100%', 'height: auto', 'margin-left: 0', 'margin-top: ' + (-(win_w / cover_ratio) / 2) + 'px', 'top: 50%', 'left: 0' ]; } cover.style.cssText = style.join(';'); } if(window.addEventListener){ window.addEventListener('resize', fit, false); // ~ IE8 } else if(window.attachEvent){ window.attachEvent('onresize', fit); } fit(); }()); </script> </body> </html> |
IE8がwindowサイズをinnerWidthで取得できないため win_w = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; という形でpolyfillしてやります。
addEventListenerもIE8では対応していないので、attachEventを使います。ちなみに、window.onresizeでは競合する可能性があるのでイベントリスナーを使っています。
おわり。