highslideの様なscriptをjQueryを使って書いてみた。
カーソルキーやスペースキーもきくしドラッグしたりも出来る
ソースは以下のような感じ
(function($) { $.fn.escalates = function(step) { var srcelems = this; var targetelems = []; var move = function(to, fp, tp, callback) { var diffWidth = tp.width - fp.width; var diffHeight = tp.height - fp.height; var diffLeft = tp.left - fp.left; var diffTop = tp.top - fp.top; var stepWidth = diffWidth / step; var stepHeight = diffHeight / step; var stepLeft = diffLeft / step; var stepTop = diffTop / step; to.css({ top: fp.top, left: fp.left, width: fp.width, height: fp.height, visibility: 'visible' }); var i = 0; setTimeout(function() { i++; fp.left += stepLeft; fp.top += stepTop; fp.width += stepWidth; fp.height += stepHeight; to.css({ top: fp.top, left: fp.left, width: fp.width, height: fp.height }); if (i < step) setTimeout(arguments.callee, 15); else { to.css({ top: tp.top, left: tp.left, width: tp.width, height: tp.height }); callback(); } }, 15); }; var drag = function(handle, dragelem) { handle.mousedown(function(event) { handle.stoped = true; event.preventDefault(); event.stopPropagation(); handle.last = $(document.body).children()[$(document.body).children().length - 1] == dragelem[0]; if (!handle.last) dragelem.parent().append(dragelem); var dx = parseInt(dragelem.css('left')) - event.pageX; var dy = parseInt(dragelem.css('top')) - event.pageY; $(document).mousemove(function(event) { event.preventDefault(); event.stopPropagation(); handle.stoped = false; dragelem.css({ left: (event.pageX + dx), top: (event.pageY + dy) }); }); $(document).mouseup(function(event) { $(document).unbind('mousemove'); }); }); }; return this.each(function(idx, srcelem){ targetelems.push($('<img class="larger">')); var f = function(event) { var timg, simg; if (event.type == 'keydown') { if ($(document.body).children()[$(document.body).children().length - 1] != targetelems[idx].parent()[0]) return; var k = event.keyCode; if (k == 39 || k == 37 || k == 32) { event.preventDefault(); event.stopPropagation(); fp = { width: targetelems[idx].width(), height: targetelems[idx].height(), top: targetelems[idx].offset().top, left: targetelems[idx].offset().left }; tp = { width: srcelems.eq(idx).width(), height: srcelems.eq(idx).height(), top: srcelems.eq(idx).offset().top, left: srcelems.eq(idx).offset().left }; targetelems[idx].parent().remove(); targetelems[idx].appendTo($(document.body)); move(targetelems[idx], fp, tp, function(){targetelems[idx].remove().removeAttr('style');srcelems.eq(idx).css({visibility: 'visible'});}); if (event.keyCode == 39) { timg = targetelems.length - 1 == idx? targetelems[0]: targetelems[idx + 1]; simg = srcelems.length - 1 == idx? srcelems[0]: srcelems[idx + 1]; } else if (event.keyCode == 37) { timg = 0 == idx? targetelems[targetelems.length - 1]: targetelems[idx - 1]; simg = 0 == idx? srcelems[srcelems.length - 1]: srcelems[idx - 1]; } else return; } else return; } else { timg = targetelems[idx]; simg = srcelems[idx]; } if (timg.parent()[0]) timg.parent().remove(); timg.attr('src', simg.src.replace('small', 'large')).css({position: 'absolute', visibility: 'hidden', top: 0, left: 0}).appendTo($(document.body)); var f = function() { $(simg).css({visibility: 'hidden'}); var fp = { width: $(simg).width(), height: $(simg).height(), top: $(simg).offset().top, left: $(simg).offset().left }; var tp = { width: timg.width(), height: timg.height(), top: ($(window).height() - timg.height() - (parseInt(timg.css('padding-top')) * 2)) / 2 + $(window).scrollTop(), left: ($(window).width() - timg.width() - (parseInt(timg.css('padding-left')) * 2)) / 2 + $(window).scrollLeft() }; move(timg, fp, tp, function() { timg.shadow(timg.outerWidth(), timg.outerHeight(), tp.top, tp.left, -8, '/happy_programming/images/'); drag(timg, timg.parent()); timg.click(function(event) { event.preventDefault(); event.stopPropagation(); if (timg.last && timg.stoped) { var fp = { width: timg.width(), height: timg.height(), top: timg.offset().top, left: timg.offset().left }; var tp = { width: $(simg).width(), height: $(simg).height(), top: $(simg).offset().top, left: $(simg).offset().left }; timg.parent().remove(); timg.appendTo($(document.body)); move(timg, fp, tp, function(){timg.remove().removeAttr('style');$(simg).css({visibility: 'visible'});}); } }); }); }; if (timg[0].complete) f(); else timg.load(function(event) {f();}); }; $(srcelem).click(f); $(document).keydown(f); }); }; })(jQuery);
jQueryおもしろいなあ
カテゴリ:
トラックバック(0)
トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/80
コメントする