画像をクリックすると
画面中央に拡大表示する
シンプルなモーダルウィンドウのサンプルです。
ソースコードと解説
<div class="bl_galleryImgBlock"> <div class="bl_galleryImgBlock_wrapper"> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> <div class="bl_galleryImgBlock_item js_modalButton" style="background-image:url([サムネイルの画像URL]);" data-src="[拡大表示させたい画像URL]"></div> </div> </div> <div class="bl_modalBlock"> <div class="bl_modalBlock_wrapper"> <div class="bl_modalBlock_closeButton"></div> </div> </div>
[サムネイルの画像URL]と
[拡大表示させたい画像URL]に
それぞれ任意のURLを代入してください。
.bl_modalBlockは
拡大画像を表示する領域になります。
/*ギャラリー部分レイアウト*/ .bl_galleryImgBlock_wrapper { display: -webkit-box; display: -ms-flexbox; display: flex; -ms-flex-wrap: wrap; flex-wrap: wrap; margin-bottom: 45px; } @media screen and (max-width: 840px) { .bl_galleryImgBlock_wrapper { margin-bottom: 30px; } } .bl_galleryImgBlock_item { width: calc((100% - 10px) / 3); margin-right: 5px; margin-bottom: 5px; background-size: cover; background-repeat: no-repeat; background-position: center center; cursor: pointer; } .bl_galleryImgBlock_item:nth-child(3n) { margin-right: 0; } .bl_galleryImgBlock_item:before { content: ""; display: block; padding-top: 100%; } /*モーダル*/ .bl_modalBlock { display: none; position: fixed; top: 0; left: 0; right: 0; bottom: 0; background-color: rgba(0, 0, 0, 0.8); -webkit-box-align: center; -ms-flex-align: center; align-items: center; -webkit-box-pack: center; -ms-flex-pack: center; justify-content: center; z-index: 100; } .js_openModal .bl_modalBlock { display: -webkit-box; display: -ms-flexbox; display: flex; } .bl_modalBlock_wrapper { position: relative; width: 80vh; height: 80vh; background-size: cover; background-repeat: no-repeat; background-position: center center; } @media screen and (max-width: 840px) { .bl_modalBlock_wrapper { width: 90%; max-width: 480px; height: auto; } .bl_modalBlock_wrapper:before { content: ""; display: block; padding-top: 100%; } } .bl_modalBlock_closeButton { position: absolute; right: 0; top: -10px; width: 20px; height: 20px; -webkit-transform: translateY(-100%); -ms-transform: translateY(-100%); transform: translateY(-100%); cursor: pointer; } .bl_modalBlock_closeButton:after { content: ""; position: absolute; top: 0; left: 0; width: 149%; height: 2px; background-color: #ccc; -webkit-transform-origin: top left; -ms-transform-origin: top left; transform-origin: top left; -webkit-transform: rotate(45deg); -ms-transform: rotate(45deg); transform: rotate(45deg); } .bl_modalBlock_closeButton:before { content: ""; position: absolute; top: 0; right: 0; width: 149%; height: 2px; background-color: #ccc; -webkit-transform-origin: top right; -ms-transform-origin: top right; transform-origin: top right; -webkit-transform: rotate(-45deg); -ms-transform: rotate(-45deg); transform: rotate(-45deg); } /*スクロール禁止*/ .js_fixed { position: fixed; width: 100%; height: 100%; }
モーダルのサイズ感や
背景色を変更したい場合は
CSSを適宜変更してください。
また今回は
画像表示時のスクロール禁止処理まで
包括した内容となります。
//モーダル表示時のスクロール無効化処理 var scrollBlockerFlag; var scrollpos; function scrollBlocker(flag){ if(flag){ scrollpos = $(window).scrollTop(); $('body').addClass('js_fixed').css({'top': -scrollpos}); scrollBlockerFlag = true; } else { $('body').removeClass('js_fixed').css({'top': 0}); window.scrollTo( 0 , scrollpos ); scrollBlockerFlag = false; } } //Galleryのモーダル処理 $(function(){ var focusFlag = false; $(document).on('click','.js_modalButton',function(){ var imgurl = $(this).data('src'); $('.bl_modalBlock_wrapper').css('background-image','url(' + imgurl + ')'); $('body').addClass('js_openModal'); scrollBlocker(true); setTimeout(function(){ focusFlag = true; },200); }); $(document).on('click','.js_modalButton_close',function(){ $('body').removeClass('js_openModal'); scrollBlocker(false); focusFlag = false; }); $(document).on('click','.bl_modalBlock_closeButton',function(){ $('body').removeClass('js_openModal'); scrollBlocker(false); focusFlag = false; }); //モーダル以外の部分がクリックされた場合にモーダルを閉じる処理 $(document).on('click touchend', function(event) { if (!$(event.target).closest('.bl_modalBlock_wrapper').length && focusFlag) { focusFlag = false; scrollBlocker(false); $('body').removeClass('js_openModal'); } }); });
javascriptで
やっていることは主に3つ。
1つめはbodyに
.js_openModalを付与/削除することで
モーダルの開閉処理を行っています。
2つめはクリックした
.js_modalButtonの
data属性を利用してURLを取得し、
モーダルの画像表示領域である
.bl_modalBlock_wrapperの
background-imageに指定しています。
最後に3つめは、
モーダル表示時に
スクロールを不可としています。
また、ちょっとした工夫として、
jQueryのclosestメソッドを利用して、
モーダル以外の部分がクリックされた際に
モーダルを閉じる処理を実装しています。
便利なプラグインもあるけれど…
画像のモーダルといえば、
LightboxやColorboxなどの
jQueryプラグインが有名ですが、
安易なプラグインの導入は
ページ読み込み速度や
メンテナンス性の低下につながります。
やはりスクラッチでできる分は、
スクラッチで行うのが一番ですね。
コメント