プラグインほどの多機能は要らず、単純に画像クリックで拡大画像を表示するという Lightbox 風の機能が欲しかったので作ってみました。
以前も作ったことはあったのですが、その際にブログに残すなどをしていなかったため、どこかに紛失してしまいました。
ということで、今回新たに作ったものを簡単な説明とともに残しておきます。
欲しい機能
・サムネイル画像クリックで、大きな画像を手前に表示
・画像表示時に、周囲を透過処理で暗くする
・画像は画面の中央に表示
・画像を閉じる際は、画面内のどこをクリックしても閉じる
(☓ボタンで閉じるなどは面倒)
・フェードイン、フェードアウトのような余分な処理は要らない
ちなみにフェードイン、フェードアウトなどの処理を入れたい場合は、表示を切り替えている部分を改造すれば実装可能です。
「画像は画面の中央に表示」の機能を実装するには、大きな画像の縦横のサイズを予め把握している必要があります。
縦横のサイズが不明の場合は、決め打ちで大体中央に表示させることになります。
画像が「サムネイル画像」と「大きな画像」の2枚あるパターンと、「大きな画像」1枚のみの2パターンについて書きます。
サムネイル画像と大きな画像の2枚あるパターン
■HTML
<a class="img_popup" width="大きな画像の横幅" height="大きな画像の高さ" href="大きな画像のURL"><img src="サムネイル画像のURL"></a>
aタグに独自の属性 width と height を追加していますが、これを JavaScript から参照して画像を中央に表示するために使用します。
大きな画像の縦横のサイズを取得できない場合は、aタグに記載している width と height を削除します。
■CSS
.overlay {
position: absolute;
display: none;
top: 0;
width: 100%;
z-index: 1;
background-color: rgba(0,0,0,0.6);
}
.overlay img {
display: inline-block;
position: absolute;
border: 5px solid #fff;
}
background-color で拡大画像表示時の背景色を指定しています。
rgba は RGBカラーに、透明度(alpha)を追加したもので、0.0~1.0の間で指定できます。
0 が透明、1 が不透明となります。
border: 5px solid #fff; で、画像の周囲を白い線で囲っています。
この辺はお好みで変えてください。
■JavaScript
$(function() {
$('body').prepend('<div class="overlay"></div>');
$('a.img_popup').click(function() {
var left = ($(window).width() / 2) + $(window).scrollLeft() - ($(this).attr('width') / 2);
var top = ($(window).height() / 2) + $(window).scrollTop() - ($(this).attr('height') / 2);
$('div.overlay').css('height', $(document).height());
$('div.overlay').empty().append('<img src="' + $(this).attr('href') + '" />').css({display: 'block'});
$('div.overlay img').css({left: left, top: top, opacity: '1'});
return false;
});
$('div.overlay').click(function() {
$('div.overlay').hide();
});
});
各項目の簡単な説明
$('body').prepend('<div class="overlay"></div>');
大きな画像を表示する際の背景となる divタグを body に追加しています。
$('a.img_popup').click(function() {
クラス名が img_popup の aタグがクリックされたら 5~11行目の処理を行います。
var left = ($(window).width() / 2) + $(window).scrollLeft() - ($(this).attr('width') / 2);
var top = ($(window).height() / 2) + $(window).scrollTop() - ($(this).attr('height') / 2);
(ブラウザのウィンドウサイズ ÷ 2) + body のスクロール位置 ー (aタグに指定した大きな画像の縦横 ÷ 2)
これにより、ページがスクロールしていても、常にブラウザの中央に画像が表示されます。
※大きな画像の縦横の値が分からない場合は、マイナスする値に適当な数値を入れます。
ただし、この場合は画像のサイズによって表示位置を変えることはできないので、画面のバランスが悪くなります。
$('div.overlay').css('height', $(document).height());
divタグの高さをドキュメントの高さと同じにしています。
$('div.overlay').empty().append('<img src="' + $(this).attr('href') + '" />').css({display: 'block'});
divタグの中身(html)を一度空にしてから、imgタグを追加しています。
また、その際に src に aタグの href の内容を指定しています。
$('div.overlay img').css({left: left, top: top, opacity: '1'});
imgタグの表示位置を指定し、非表示から表示に切り替えています。
return false;
aタグの href のリンクが起動しないように false を返しています。
$('div.overlay').click(function() {
$('div.overlay').hide();
});
divタグがクリックされたら divタグを非表示にしています。
これで、簡単な Lightbox 風の画像拡大表示機能が実装できます。
大きな画像1枚のみで実装するパターン
■HTML
<a class="img_popup" width="大きな画像の横幅" height="大きな画像の高さ"><img style="width: 100px" src="大きな画像のURL"></a>
imgタグに width を指定して縮小表示し、サムネイル画像にします。
■CSS
css は同じものを使用します。
■JavaScript
JavaScript も基本は同じですが、9行目だけ書き換えます。
$('.overlay').empty().append('<img src="' + $($(this).children('img')).attr('src') + '" />').css({display: 'block'});
src に指定する値を imgタグの src に変えています。
以上です。
単純な画像拡大機能であれば、わざわざプラグインを入れなくても簡単に実装できますね。
そう言いつつ、当ブログの画像拡大機能は、プラグインを使っていたりしますが・・・。
ちなみに、この前アップした「【PHP】画像データ文字列から画像の横幅と高さを取得する」という記事は、今回の中央表示をしたいための処理だったりします。