写真をドラッグすると残像が後からついてくるようなスクリプトを書いてみた。
CIMG1312 CIMG2393 IMG_0148 IMG_0116 DSCF0010 DSCF0011 IMG_0153 IMG_0152 IMG_0051 IMG_0045 IMG_0086 IMG_0440

ソースは以下

(function($) {
    $.fn.afterimage = function(cnt, speed) {
        var step = 1 / cnt;
        return this.each(function(idx, elem) {
            var clones = [];
            for (var i = 0; i < cnt; i++) clones.push($(elem).clone().css('opacity', step * (i)));
            var moved = false;
            var stoped = true;
            var last = clones.length - 1;
            $(elem).mousedown(function(event) {
                event.preventDefault();
                event.stopPropagation();
                $(clones).each(function(idx, elm) {elm.appendTo($(elem).parent())});
                $(elem).parent().append($(elem));
                var dx = $(elem).position().left - event.pageX;
                var dy = $(elem).position().top - event.pageY;
                var timeId;
                $(document).mousemove(function(event) {
                    stoped = false;
                    moved = true;
                    if (timeId) clearInterval(timeId);
                    event.preventDefault();
                    event.stopPropagation();
                    $(elem).css({
                        left: (event.pageX + dx),
                        top: (event.pageY + dy)
                    });

                    timeId = setInterval(function() {
                        $(clones).each(function(idx, elm) {
                            var pointX;
                            var pointY;
                            if (idx == last) {
                                pointX = (parseFloat($(elem).css('left')) - parseFloat($(elm).css('left')));
                                pointY = (parseFloat($(elem).css('top')) - parseFloat($(elm).css('top')));
                            }
                            else {
                                pointX = (parseFloat(clones[idx + 1].css('left')) - parseFloat($(elm).css('left')));
                                pointY = (parseFloat(clones[idx + 1].css('top')) - parseFloat($(elm).css('top')));
                            }
                            var l = parseFloat($(elm).css('left')) + (pointX / speed);
                            var t = parseFloat($(elm).css('top')) + (pointY / speed);
                            var left = (pointX > 0) ? Math.ceil(l): Math.floor(l);
                            var top = (pointY > 0) ? Math.ceil(t): Math.floor(t);
                            $(elm).css({left: left, top: top});
                        });
                        if (Math.abs(parseFloat($(elem).css('left')) - parseFloat(clones[0].css('left'))) < 0.5 &&
                            Math.abs(parseFloat($(elem).css('top')) - parseFloat(clones[0].css('top'))) < 0.5) {
                            clearInterval(timeId);
                            moved = false;
                            if (stoped) $(clones).each(function(idx, elm) {$(elm).remove()});
                        }
                    },15);
                });
                $(document).mouseup(function(event) {
                    $(document).unbind('mousemove');
                    if (!moved) $(clones).each(function(idx, elm) {$(elm).remove()});
                    stoped = true;
                });
            });
        });
    };
})(jQuery);
$(function(event) {
    $('img.thumbnail').afterimage(10, 3);
});

カテゴリ:

トラックバック(0)

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

コメントする