[JavaScript] Picbox 图片浏览插件 →→→→→进入此内容的聊天室

来自 , 2021-02-02, 写在 JavaScript, 查看 141 次.
URL http://www.code666.cn/view/9872ed9f
  1. /*!
  2.         Picbox v2.2
  3.         (c) 2010 Ben Kay <http://bunnyfire.co.uk>
  4.  
  5.         Based on code from Slimbox v1.7 - The ultimate lightweight Lightbox clone
  6.         (c) 2007-2009 Christophe Beyls <http://www.digitalia.be>
  7.        
  8.         Uses jQuery-mousewheel Version: 3.0.2
  9.         (c) 2009 Brandon Aaron <http://brandonaaron.net>
  10.        
  11.         MIT-style license.
  12. */
  13.  
  14. (function($) {
  15.        
  16.         var win = $(window), options, images, activeImage = -1, activeURL, prevImage, nextImage, ie6 = ((window.XMLHttpRequest == undefined) && (ActiveXObject != undefined)), browserIsCrap, middleX, middleY, imageX, imageY, currentSize, initialSize, imageDrag, timer, fitsOnScreen,
  17.        
  18.         // Preload images
  19.         preload = {}, preloadPrev = new Image(), preloadNext = new Image(),
  20.        
  21.         // DOM elements
  22.         overlay, closeBtn, image, prevBtn, nextBtn, bottom, caption, nav, number,
  23.        
  24.         // Effects
  25.         fxOverlay, fxResize,
  26.        
  27.         // CSS classes
  28.         zoomed = "pbzoomed", greyed = "pbgreyed";
  29.        
  30.         /*
  31.                 Initialization
  32.         */
  33.        
  34.         $(document).ready(function() {
  35.                 $(document.body).append(
  36.                         $([
  37.                                 overlay = $('<div id="pbOverlay" />').click(close).append(
  38.                                         closeBtn = $('<div id="pbCloseBtn" />')[0]
  39.                                 )[0],
  40.                                 image = $('<img id="pbImage" />').dblclick(doubleClick)[0],
  41.                                 bottom = $('<div id="pbBottom" />').append([
  42.                                         caption = $('<div id="pbCaption" />')[0],
  43.                                         $('<div id="pbNav" />').append([
  44.                                                 prevBtn = $('<a id="pbPrevBtn" href="#" />').click(previous)[0],
  45.                                                 zoomBtn  = $('<a id="pbZoomBtn" href="#" />').click(doubleClick)[0],
  46.                                                 nextBtn = $('<a id="pbNextBtn" href="#" />').click(next)[0]
  47.                                         ])[0],
  48.                                         number = $('<div id="pbNumber" />')[0]
  49.                                 ])[0]
  50.                         ]).css("display", "none")
  51.                 );
  52.                
  53.                 browserIsCrap = ie6 || (overlay.currentStyle && (overlay.currentStyle.position != "fixed"));
  54.                 if (browserIsCrap) {
  55.                         $([overlay, closeBtn, image, bottom]).css("position", "absolute");
  56.                 }
  57.                
  58.                 $(image).tinyDrag(function() {
  59.                         var i = $(image), pos = i.position();
  60.                         imageX = (pos.left - win.scrollLeft()) + i.width() / 2;
  61.                         imageY = (pos.top - win.scrollTop()) + i.height() / 2;
  62.                         $(zoomBtn).addClass(zoomed);
  63.                 });
  64.         });
  65.        
  66.         $.picbox = function(_images, startImage, _options) {
  67.                 options = $.extend({
  68.                         loop: false,                                    // Allows to navigate between first and last images
  69.                         overlayOpacity: 0.8,                    // 1 is opaque, 0 is completely transparent (change the color in the CSS file)
  70.                         overlayFadeDuration: 200,               // Duration of the overlay fade-in and fade-out animations (in milliseconds)
  71.                         resizeDuration: 300,                    // Duration of each of the image resize animations (in milliseconds)
  72.                         resizeEasing: "swing",                  // swing uses the jQuery default easing
  73.                         controlsFadeDelay: 3000,                // Time delay before controls fade when not moving the mouse (in milliseconds)
  74.                         counterText: false,                             // Counter text. Use {x} for current image and {y} for total e.g. Image {x} of {y}
  75.                         hideFlash: true,                                // Hides flash elements on the page when picbox is activated. NOTE: flash elements must have wmode parameter set to "opaque" or "transparent" if this is set to false
  76.                         closeKeys: [27, 88, 67],                // Array of keycodes to close Picbox, default: Esc (27), 'x' (88), 'c' (67)
  77.                         previousKeys: [37, 80],                 // Array of keycodes to navigate to the previous image, default: Left arrow (37), 'p' (80)
  78.                         nextKeys: [39, 78],                             // Array of keycodes to navigate to the next image, default: Right arrow (39), 'n' (78)
  79.                         margins: 0                                              // Margin between the image and the sides of the window (in pixels)
  80.                 }, _options || {});
  81.  
  82.  
  83.                 // The function is called for a single image, with URL and Title as first two arguments
  84.                 if (typeof _images == "string") {
  85.                         _images = [[_images, startImage]];
  86.                         startImage = 0;
  87.                 }
  88.                
  89.                 $(overlay).css("opacity", 0).fadeTo(options.overlayFadeDuration, options.overlayOpacity);
  90.                 $(bottom).css("display", "");
  91.                 mouseMove(); // So controls dissapear if even if mouse is never moved
  92.                 position();
  93.                 setup(1);
  94.  
  95.                 images = _images;
  96.                 options.loop = options.loop && (images.length > 1);
  97.                 return changeImage(startImage);
  98.         }
  99.  
  100.         $.fn.picbox = function(_options, linkMapper, linksFilter) {
  101.                 linkMapper = linkMapper || function(el) {
  102.                         return [el.href, el.title];
  103.                 };
  104.  
  105.                 linksFilter = linksFilter || function() {
  106.                         return true;
  107.                 };
  108.  
  109.                 var links = this;
  110.                
  111.                 $(links).unbind("click").click(function() {
  112.                         var link = this, linksMapped = [];
  113.                         // Build the list of images that will be displayed
  114.                         filteredLinks = $.grep(links, function(el) {
  115.                                 return linksFilter.call(link, el);
  116.                         });
  117.                        
  118.                         // Can't use $.map() as it flattens array
  119.                         for (var i = 0; i < filteredLinks.length; i++)
  120.                                 linksMapped[i] = linkMapper(filteredLinks[i]);
  121.                         return $.picbox(linksMapped, $.inArray(this, filteredLinks), _options);
  122.                 });
  123.  
  124.                 return links;
  125.         }
  126.        
  127.         /*
  128.                 Internal functions
  129.         */
  130.        
  131.         function position() {
  132.                 var scroll = {x: win.scrollLeft(), y: win.scrollTop()}
  133.                 middleX = win.width() / 2;
  134.                 middleY = win.height() / 2;
  135.                
  136.                 if (browserIsCrap) {
  137.                         middleX = middleX + scroll.x;
  138.                         middleY = middleY + scroll.y;
  139.                         $(overlay).css({left: scroll.x, top: scroll.y, width: win.width(), height: win.height()});
  140.                 }
  141.  
  142.                 $(image).css({top: middleY, left: middleX, width: '1px', height: '1px'});
  143.         }
  144.        
  145.         function setup(open) {
  146.                 if (options.hideFlash) {
  147.                         $.each(["object", "embed"], function(i, val) {
  148.                                 $(val).each(function() {
  149.                                         // jQuery 1.4 doesn't allow .data() on object tags
  150.                                         if (open) this._picbox = this.style.visibility;
  151.                                         this.style.visibility = open ? "hidden" : this._picbox;
  152.                                 });
  153.                         });
  154.                 }
  155.                
  156.                 overlay.style.display = "";
  157.  
  158.                 var fn = open ? "bind" : "unbind";
  159.                 $(document)[fn]("keydown", keyDown);
  160.                 $(document)[fn]("mousewheel", scrollZoom);
  161.                 $(document)[fn]("mousemove", mouseMove);
  162.                 $(bottom)[fn]("mouseover", function(){preventFade(1)});
  163.                 $(bottom)[fn]("mouseout", preventFade);
  164.         }
  165.        
  166.         function keyDown(event) {
  167.                 var code = event.keyCode;
  168.                 // Prevent default keyboard action (like navigating inside the page)
  169.                 return $.inArray(code, options.closeKeys) >= 0 ? close()
  170.                         : $.inArray(code, options.nextKeys) >= 0 ? next()
  171.                         : $.inArray(code, options.previousKeys) >= 0 ? previous()
  172.                         : false;
  173.         }
  174.  
  175.         function mouseMove() {
  176.           flashFade([bottom, prevBtn, zoomBtn, nextBtn]);
  177.         }
  178.        
  179.         function flashFade(targets, out) {
  180.                 clearTimeout(timer);
  181.                 $(targets).fadeIn();
  182.                 targets = out ? $.merge(targets, out) : targets;
  183.                 timer = setTimeout(function(){$(targets).fadeOut()}, options.controlsFadeDelay);
  184.         }
  185.        
  186.         function preventFade(over) {
  187.                 var fn = 1 == over ? "unbind" : "bind";
  188.                 $(document)[fn]("mousemove", mouseMove);
  189.                 clearTimeout(timer);
  190.         }
  191.        
  192.         function previous() {
  193.                 return changeImage(prevImage, true);
  194.         }
  195.  
  196.         function next() {
  197.                 return changeImage(nextImage, true);
  198.         }
  199.        
  200.         function changeImage(imageIndex, noAnim) {
  201.  
  202.                 if (imageIndex >= 0) {
  203.                         activeImage = imageIndex;
  204.                         activeURL = images[imageIndex][0];
  205.                         prevImage = (activeImage || (options.loop ? images.length : 0)) - 1;
  206.                         nextImage = ((activeImage + 1) % images.length) || (options.loop ? 0 : -1);
  207.  
  208.                         stop();
  209.                         overlay.className = "pbLoading";
  210.                         $(image).css("display", "none");
  211.  
  212.                         if (!images[activeImage][1]) $(caption).html("").hide();
  213.                         else $(caption).html(images[activeImage][1]).show();
  214.                         $(number).html((((images.length > 1) && options.counterText) || "").replace(/{x}/, activeImage + 1).replace(/{y}/, images.length));
  215.                         if (prevImage >= 0) {preloadPrev.src = images[prevImage][0]; $(prevBtn).removeClass(greyed);}
  216.                         if (nextImage >= 0) {preloadNext.src = images[nextImage][0]; $(nextBtn).removeClass(greyed);}
  217.  
  218.                        
  219.  
  220.                         preload = new Image();
  221.                         preload.onload = function(){showImage(noAnim);};
  222.                         preload.src = activeURL;
  223.                 }
  224.  
  225.                 return false;
  226.         }
  227.        
  228.         function showImage(noAnim) {
  229.                 resetImageCenter();
  230.  
  231.                 var mw = win.width() - options.margins, mh = win.height() - options.margins, size = 1;
  232.                 if ((preload.width > mw) || (preload.height > mh)) {
  233.                         size = Math.min(mw / preload.width, mh / preload.height);
  234.                         $(zoomBtn).removeClass(greyed);
  235.                         fitsOnScreen = false;
  236.                 } else {
  237.                         $(zoomBtn).addClass(greyed);
  238.                         fitsOnScreen = true;
  239.                 }
  240.                        
  241.                 currentSize = initialSize = size;
  242.  
  243.                 resizeImage(size, noAnim);
  244.  
  245.                 $(image).attr("src", activeURL);
  246.                 $(image).css("display", "");
  247.                 overlay.className = "";
  248.                
  249.                 flashFade([bottom], [prevBtn, zoomBtn, nextBtn]);
  250.         }
  251.        
  252.         function resizeImage(to, noAnim) {
  253.  
  254.                 var amount = to / currentSize;
  255.                 imageX = middleX - (middleX - imageX) * amount;
  256.                 imageY = middleY - (middleY - imageY) * amount;
  257.  
  258.                 currentSize = to;
  259.  
  260.                 var     width = preload.width * to,
  261.                         height = preload.height * to,
  262.                         // round these as some browsers don't like very small css values
  263.                         left = imageX - (width / 2) >> 0,
  264.                         top = imageY - (height / 2) >> 0,
  265.                
  266.                 dur = noAnim ? 0 : options.resizeDuration, fn = (0 == to) ? function(){$(image).hide()}:function(){};
  267.                 $(image).animate({width: width, height: height, top: top, left: left}, {queue:false, duration: dur, easing: options.resizeEasing, complete: fn});
  268.                
  269.                 return false;
  270.         }
  271.  
  272.         function resetImageCenter() {
  273.                 imageX = middleX;
  274.                 imageY = middleY;
  275.         }
  276.  
  277.         function scrollZoom(e, delta) {
  278.                 $(zoomBtn).addClass(zoomed);
  279.                 var to = currentSize + delta * currentSize / 10;
  280.                 return resizeImage(to);
  281.         }
  282.  
  283.         function doubleClick() {
  284.                 if (currentSize == initialSize && imageX == middleX && imageY == middleY && !fitsOnScreen) {
  285.                         $(zoomBtn).addClass(zoomed);
  286.                         return resizeImage(1);
  287.                 } else {
  288.                         $(zoomBtn).removeClass(zoomed);
  289.                         resetImageCenter();
  290.                         return resizeImage(initialSize);
  291.                 }
  292.         }
  293.  
  294.         function stop() {
  295.                 preload.onload = function(){};
  296.                 preload.src = preloadPrev.src = preloadNext.src = activeURL;
  297.                 $(image).stop();
  298.                 $([prevBtn, nextBtn]).addClass(greyed);
  299.                 $(zoomBtn).removeClass(zoomed);
  300.         }
  301.  
  302.         function close() {
  303.                 if (activeImage >= 0) {
  304.                         stop();
  305.                         activeImage = prevImage = nextImage = -1;
  306.                         resizeImage(0);
  307.                         setup();
  308.                         $(bottom).stop().hide();
  309.                         $(overlay).stop().fadeOut();
  310.                 }
  311.  
  312.                 return false;
  313.         }
  314.        
  315.         /*!
  316.                 tinyDrag v0.9.2
  317.                 (c) 2010 Ben Kay <http://bunnyfire.co.uk>
  318.  
  319.                 MIT license
  320.         */
  321.  
  322.  
  323.         $.fn.tinyDrag = function(callback) {
  324.                 return $.tinyDrag(this, callback);
  325.         }
  326.  
  327.         $.tinyDrag = function(el, callback) {
  328.                 var mouseStart, elStart, moved, doc = $(document), abs = Math.abs;
  329.                 el.mousedown(function(e) {
  330.                         moved = false;
  331.                         mouseStart = {x: e.pageX, y: e.pageY};
  332.                         elStart = {x: parseInt(el.css("left")), y: parseInt(el.css("top"))}
  333.                         doc.mousemove(drag).mouseup(stop);
  334.                         return false;
  335.                 });
  336.                
  337.                 function drag(e) {
  338.                         var x = e.pageX, y = e.pageY;
  339.                         if (moved) {
  340.                                 el.css({left: elStart.x + (x - mouseStart.x), top: elStart.y + (y - mouseStart.y)});
  341.                         } else {
  342.                                 if (abs(x - mouseStart.x) > 1 || abs(y - mouseStart.y) > 1)
  343.                                         moved = true;
  344.                         }
  345.                         return false;
  346.                 }
  347.                
  348.                 function stop() {
  349.                         doc.unbind("mousemove", drag).unbind("mouseup");
  350.                         moved&&callback&&callback()
  351.                 }
  352.                
  353.                 return el;
  354.         }
  355.  
  356.  
  357. /*! Copyright (c) 2009 Brandon Aaron (http://brandonaaron.net)
  358.  * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php)
  359.  * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses.
  360.  * Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
  361.  * Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
  362.  *
  363.  * Version: 3.0.2
  364.  *
  365.  * Requires: 1.2.2+
  366.  */
  367.  
  368. var types = ['DOMMouseScroll', 'mousewheel'];
  369.  
  370. $.event.special.mousewheel = {
  371.         setup: function() {
  372.                 if ( this.addEventListener )
  373.                         for ( var i=types.length; i; )
  374.                                 this.addEventListener( types[--i], handler, false );
  375.                 else
  376.                         this.onmousewheel = handler;
  377.         },
  378.        
  379.         teardown: function() {
  380.                 if ( this.removeEventListener )
  381.                         for ( var i=types.length; i; )
  382.                                 this.removeEventListener( types[--i], handler, false );
  383.                 else
  384.                         this.onmousewheel = null;
  385.         }
  386. };
  387.  
  388. $.fn.extend({
  389.         mousewheel: function(fn) {
  390.                 return fn ? this.bind("mousewheel", fn) : this.trigger("mousewheel");
  391.         },
  392.        
  393.         unmousewheel: function(fn) {
  394.                 return this.unbind("mousewheel", fn);
  395.         }
  396. });
  397.  
  398.  
  399. function handler(event) {
  400.         var args = [].slice.call( arguments, 1 ), delta = 0, returnValue = true;
  401.        
  402.         event = $.event.fix(event || window.event);
  403.         event.type = "mousewheel";
  404.        
  405.         if ( event.wheelDelta ) delta = event.wheelDelta/120;
  406.         if ( event.detail     ) delta = -event.detail/3;
  407.        
  408.         // Add events and delta to the front of the arguments
  409.         args.unshift(event, delta);
  410.  
  411.         return $.event.handle.apply(this, args);
  412. }
  413.  
  414. })(jQuery);

回复 "Picbox 图片浏览插件"

这儿你可以回复上面这条便签

captcha