【jQuery】画像の拡大鏡が欲しい。

こんにちは。
需要はわからない。
只野です。

最近のwebページで画像がないwebページはほぼないと言ってよいでしょう。
私はweb系のシステム開発をする仕事をしているのですが、お客様からのご要望で

指定のタイミングで画像を拡大表示できませんか?

こんな要望もよく聞くところです。ただ画像を拡大していと言ってもどのように?はバラバラだったりします。「別画面で大きく見たい。」、「ページ遷移はせず画像クリックで拡大させたい。」、「一部だけ拡大できるようにしたい。」と様々です。

毎回作るのも手間なので、最適なプラグインでも導入すれば手っ取り早いですが、ライセンスや要望が細かいお客様だとそうもいかない。結局作る羽目になることも多いです。

画像の拡大鏡が欲しい。

はい。今回は「複数ある画像毎にマウスカーソルを当てた時に一部を拡大したい。」とのご要望だったので、インターネットさんの力を借り、お客様に合う形で以下のような画像を拡大できるものを作成いたしました。

画像内にマウスカーソルを合わせると指定した場所が拡大されます。画像の範囲からマウスカーソルが外れると拡大鏡も閉じます。

ソースは以下のようになっています。

【CSS】

1.imagearea{
2    width:200px;
3    display:inline-block;
4    margin: 1em 1em;
5}
6#loupe{
7    border:2px solid white;
8    background-repeat: no-repeat;
9    background-color: white;
10    width:200px; height:200px; /* 拡大鏡大きさ */
11    position:absolute;
12    display:none;
13    -moz-box-shadow:0 0 5px #777, 0 0 10px #aaa inset;
14    -webkit-box-shadow:0 0 5px #777;
15    box-shadow:0 0 5px #777, 0 0 10px #aaa inset;
16    -moz-border-radius:100px; /* 拡大鏡大きさ ÷ 2 */
17    -webkit-border-radius:100px; /* 拡大鏡大きさ ÷ 2 */
18    border-radius:100px; /* 拡大鏡大きさ ÷ 2 */
19}

CSSはインターネットさんの力を借り自分に必要な場所をかき集めました←
基本は拡大鏡の大きさを調整すれば色々使える(はず)です。

【jQuery】

1$(function(){
2    var imageWidth = 200; //画像サイズ
3    var magnification = 3; //拡大率
4 
5    $('[id^="image"]').mousemove(function(e){
6        var offset = $(this).offset();
7        var left = (e.pageX - offset.left);
8        var top = (e.pageY - offset.top);
9        var width = $(this).width();
10        var height = $(this).height();
11        var loupe = $(this).children('#loupe');
12 
13        //拡大鏡起動反転
14        if(loupe.is(':not(:animated):hidden')){
15            $(this).trigger('mouseenter');
16        }
17 
18        //範囲外判定
19        if(e.pageX < offset.left || e.pageY < offset.top || e.pageX > (offset.left + width) || e.pageY > (offset.top + height))
20        {
21            if(!loupe.is(':animated')){
22                $(this).trigger('mouseleave');
23            }
24            return false;
25        }
26 
27        //拡大鏡表示位置
28        loupe.css('left', e.pageX - loupe.width() / 2);
29        loupe.css('top', e.pageY - loupe.height() / 2);
30 
31        //画像表示位置
32        var x = (magnification * left * -1) + (loupe.width() / 2);
33        var y = (magnification * top * -1) + (loupe.height() / 2);
34        loupe.css('background-position', x + 'px ' + y + 'px');
35    }).mouseleave(function(){
36        $(this).children('#loupe').stop(true, true).fadeOut('fast');
37    }).mouseenter(function(){
38        $(this).children('#loupe').css('background-size', (imageWidth * magnification) + 'px auto');
39        $(this).children('#loupe').stop(true, true).fadeIn('fast');
40    });
41});

仕組みとしてはマウスムーブイベントを利用し、マウスカーソルが画像内にいるときに、拡大鏡の起動、拡大鏡で表示する画像位置を設定するシンプルな仕組みです。
拡大率に任意の値を設定することで大きさを変えられるようにしています。注意点は横幅を固定で指定する必要があります。

【使い方】

1<div id="image1" class="imagearea">
2<img src="表示する画像URL" alt="" width="200" />
3<div id=loupe style="background-image:url(上記imgと同じ表示する画像URL)" ></div>
4</div>

拡大鏡を表示した画像をdivで囲みます。そのdiv内に拡大鏡となるdivをさらに入れ子にしています。画像を増やす場合は上記セットで増やしていけば拡大鏡が使えるようになります。

はい。
動きは面白いけれど、需要そんななさそうプログラムです。拡大表示するならやはり普通にモーダルウィンドウとかで大きくしたほうが使いやすいのではと思う今日この頃です。

本日はこの辺で

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です