サムネイルをクリックしたら拡大画像が表示されるというJavascriptライブラリには有名な所で'Lightbox'や'highslide'がある。
それぞれのサイトではデモも見られるし、ダウンロードして自分で使う事も出来る。
http://highslide.com/
http://www.huddletogether.com/projects/lightbox2/#download
いろんなサイトでも紹介されている。

もっと簡単なのをちょっと自分でも書いてみた。(例によってPrototype.jsを使用)

var DropPhoto = Class.create({
    initialize: function(elem) {
        this.elem = elem;
        var that = this;
        this.timeId
        this.elem.observe('click', function(event) {
            if ($('shadowWrapper')) that.fadeOut($('shadowWrapper'));
            var largeSrc = event.element().src.gsub('small', 'large');
            var largeImage = new Image();
            largeImage.src = largeSrc;
            Element.addClassName(largeImage, 'large');
            largeImage.setStyle({display: 'none'});
            $$('body')[0].insert(largeImage);
            var f = function() {
                var container = new ShadowApply(largeImage);
                container = container.shadowWrapper;
                largeImage.setStyle({display: 'block'});
                if (that.timeId) clearInterval(that.timeId);
                var centerX = document.viewport.getWidth() / 2 - parseInt(container.getWidth()) / 2;
                var centerY = document.viewport.getHeight() / 2 + document.viewport.getScrollOffsets()[1] - container.getHeight() / 2;
                var vy = 10;
                var gravitation = 3;
                var bounce = -0.6;
                var currentTop = -parseInt(container.getHeight()) + document.viewport.getScrollOffsets()[1];
                var prevTop;
                var counter;
                container.setStyle({
                    top: currentTop + 'px',
                    left: centerX + 'px',
                    cursor: 'move'
                });
                that.timeId = setInterval(function() {
                    prevTop = currentTop;
                    vy += gravitation;
                    currentTop += vy;
                    if (currentTop > centerY) {
                        currentTop = centerY;
                        vy *= bounce;
                    }
                    if (prevTop == currentTop) counter++;
                    else counter = 0;
                    if (counter > 10) clearInterval(that.timeId);
                    container.setStyle({top: currentTop + 'px'});
                }, 15);
                that.dragDrop(container);
            };
            if (largeImage.complete) f();
            else largeImage.observe('load', function(event) {f()});
        });
    },
    fadeOut: function(elem) {
        var opa = 100;
        var timeId = setInterval(function() {
            elem.setOpacity(opa / 100);
            opa -= 10;
            if (opa < 0) {
                elem.remove();
                clearInterval(timeId);
            } 
        }, 15);
    },
    dragDrop: function(elem) {
        var that = this;
        elem.observe('mousedown', function(event) {
            if (that.timeId) clearInterval(that.timeId);
            event.stop();
            var dx = parseInt(elem.getStyle('left')) - event.pointerX();
            var dy = parseInt(elem.getStyle('top')) - event.pointerY();
            elem.setOpacity(0.7);
            document.observe('mousemove', function(event) {
                event.stop();
                elem.setStyle({
                    left: (event.pointerX() + dx) + 'px',
                    top: (event.pointerY() + dy) + 'px'
                });
            });
            document.observe('mouseup', function(event) {
                document.stopObserving('mousemove');
                elem.setOpacity(1);
            })
        });
    }
});

下のサムネイルをクリックして確認が出来る(ただし、現時点では『閉じる』機能が無い)

CIMG1312 CIMG2393 IMG_0148 IMG_0116 DSCF0010 DSCF0011 IMG_0153 IMG_0152 IMG_0051 IMG_0045 IMG_0086 IMG_0440

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/76

コメントする