画像ではなく、テキスト要素をライトボックス風に表示する方法のメモ。
HTML 抜粋
・・・省略・・・ <div class="cd"> <h3>ジャズ Vol.1 ~Let’s Swing~</h3> <p>Released:2012 <a class="detail_btn" href="#">(詳細)</a></p> <div class="detail_info"> <h3>ジャズ Vol.1 ~Let’s Swing~</h3> <p>誰もが楽しめるジャズシリーズ第一弾!</p> <dl> <dt><曲目></dt> <dd> <ol> <li>A列車で行こう</li> <li>ペーパー・ムーン</li> <li>シング・シング・シング</li> </ol> </dd> </dl> </div><!-- end of .detail_info --> </div><!-- end of .cd --> ・・・省略・・・ <div id="graylayer"></div> <div id="overlayer"> <img src="images/close-trans.png" class="close" title="閉じる" /> <div class="detail_info"></div> <p><a class="close_btn" href="#">(X 閉じる)</a></p> </div>
CSS
#graylayer { display: none; position: fixed; left: 0; top: 0; height: 100%; width: 100%; background: #444; filter:alpha(opacity=75); opacity: 0.75; z-index: 200; } * html #graylayer { position: absolute; } #overlayer { display: none; width: 80%; background: #FFF; padding: 10px; position: fixed; top: 50%; left: 50%; z-index: 300; height: 90%; overflow: scroll; } * html #overlayer { position: absolute; } #overlayer img.close { position: absolute; top: 0; right: 0; cursor: pointer; }
JavaScript
jQuery(function($){ $('.cd a.detail_btn').click(function(){ var that = $(this); $('#graylayer').fadeIn(); $('#overlayer').fadeIn().find('div.detail_info').html(that.closest('div.cd').find('div.detail_info').html()); $('#overlayer').css({ marginTop: "-" + $('#overlayer').height()/2 + "px", marginLeft: "-" + $('#overlayer').width()/2 + "px" }); return false; }); $('#overlayer img.close, #overlayer a.close_btn, #graylayer').click(function(){ $('#graylayer').fadeOut(); $('#overlayer').fadeOut(); return false; }); });
<div id="graylayer"></div> <div id="overlayer"> <img src="images/close-trans.png" class="close" title="閉じる" /> <p><a class="close_btn" href="#">(X 閉じる)</a></p> </div>
jQuery(function($){ $('body').append('<div id="graylayer"></div><div id="overlayer"></div>'); $('#graylayer').click(function(){ $(this).fadeOut(); $('#overlayer').fadeOut(); }); $('.cd a.detail_btn').click(function(){ $('#graylayer').fadeIn(); $('#overlayer').fadeIn().html('<img src="images/close-trans.png" class="close" title="閉じる" />' + $(this).closest('div.cd').find('div.detail_info').html() + '<p><a class="close_btn" href="#">(X 閉じる)</a></p>').css({ marginTop: "-" + $('#overlayer').height()/2 + "px", marginLeft: "-" + $('#overlayer').width()/2 + "px" }); $('#overlayer img.close, #overlayer a.close_btn').click(function(){ $('#graylayer').fadeOut(); $('#overlayer').fadeOut(); }); return false; }); });
「閉じる」ボタンなどの要素をスクリプトで追加する場合、それらの要素はページが読み込まれた時点では認識されていないので、前述のようにクリックのイベント処理の内部に「閉じる」ボタンをクリックした時の処理を記述したが、「on」を使えば以下のように記述可能。
jQuery(function($){ $('body').append('<div id="graylayer"></div><div id="overlayer"></div>'); $('#graylayer').click(function(){ $(this).fadeOut(); $('#overlayer').fadeOut(); }); $('.cd a.detail_btn').click(function(){ $('#graylayer').fadeIn(); $('#overlayer').fadeIn().html('<img src="images/close-trans.png" class="close" title="閉じる" />' + $(this).closest('div.cd').find('div.detail_info').html() + '<p><a class="close_btn" href="#">(X 閉じる)</a></p>').css({ marginTop: "-" + $('#overlayer').height()/2 + "px", marginLeft: "-" + $('#overlayer').width()/2 + "px" }); return false; }); $(document).on('click', '#overlayer img.close, #overlayer a.close_btn', function() { $('#graylayer').fadeOut(); $('#overlayer').fadeOut(); return false; }); });
クリックするリンクの href 属性を「#」にしている場合で、モーダルウィンドウを表示する処理を関数にする場合、関数の側で「return false;」を記述してもモーダルウィンドウが表示される段階ではそれが機能しないので、呼び出す側に「return false;」を記述する。
例えば、前述の以下の部分を関数にまとめる場合
$('body').append('<div id="graylayer"></div><div id="overlayer"></div>'); $('.cd a.detail_btn').click(function(){ $('#graylayer').fadeIn(); $('#overlayer').fadeIn().html('<img src="images/close-trans.png" class="close" title="閉じる" />' + $(this).closest('div.cd').find('div.detail_info').html() + '<p><a class="close_btn" href="#">(X 閉じる)</a></p>').css({ marginTop: "-" + $('#overlayer').height()/2 + "px", marginLeft: "-" + $('#overlayer').width()/2 + "px" }); return false; });
show_modal_window(target) という関数にする際に、「return false;」は呼び出し側に記述する。
そうしない場合、モーダルウィンドウを開く(閉じる)たびに、ページの先頭(#)に移動してしまう。
$('body').append('<div id="graylayer"></div><div id="overlayer"></div>'); function show_modal_window(target) { $('#graylayer').fadeIn(); $('#overlayer').fadeIn().html('<img src="images/close-trans.png" class="close" title="閉じる" />' + target + '<p><a class="close_btn" href="#">(X 閉じる)</a></p>').css({ marginTop: "-" + $('#overlayer').height()/2 + "px", marginLeft: "-" + $('#overlayer').width()/2 + "px" }); //return false; ここに記述しても効果はない } $('.cd a.detail_btn').click(function(){ show_modal_window($(this).closest('div.cd').find('div.detail_info').html()); return false; //ここに記述 });