| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522 |
- /**
- * 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 );
|