HTML5实现的震撼3D焦点图动画

澳门新葡亰娱乐在线 2

在线演示源码下载

这是一款基于HTML5和jQuery的3D焦点图动画,焦点图中的图片利用了CSS3的相关特性实现图片倾斜效果,从而让图片出现3D的视觉效果。这款HTML5焦点图不仅可以手动点击按钮切换图片,而且还支持自动切换图片,使用起来也相当方便。如果你需要在网站中展示产品图片,那么这款焦点图插件非常适合你。

这是一款基于HTML5的焦点图动画,它和其他焦点图不同的地方在于,它播放的不仅仅是图片,而是可以自定义控制的网页元素。它不仅在图片间切换有过渡动画效果,而且在切换时图片中的元素也将出现动画效果,比如图中的文字移动、打散、重新组合等。这款HTML5动画图片播放器算得上是高端大气上档次。

CSS代码

.dg-container{
    width: 100%;
    height: 450px;
    position: relative;
}
.dg-wrapper{
    width: 481px;
    height: 316px;
    margin: 0 auto;
    position: relative;
    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    transform-style: preserve-3d;
    -webkit-perspective: 1000px;
    -moz-perspective: 1000px;
    -o-perspective: 1000px;
    -ms-perspective: 1000px;
    perspective: 1000px;
}
.dg-wrapper a{
    width: 482px;
    height: 316px;
    display: block;
    position: absolute;
    left: 0;
    top: 0;
    background: transparent url(../images/browser.png) no-repeat top left;
    box-shadow: 0px 10px 20px rgba(0,0,0,0.3);
}
.dg-wrapper a.dg-transition{
    -webkit-transition: all 0.5s ease-in-out;
    -moz-transition: all 0.5s ease-in-out;
    -o-transition: all 0.5s ease-in-out;
    -ms-transition: all 0.5s ease-in-out;
    transition: all 0.5s ease-in-out;
}
.dg-wrapper a img{
    display: block;
    padding: 41px 0px 0px 1px;
}
.dg-wrapper a div{
    font-style: italic;
    text-align: center;
    line-height: 50px;
    text-shadow: 1px 1px 1px rgba(255,255,255,0.5);
    color: #333;
    font-size: 16px;
    width: 100%;
    bottom: -55px;
    display: none;
    position: absolute;
}
.dg-wrapper a.dg-center div{
    display: block;
}
.dg-container nav{
    width: 58px;
    position: absolute;
    z-index: 1000;
    bottom: 40px;
    left: 50%;
    margin-left: -29px;
}
.dg-container nav span{
    text-indent: -9000px;
    float: left;
    cursor:pointer;
    width: 24px;
    height: 25px;
    opacity: 0.8;
    background: transparent url(../images/arrows.png) no-repeat top left;
}
.dg-container nav span:hover{
    opacity: 1;
}
.dg-container nav span.dg-next{
    background-position: top right;
    margin-left: 10px;
}

澳门新葡亰娱乐在线 1

澳门新葡亰娱乐在线 2

JavaScript代码:

下面是这个焦点图插件的代码。

/**
* @author Alexander Farkas
* v. 1.22
*/
(function ($)
{
    if (!document.defaultView || !document.defaultView.getComputedStyle)
    { // IE6-IE8
        var oldCurCSS = $.curCSS;
        $.curCSS = function (elem, name, force)
        {
            if (name === 'background-position')
            {
                name = 'backgroundPosition';
            }
            if (name !== 'backgroundPosition' || !elem.currentStyle || elem.currentStyle[name])
            {
                return oldCurCSS.apply(this, arguments);
            }
            var style = elem.style;
            if (!force && style && style[name])
            {
                return style[name];
            }
            return oldCurCSS(elem, 'backgroundPositionX', force) + ' ' + oldCurCSS(elem, 'backgroundPositionY', force);
        };
    }

    var oldAnim = $.fn.animate;
    $.fn.animate = function (prop)
    {
        if ('background-position' in prop)
        {
            prop.backgroundPosition = prop['background-position'];
            delete prop['background-position'];
        }
        if ('backgroundPosition' in prop)
        {
            prop.backgroundPosition = '(' + prop.backgroundPosition;
        }
        return oldAnim.apply(this, arguments);
    };

    function toArray(strg)
    {
        strg = strg.replace(/left|top/g, '0px');
        strg = strg.replace(/right|bottom/g, '100%');
        strg = strg.replace(/([0-9.]+)(s|)|$)/g, "$1px$2");
        var res = strg.match(/(-?[0-9.]+)(px|%|em|pt)s(-?[0-9.]+)(px|%|em|pt)/);
        return [parseFloat(res[1], 10), res[2], parseFloat(res[3], 10), res[3]];
    }

    $.fx.step.backgroundPosition = function (fx)
    {
        if (!fx.bgPosReady)
        {
            var start = $.curCSS(fx.elem, 'backgroundPosition');
            if (!start)
            {//FF2 no inline-style fallback
                start = '0px 0px';
            }

            start = toArray(start);
            fx.start = [start[0], start[2]];
            var end = toArray(fx.end);
            fx.end = [end[0], end[2]];

            fx.unit = [end[1], end[3]];
            fx.bgPosReady = true;
        }
        //return;
        var nowPosX = [];
        nowPosX[0] = ((fx.end[0] - fx.start[0]) * fx.pos) + fx.start[0] + fx.unit[0];
        nowPosX[1] = ((fx.end[1] - fx.start[1]) * fx.pos) + fx.start[1] + fx.unit[1];
        fx.elem.style.backgroundPosition = nowPosX[0] + ' ' + nowPosX[1];

    };
})(jQuery);

/*
tlrkSlider

  example usage:

    $("#slider").tlrkSlider({
      autoStart: false,
      elements: {
        "img": {delay: 10},
        "h2": {delay: 500},
        ".copy": {delay: 800},
        ".button": {delay: 1000}
      }
    });

  to go to a specific frame:
    $("#slider").tlrkSlider("go", position);
    "position" can have one of the following values:
    "next", "prev", "first", "last", "+1", "-1" or a numeric value

  to start/stop the automatic loop:
    $("#slider").tlrkSlider("start");
    $("#slider").tlrkSlider("stop");

  to change the delay between automatic transitions:
    $("#slider").tlrkSlider("option", "delayAnimation", 1000);

  to change any option:
    $("#slider").tlrkSlider("option", option_name, option_value);

  Changing the "elements" object is not tested.

  Changing the following options: "navigation", "navigationClass", "framesSelector", "autoStart" won't have any effect for now.
  They are used only during the initialization.

  $("#slider").data("tlrkSlider") will return the plugin instance and the methods/properties can be accessed from there.

  The plugin contructor defaults are accessable through TlrkSlider.defaults

  The function that actually sweep the elements in/out can be overriden from
    TlrkSlider.prototype._animationIn and TlrkSlider.prototype._animationOut

    See sweepIn/sweepOut 

 */

;(function( $, window, document, undefined ){

  // utility function that generates the "dots" navigation
  function generateNavigation($el, count, config) {
    var i, html = "",
        width = count * 24;

    html += "<ol class='" + config.navigationClass + "' style='margin-left: -" + width/2 + "px; width: " + width + "px'>";
    for (i = 0; i < count; i++) {
      html += "<li><a " + (i === 0 ? "class='selected'" : "" ) + " href='#" + (i) + "'>slide</a></li>";
    }
    html += "</ol>";

    $el.append(html);
  }

  function sweepOut($el, windowWidth) {
    var dfr = $.Deferred(),
        pos = $el.position(),
        width = $el.width(),
        delta, final,
        options = $el.data("tlrkAnimOptions");

    windowWidth = windowWidth || $(window).width(); // check if the windowWidth is passed, if not - get it

    delta = windowWidth - pos.left;
    final = -(delta);

    setTimeout(function(){
      $el.animate({left: final, opacity: "toggle"}, options.speed, options.easing, function(){
        dfr.resolve();
      });
    }, options.delay);

    return dfr.promise();
  }

  function sweepIn($el, windowWidth, frameLeft) {
    var dfr = $.Deferred(),
        options = $el.data("tlrkAnimOptions"),
        positionData = $el.data("tlrkOriginalPos"),
        final = positionData.position.left,
        rightEdge;

    windowWidth = windowWidth || $(window).width(); // check if the windowWidth is passed, if not - get it

    $el.css({opacity: 0, display: "block"}); // move it outside the right edge of the screen
    $el.css("left", function(current){
      return current + windowWidth - frameLeft;
    });

    setTimeout(function(){
      $el.animate({left: final, opacity: 1}, options.speed, options.easing, function(){
        dfr.resolve();
      });
    }, options.delay);

    return dfr.promise();
  }

  // two pass function that first iterates all the elements and gets their position/width/height
  // and then sets their position to absolute
  function absolutize($elements) {

    // todo - move it to separate function and do it just once
    // gather the original position/dimension data for all elements
    $elements.each(function(){
      var $t = $(this);

      if ($t.data("tlrkOriginalPos")) return

      $t.data("tlrkOriginalPos", {
        position: $t.position(),
        width: $t.width(),
        height: $t.height(),
        css_pos: $t.css("position"),
        css_left: $t.css("left"),
        css_top: $t.css("top"),
        css_width: $t.css("width") || "auto",
        css_height: $t.css("height") || "auto"
      });

    });

    // set the absolute position
    $elements.each(function(){
      var $t = $(this),
          opos = $t.data("tlrkOriginalPos");

      $t.css({
        position: "absolute",
        left: opos.position.left,
        top: opos.position.top,
        width: opos.width,
        height: opos.height
      });
    });
  }

  function restoreFrameElements($elements) {
    $elements.each(function(){
      var $t = $(this),
          opos = $t.data("tlrkOriginalPos");

      if (!opos) return

      $t.css({
        position: opos.css_pos,
        left: opos.css_left,
        top: opos.css_top,
        width: opos.css_width,
        height: opos.css_height
      });
    });

  }

  var TlrkSlider = function( elem, options ){
      this.elem = elem;
      this.$elem = $(elem);
      this.options = options;
    };

  // the plugin prototype
  TlrkSlider.prototype = {
    defaults: {

      defaultElementOptions: {
        speed: 1200,
        easing: "easeInOutBack",
        // interval before the element starts moving when the fadeIn/Out functions are called
        // it's a good idea to give different delays for the different elements
        // if all have the same delay they'll start moving all together
        delay: 100 
      },

      // dispose elements are these that are not included in the elements object
      // but affect the document flow and will be fadedIn/Out
      disposeDelay: 100, // delay for the dispose elements
      disposeSpeed: 1000, // how quickly they'll fadeOut/In

      delayBetweenTransition: 1000, // time between starting fadeOut and fadeIn
      delayAnimation: 7000, // time between auto changing the current frame

      loop: true, // if true when clicking next on the last frame the slider jumps to the first one

      autoStart: true, // start the automatic looping through the frames on init

      framesSelector: "section", // selector for the frames inside the slider

      elements: {
        "p": {delay: 100, speed: 1000, easing: "easeInOutBack"}
      },

      navigation: true, // the dots navigation on the bottom
      navigationClass: "slider-nav",

      // callbacks
      // another way to "catch" these events is with
      // $(-slider-element-).bind("animationStart")
      animationStart: null,
      animationEnd: null
    },

    init: function() {
      var c, e, element, $element,
          that = this,
          $firstFrame;

      c = this.config = $.extend({}, this.defaults, this.options);

      this.elem.style.position = "relative"; // make the wrapping element relative

      // basics
      this.$frames = this.$elem.find(c.framesSelector);
      this.framesCount = this.$frames.length;
      this.currentFrame = 0;
      this.queue = [];

      this._$elementsByFrame = {};
      this._$disposeElementsByFrame = {};

      for (i = 0; i < this.framesCount; i++) {
        this._$elementsByFrame[i] = this._getFrameElements(i); // cache the $elements by frame
        this._$disposeElementsByFrame[i] = this._getDisposeFrameElements(i); // cache the rest of the tree for each frame
      }

      if (c.navigation) {
        generateNavigation(this.$elem, this.framesCount, c);
        this.$navigation = this.$elem.find("."+c.navigationClass);
      }

      // bindings
      this.$elem.find(".slider-nav").delegate("a", "click", function(e){
        var frame = this.getAttribute("href").split("#")[1];
        that.go.call(that, frame);
        return false;
      });

      this.$elem // internal bindings for the callbacks
        .bind("animationStart", function(){
          if ($.isFunction(c.animationStart)) {c.animationStart.apply(that, arguments);}
        })
        .bind("animationEnd", function(){
          if ($.isFunction(c.animationEnd)) {c.animationEnd.apply(that, arguments);}
        })
      ;

      // start animation?
      if (c.autoStart) {
        this.start();
      } else {
        this.running = false;
      }

      return this;
    },

    start: function(instant) {
      var that = this;

      if (this.timer) { // we'll clear the current timer
        window.clearTimeout(this.timer);
      }

      this.running = true;

      if (instant) {
        that.nextFrame();
      } else {
        this.timer = window.setTimeout(function(){ that.nextFrame.call(that) }, that.config.delayAnimation);
      }
    },

    stop: function() {
      if (!this.running) return; // we are not running

      this.running = false;
      window.clearTimeout(this.timer);
    },

    // main function for changing frames
    selectFrame: function(frame, dfr) {
      var c = this.config, // shorthand for the config
          that = this,
          dfr = dfr || $.Deferred(),
          dFadeIn = $.Deferred(),
          dFadeOut = $.Deferred();

      if (isNaN(frame) || frame < 0 || frame > this.framesCount || frame === this.currentFrame) {
        dfr.reject();
        return dfr.promise();
      }

      // clear the animation loop interval if the animation is running
      if (this.running && this.timer) { 
        window.clearTimeout(this.timer);
      }

      // check if we are currenly running an animation.
      if (this.animated && this.queue.length > 0) {
        // wait for the last item in the queue to finish
        this.queue[this.queue.length-1].done(function(){
          that.selectFrame(frame, dfr); // and call again the selectFrame
        })
        return dfr.promise();
      }

      this.animated = true;
      this.$elem.trigger("animationStart", [this, frame]);

      this.queue.push(dfr);

      // fade the frames
      dFadeOut = this._fadeOutFrame(this.currentFrame);

      // hide the fadetout frame
      dFadeOut.done(function(){
        that.$frames.eq(that.currentFrame).hide();
      });

      window.setTimeout(function(){ // then wait delayBetweenTransition and fadeIn the new frame
        dFadeIn = that._fadeInFrame.call(that, frame).done(function(){
          // when both the fadeIn and fadeOut are done we'll resolve the selectFrame promise
          $.when(dFadeOut, dFadeIn).done(function(){
            that.animated = false;
            that.queue.shift();
            that.$elem.trigger("animationEnd", [that]);
            that.currentFrame = frame;
            dfr.resolve();
          });
        });
      }, c.delayBetweenTransition);

      // navigation html change
      if (this.config.navigation) {
        this.$navigation.find(".selected").removeClass("selected").end()
          .find("a").eq(frame).addClass("selected");
      }

      dfr.done(function(){ // we'll resume the loop animation after the transitions are done
        if (that.running) {
          that.start();
        }
      });

      return dfr.promise();
    },

    _fadeFrame: function(frame, callback, direction) {
      var dfr = $.Deferred(),
          $frame = this.$frames.eq(frame),
          $elements = this._$elementsByFrame[frame],
          windowWidth = $(window).width(), // cache it before the animations, so we don't have to check it for each element 
          i, len,
          that = this,
          elementAnimations = [],
          $disposeElements = this._$disposeElementsByFrame[frame],
          $affectedElements,
          frameLeft = $frame.offset().left;

      direction = direction || "out";

      if (!$.isFunction(callback)) return; // do nothing if there's no callback passed

      $affectedElements = $elements.add($disposeElements);

      // position absolute the animation and dispose elements
      absolutize($affectedElements);

      // toggle the dispose elements
      if ($disposeElements.length > 0) {
        window.setTimeout(function(){
          $disposeElements[direction === "out" ? "fadeOut" : "fadeIn"](that.config.disposeSpeed);
        }, this.config.disposeDelay);
      }

      // invoke the callback for each element
      // the callback must return a promise
      $elements.each(function(){
        elementAnimations.push( callback.call(that, $(this), windowWidth, frameLeft) );
      });

      // wait for all the elements to finish their animation
      $.when.apply(this, elementAnimations).done(function(){
        //restoreFrameElements($affectedElements); // and restore the elements' position
        dfr.resolve(); // resolve the fade function
      });

      return dfr.promise();
    },

    _fadeOutFrame: function(frame) {
      var dfr = $.Deferred(),
          $frame = this.$frames.eq(frame),
          $disposeElements = this._$disposeElementsByFrame[frame];

      this._fadeFrame(frame, this._animationOut, "out").done(function(){
        dfr.resolve();
      })

      return dfr.promise();
    },

    _fadeInFrame: function(frame) {
      var dfr = $.Deferred(),
          $frame = this.$frames.eq(frame),
          $elements = this._$elementsByFrame[frame];

      this._restoreFrame(frame);

      $frame.show();

      this._fadeFrame(frame, this._animationIn, "in").done(function(){
        dfr.resolve();
      });

      return dfr.promise();
    },

    _restoreFrame: function(frame){
      if (!frame) return
      restoreFrameElements( this._$elementsByFrame[frame].add(this._$disposeElementsByFrame[frame]) );
    },

    nextFrame: function() {
      var frame = this.currentFrame+1,
          dfr = $.Deferred();

      if (frame > this.framesCount-1) {
        if (this.config.loop) {
          frame = 0;
        } else {
          dfr.reject();
        }
      };

      this.selectFrame(frame).done(function(){
        dfr.resolve();
      });

      return dfr.promise();
    },

    prevFrame: function() {
      var frame = this.currentFrame-1,
          dfr = $.Deferred();

      if (frame < 0) {
        if (this.config.loop) {
          frame = this.framesCount-1;
        } else {
          dfr.reject();
          return dfr.promise();
        }
      }

      this.selectFrame(frame).done(function(){
        dfr.resolve();
      });

      return dfr.promise();
    },

    go: function(str) { // shorthand
      switch (str) {
        case "next":
        case "+1":
          this.nextFrame();
          break;

        case "prev":
        case "-1":
          this.prevFrame();
          break;

        case "first":
          this.selectFrame(0);
          break;

        case "last":
          this.selectFrame(this.framesCount-1);
          break;

        default:
          if (isNaN(str)) return;
          this.selectFrame(Number(str));
      }
    },

    // returns jquery collection of animation elements
    _getFrameElements: function(frame) { 
      var $frame = this.$frames.eq(frame),
          elements = this.config.elements,
          e, elementOptions,
          $found, $frameElements = $([]);

      for (e in elements) {
        elementOptions = elements[e];
        $found = $frame.find(e);
        $found.addClass("t-frame-element").data("tlrkAnimOptions", $.extend({}, this.defaults.defaultElementOptions, elementOptions ));
        $frameElements = $frameElements.add($found);
      }

      return $frameElements;
    },

    // returns jquery collection of elements that have to be faded out
    // i.e. elements on the same level as the animation elements
    // that doesn't contain other animation elements
    _getDisposeFrameElements: function(frame) {
      var $disposeElements = $([]),
          $frame = this.$frames.eq(frame),
          $elements = this._$elementsByFrame[frame];

      $elements.each(function(){
        var $t = $(this),
            $siblings = $t.siblings().not(".t-frame-element");

        $siblings.each(function(){
          var $t = $(this);
          // check if the node is not already marked and doesn't contains other frame elements
          if (!$t.hasClass("t-frame-dispose") && $t.find(".t-frame-element").length === 0) {
            $t.addClass("t-frame-dispose");
            $disposeElements = $disposeElements.add($t);
          }
        });

      });
      return $disposeElements;
    },

    // expose the internal animationIn/Out functions that are called for each element in the frame
    // two arguments are passed - the $element which have to be animated and the window width
    _animationIn: sweepIn,
    _animationOut: sweepOut

  }

  TlrkSlider.defaults = TlrkSlider.prototype.defaults;

  $.fn.tlrkSlider = function(options) {
    var otherArgs = Array.prototype.slice.call(arguments, 1);

    return this.each(function() {
      var $el = $(this),
          pluginData = $el.data("tlrkSlider");

      if (!pluginData) { // check if the slider is already attached
        pluginData = new TlrkSlider(this, options).init();
        $el.data("tlrkSlider", pluginData);
        return;
      }

      //change the options or call a method
      if (typeof options === "string") {

        // setting / getting option(s)
        if (options === "option") {

          if (typeof otherArgs[0] === "string" && typeof otherArgs[1] !== "undefined") { // set an option value
            pluginData.config[otherArgs[0]] = otherArgs[1]; 
          }

          if (typeof otherArgs[0] === "object") { // extend the config with new options
            pluginData.config = $.extend(pluginData.config, otherArgs[0]);
          }

        } else { // call a method?
          try {
            pluginData[options].apply(pluginData, otherArgs);
          } catch(ex) {
            throw "Error calling a plugin method (" + ex + ")";
          }
        }
      }
    });
  };

  window.TlrkSlider = TlrkSlider;

})( jQuery, window , document );

下面是页面调用的JS代码:

$(document).ready(function(){
  var $backgrounds = $(".header-content").find(".parallax-bg"),
      LAYER_OFFSET = 30,
      PRLX_SPEED = 1500,
      $slider;

  $slider = $("#slider").tlrkSlider({
    autoStart: true,
    animationStart: function(ev, slider, step){
      var max_steps = this.framesCount; 
      $backgrounds.each(function(idx, el){
        var pos = (step * (100 / max_steps)) + (LAYER_OFFSET * idx);
        $(this).animate({"backgroundPosition": pos + "% 0"}, PRLX_SPEED);
      });
    },
    elements: {
      "img": {delay: 10},
      "h2": {delay: 500},
      ".copy": {delay: 800},
      ".button": {delay: 1000}
    }
  });

  $(".header-content")
    .hover(
      function(){$(this).find(".slider-prev, .slider-next").show();},
      function(){$(this).find(".slider-prev, .slider-next").hide();}
    )
    .find(".slider-prev").click(function(){$slider.tlrkSlider("go", "prev"); return false; }).end()
    .find(".slider-next").click(function(){$slider.tlrkSlider("go", "next"); return false; });

});

在线演示源码下载

澳门新葡亰娱乐在线,JavaScript代码

/**
 * jquery.gallery.js
 * http://www.codrops.com
 *
 * Copyright 2011, Pedro Botelho / Codrops
 * Free to use under the MIT license.
 *
 * Date: Mon Jan 30 2012
 */

(function( $, undefined ) {

    /*
     * Gallery object.
     */
    $.Gallery               = function( options, element ) {

        this.$el    = $( element );
        this._init( options );

    };

    $.Gallery.defaults      = {
        current     : 0,    // index of current item
        autoplay    : false,// slideshow on / off
        interval    : 2000  // time between transitions
    };

    $.Gallery.prototype     = {
        _init               : function( options ) {

            this.options        = $.extend( true, {}, $.Gallery.defaults, options );

            // support for 3d / 2d transforms and transitions
            this.support3d      = Modernizr.csstransforms3d;
            this.support2d      = Modernizr.csstransforms;
            this.supportTrans   = Modernizr.csstransitions;

            this.$wrapper       = this.$el.find('.dg-wrapper');

            this.$items         = this.$wrapper.children();
            this.itemsCount     = this.$items.length;

            this.$nav           = this.$el.find('nav');
            this.$navPrev       = this.$nav.find('.dg-prev');
            this.$navNext       = this.$nav.find('.dg-next');

            // minimum of 3 items
            if( this.itemsCount < 3 ) {

                this.$nav.remove();
                return false;

            }   

            this.current        = this.options.current;

            this.isAnim         = false;

            this.$items.css({
                'opacity'   : 0,
                'visibility': 'hidden'
            });

            this._validate();

            this._layout();

            // load the events
            this._loadEvents();

            // slideshow
            if( this.options.autoplay ) {

                this._startSlideshow();

            }

        },
        _validate           : function() {

            if( this.options.current < 0 || this.options.current > this.itemsCount - 1 ) {

                this.current = 0;

            }   

        },
        _layout             : function() {

            // current, left and right items
            this._setItems();

            // current item is not changed
            // left and right one are rotated and translated
            var leftCSS, rightCSS, currentCSS;

            if( this.support3d && this.supportTrans ) {

                leftCSS     = {
                    '-webkit-transform' : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                    '-moz-transform'    : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                    '-o-transform'      : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                    '-ms-transform'     : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                    'transform'         : 'translateX(-350px) translateZ(-200px) rotateY(45deg)'
                };

                rightCSS    = {
                    '-webkit-transform' : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                    '-moz-transform'    : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                    '-o-transform'      : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                    '-ms-transform'     : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                    'transform'         : 'translateX(350px) translateZ(-200px) rotateY(-45deg)'
                };

                leftCSS.opacity     = 1;
                leftCSS.visibility  = 'visible';
                rightCSS.opacity    = 1;
                rightCSS.visibility = 'visible';

            }
            else if( this.support2d && this.supportTrans ) {

                leftCSS     = {
                    '-webkit-transform' : 'translate(-350px) scale(0.8)',
                    '-moz-transform'    : 'translate(-350px) scale(0.8)',
                    '-o-transform'      : 'translate(-350px) scale(0.8)',
                    '-ms-transform'     : 'translate(-350px) scale(0.8)',
                    'transform'         : 'translate(-350px) scale(0.8)'
                };

                rightCSS    = {
                    '-webkit-transform' : 'translate(350px) scale(0.8)',
                    '-moz-transform'    : 'translate(350px) scale(0.8)',
                    '-o-transform'      : 'translate(350px) scale(0.8)',
                    '-ms-transform'     : 'translate(350px) scale(0.8)',
                    'transform'         : 'translate(350px) scale(0.8)'
                };

                currentCSS  = {
                    'z-index'           : 999
                };

                leftCSS.opacity     = 1;
                leftCSS.visibility  = 'visible';
                rightCSS.opacity    = 1;
                rightCSS.visibility = 'visible';

            }

            this.$leftItm.css( leftCSS || {} );
            this.$rightItm.css( rightCSS || {} );

            this.$currentItm.css( currentCSS || {} ).css({
                'opacity'   : 1,
                'visibility': 'visible'
            }).addClass('dg-center');

        },
        _setItems           : function() {

            this.$items.removeClass('dg-center');

            this.$currentItm    = this.$items.eq( this.current );
            this.$leftItm       = ( this.current === 0 ) ? this.$items.eq( this.itemsCount - 1 ) : this.$items.eq( this.current - 1 );
            this.$rightItm      = ( this.current === this.itemsCount - 1 ) ? this.$items.eq( 0 ) : this.$items.eq( this.current + 1 );

            if( !this.support3d && this.support2d && this.supportTrans ) {

                this.$items.css( 'z-index', 1 );
                this.$currentItm.css( 'z-index', 999 );

            }

            // next & previous items
            if( this.itemsCount > 3 ) {

                // next item
                this.$nextItm       = ( this.$rightItm.index() === this.itemsCount - 1 ) ? this.$items.eq( 0 ) : this.$rightItm.next();
                this.$nextItm.css( this._getCoordinates('outright') );

                // previous item
                this.$prevItm       = ( this.$leftItm.index() === 0 ) ? this.$items.eq( this.itemsCount - 1 ) : this.$leftItm.prev();
                this.$prevItm.css( this._getCoordinates('outleft') );

            }

        },
        _loadEvents         : function() {

            var _self   = this;

            this.$navPrev.on( 'click.gallery', function( event ) {

                if( _self.options.autoplay ) {

                    clearTimeout( _self.slideshow );
                    _self.options.autoplay  = false;

                }

                _self._navigate('prev');
                return false;

            });

            this.$navNext.on( 'click.gallery', function( event ) {

                if( _self.options.autoplay ) {

                    clearTimeout( _self.slideshow );
                    _self.options.autoplay  = false;

                }

                _self._navigate('next');
                return false;

            });

            this.$wrapper.on( 'webkitTransitionEnd.gallery transitionend.gallery OTransitionEnd.gallery', function( event ) {

                _self.$currentItm.addClass('dg-center');
                _self.$items.removeClass('dg-transition');
                _self.isAnim    = false;

            });

        },
        _getCoordinates     : function( position ) {

            if( this.support3d && this.supportTrans ) {

                switch( position ) {
                    case 'outleft':
                        return {
                            '-webkit-transform' : 'translateX(-450px) translateZ(-300px) rotateY(45deg)',
                            '-moz-transform'    : 'translateX(-450px) translateZ(-300px) rotateY(45deg)',
                            '-o-transform'      : 'translateX(-450px) translateZ(-300px) rotateY(45deg)',
                            '-ms-transform'     : 'translateX(-450px) translateZ(-300px) rotateY(45deg)',
                            'transform'         : 'translateX(-450px) translateZ(-300px) rotateY(45deg)',
                            'opacity'           : 0,
                            'visibility'        : 'hidden'
                        };
                        break;
                    case 'outright':
                        return {
                            '-webkit-transform' : 'translateX(450px) translateZ(-300px) rotateY(-45deg)',
                            '-moz-transform'    : 'translateX(450px) translateZ(-300px) rotateY(-45deg)',
                            '-o-transform'      : 'translateX(450px) translateZ(-300px) rotateY(-45deg)',
                            '-ms-transform'     : 'translateX(450px) translateZ(-300px) rotateY(-45deg)',
                            'transform'         : 'translateX(450px) translateZ(-300px) rotateY(-45deg)',
                            'opacity'           : 0,
                            'visibility'        : 'hidden'
                        };
                        break;
                    case 'left':
                        return {
                            '-webkit-transform' : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                            '-moz-transform'    : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                            '-o-transform'      : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                            '-ms-transform'     : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                            'transform'         : 'translateX(-350px) translateZ(-200px) rotateY(45deg)',
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                    case 'right':
                        return {
                            '-webkit-transform' : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                            '-moz-transform'    : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                            '-o-transform'      : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                            '-ms-transform'     : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                            'transform'         : 'translateX(350px) translateZ(-200px) rotateY(-45deg)',
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                    case 'center':
                        return {
                            '-webkit-transform' : 'translateX(0px) translateZ(0px) rotateY(0deg)',
                            '-moz-transform'    : 'translateX(0px) translateZ(0px) rotateY(0deg)',
                            '-o-transform'      : 'translateX(0px) translateZ(0px) rotateY(0deg)',
                            '-ms-transform'     : 'translateX(0px) translateZ(0px) rotateY(0deg)',
                            'transform'         : 'translateX(0px) translateZ(0px) rotateY(0deg)',
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                };

            }
            else if( this.support2d && this.supportTrans ) {

                switch( position ) {
                    case 'outleft':
                        return {
                            '-webkit-transform' : 'translate(-450px) scale(0.7)',
                            '-moz-transform'    : 'translate(-450px) scale(0.7)',
                            '-o-transform'      : 'translate(-450px) scale(0.7)',
                            '-ms-transform'     : 'translate(-450px) scale(0.7)',
                            'transform'         : 'translate(-450px) scale(0.7)',
                            'opacity'           : 0,
                            'visibility'        : 'hidden'
                        };
                        break;
                    case 'outright':
                        return {
                            '-webkit-transform' : 'translate(450px) scale(0.7)',
                            '-moz-transform'    : 'translate(450px) scale(0.7)',
                            '-o-transform'      : 'translate(450px) scale(0.7)',
                            '-ms-transform'     : 'translate(450px) scale(0.7)',
                            'transform'         : 'translate(450px) scale(0.7)',
                            'opacity'           : 0,
                            'visibility'        : 'hidden'
                        };
                        break;
                    case 'left':
                        return {
                            '-webkit-transform' : 'translate(-350px) scale(0.8)',
                            '-moz-transform'    : 'translate(-350px) scale(0.8)',
                            '-o-transform'      : 'translate(-350px) scale(0.8)',
                            '-ms-transform'     : 'translate(-350px) scale(0.8)',
                            'transform'         : 'translate(-350px) scale(0.8)',
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                    case 'right':
                        return {
                            '-webkit-transform' : 'translate(350px) scale(0.8)',
                            '-moz-transform'    : 'translate(350px) scale(0.8)',
                            '-o-transform'      : 'translate(350px) scale(0.8)',
                            '-ms-transform'     : 'translate(350px) scale(0.8)',
                            'transform'         : 'translate(350px) scale(0.8)',
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                    case 'center':
                        return {
                            '-webkit-transform' : 'translate(0px) scale(1)',
                            '-moz-transform'    : 'translate(0px) scale(1)',
                            '-o-transform'      : 'translate(0px) scale(1)',
                            '-ms-transform'     : 'translate(0px) scale(1)',
                            'transform'         : 'translate(0px) scale(1)',
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                };

            }
            else {

                switch( position ) {
                    case 'outleft'  : 
                    case 'outright' : 
                    case 'left'     : 
                    case 'right'    :
                        return {
                            'opacity'           : 0,
                            'visibility'        : 'hidden'
                        };
                        break;
                    case 'center'   :
                        return {
                            'opacity'           : 1,
                            'visibility'        : 'visible'
                        };
                        break;
                };

            }

        },
        _navigate           : function( dir ) {

            if( this.supportTrans && this.isAnim )
                return false;

            this.isAnim = true;

            switch( dir ) {

                case 'next' :

                    this.current    = this.$rightItm.index();

                    // current item moves left
                    this.$currentItm.addClass('dg-transition').css( this._getCoordinates('left') );

                    // right item moves to the center
                    this.$rightItm.addClass('dg-transition').css( this._getCoordinates('center') ); 

                    // next item moves to the right
                    if( this.$nextItm ) {

                        // left item moves out
                        this.$leftItm.addClass('dg-transition').css( this._getCoordinates('outleft') );

                        this.$nextItm.addClass('dg-transition').css( this._getCoordinates('right') );

                    }
                    else {

                        // left item moves right
                        this.$leftItm.addClass('dg-transition').css( this._getCoordinates('right') );

                    }
                    break;

                case 'prev' :

                    this.current    = this.$leftItm.index();

                    // current item moves right
                    this.$currentItm.addClass('dg-transition').css( this._getCoordinates('right') );

                    // left item moves to the center
                    this.$leftItm.addClass('dg-transition').css( this._getCoordinates('center') );

                    // prev item moves to the left
                    if( this.$prevItm ) {

                        // right item moves out
                        this.$rightItm.addClass('dg-transition').css( this._getCoordinates('outright') );

                        this.$prevItm.addClass('dg-transition').css( this._getCoordinates('left') );

                    }
                    else {

                        // right item moves left
                        this.$rightItm.addClass('dg-transition').css( this._getCoordinates('left') );

                    }
                    break;  

            };

            this._setItems();

            if( !this.supportTrans )
                this.$currentItm.addClass('dg-center');

        },
        _startSlideshow     : function() {

            var _self   = this;

            this.slideshow  = setTimeout( function() {

                _self._navigate( 'next' );

                if( _self.options.autoplay ) {

                    _self._startSlideshow();

                }

            }, this.options.interval );

        },
        destroy             : function() {

            this.$navPrev.off('.gallery');
            this.$navNext.off('.gallery');
            this.$wrapper.off('.gallery');

        }
    };

    var logError            = function( message ) {
        if ( this.console ) {
            console.error( message );
        }
    };

    $.fn.gallery            = function( options ) {

        if ( typeof options === 'string' ) {

            var args = Array.prototype.slice.call( arguments, 1 );

            this.each(function() {

                var instance = $.data( this, 'gallery' );

                if ( !instance ) {
                    logError( "cannot call methods on gallery prior to initialization; " +
                    "attempted to call method '" + options + "'" );
                    return;
                }

                if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
                    logError( "no such method '" + options + "' for gallery instance" );
                    return;
                }

                instance[ options ].apply( instance, args );

            });

        } 
        else {

            this.each(function() {

                var instance = $.data( this, 'gallery' );
                if ( !instance ) {
                    $.data( this, 'gallery', new $.Gallery( options, this ) );
                }
            });

        }

        return this;

    };

})( jQuery );

在线演示源码下载

发表评论

电子邮件地址不会被公开。 必填项已用*标注

相关文章

网站地图xml地图