画像ではなく、テキスト要素をライトボックス風に表示する方法のメモ。
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; //ここに記述
});