/** * @preserve Flux Slider v1.4.4 * http://www.joelambert.co.uk/flux * * Copyright 2011, Joe Lambert. * Free to use under the MIT license. * http://www.opensource.org/licenses/mit-license.php */ // Flux namespace window.flux = { version: '1.4.4' }; (function($){ flux.slider = function(elem, opts) { // Setup the flux.browser singleton to perform feature detection flux.browser.init(); if(!flux.browser.supportsTransitions) { if(window.console && window.console.error) console.error("Flux Slider requires a browser that supports CSS3 transitions"); } var _this = this; this.element = $(elem); // Make a list of all available transitions this.transitions = []; for(var fx in flux.transitions) this.transitions.push(fx); this.options = $.extend({ autoplay: true, transitions: this.transitions, delay: 4000, pagination: true, controls: false, captions: false, width: null, height: null, onTransitionEnd: null }, opts); // Set the height/width if given [EXPERIMENTAL!] this.height = this.options.height ? this.options.height : null; this.width = this.options.width ? this.options.width : null; // Filter out non compatible transitions var newTrans = []; $(this.options.transitions).each(function(index, tran){ var t = new flux.transitions[tran](this), compatible = true; if(t.options.requires3d && !flux.browser.supports3d) compatible = false; if(t.options.compatibilityCheck) compatible = t.options.compatibilityCheck(); if(compatible) newTrans.push(tran); }); this.options.transitions = newTrans; this.images = new Array(); this.imageLoadedCount = 0; this.currentImageIndex = 0; this.nextImageIndex = 1; this.playing = false; this.container = $('
').appendTo(this.element); this.surface = $('
').appendTo(this.container); // Listen for click events as we may want to follow a link this.container.bind('click', function(event) { if($(event.target).hasClass('hasLink')) window.location = $(event.target).data('href'); }); this.imageContainer = $('
').css({ 'position': 'relative', 'overflow': 'hidden', 'min-height': '100px' }).appendTo(this.surface); // If the height/width is already set then resize the container if(this.width && this.height) { this.imageContainer.css({ width: this.width+'px', height: this.height+'px' }); } // Create the placeholders for the current and next image this.image1 = $('
').appendTo(this.imageContainer); this.image2 = $('
').appendTo(this.imageContainer); $(this.image1).add(this.image2).css({ 'position': 'absolute', 'top': '0px', 'right': 'auto', 'left': 'auto' }); // Get a list of the images to use this.element.find('img, a img').each(function(index, found_img){ var imgClone = found_img.cloneNode(false), link = $(found_img).parent(); // If this img is directly inside a link then save the link for later use if(link.is('a')) $(imgClone).data('href', link.attr('href')); _this.images.push(imgClone); // Remove the images from the DOM $(found_img).remove(); }); // Load the images afterwards as IE seems to load images synchronously for(var i=0; i= _this.images.length) { _this.finishedLoading(); _this.setupImages(); } }; // Load the image to ensure its cached by the browser image.src = this.images[i].src; } // Catch when a transition has finished this.element.bind('fluxTransitionEnd', function(event, data) { // If the slider is currently playing then set the timeout for the next transition // if(_this.isPlaying()) // _this.start(); // Are we using a callback instead of events for notifying about transition ends? if(_this.options.onTransitionEnd) { event.preventDefault(); _this.options.onTransitionEnd(data); } }); // Should we auto start the slider? if(this.options.autoplay) this.start(); // Handle swipes this.element.bind('swipeLeft', function(event){ _this.next(null, {direction: 'left'}); }).bind('swipeRight', function(event){ _this.prev(null, {direction: 'right'}); }); // Under FF7 autoplay breaks when the current tab loses focus setTimeout(function(){ $(window).focus(function(){ if(_this.isPlaying()) _this.next(); }); }, 100); }; flux.slider.prototype = { constructor: flux.slider, playing: false, start: function() { var _this = this; this.playing = true; this.interval = setInterval(function() { console.log('play'); _this.transition(); }, this.options.delay); }, stop: function() { this.playing = false; clearInterval(this.interval); this.interval = null; }, isPlaying: function() { return this.playing; //return this.interval != null; }, next: function(trans, opts) { opts = opts || {}; opts.direction = 'left'; this.showImage(this.currentImageIndex+1, trans, opts); }, prev: function(trans, opts) { opts = opts || {}; opts.direction = 'right'; this.showImage(this.currentImageIndex-1, trans, opts); }, showImage: function(index, trans, opts) { this.setNextIndex(index); // Temporarily stop the transition interval //clearInterval(this.interval); //this.interval = null; this.setupImages(); this.transition(trans, opts); }, finishedLoading: function() { var _this = this; this.container.css({ width: this.width+'px', height: this.height+'px' }); this.imageContainer.removeClass('loading'); // Should we setup a pagination view? if(this.options.pagination) { // TODO: Attach to touch events if appropriate this.pagination = $('').css({ margin: '0px', padding: '0px', 'text-align': 'center' }); this.pagination.bind('click', function(event){ event.preventDefault(); _this.showImage($(event.target).data('index')); }); $(this.images).each(function(index, image){ var li = $('
  • '+(index+1)+'
  • ').css({ display: 'inline-block', 'margin-left': '0.5em', 'cursor': 'pointer' }).appendTo(_this.pagination); if(index == 0) li.css('margin-left', 0).addClass('current'); }); this.container.append(this.pagination); } // Resize $(this.imageContainer).css({ width: this.width+'px', height: this.height+'px' }); $(this.image1).css({ width: this.width+'px', height: this.height+'px' }); $(this.image2).css({ width: this.width+'px', height: this.height+'px' }); this.container.css({ width: this.width+'px', height: this.height+(this.options.pagination?this.pagination.height():0)+'px' }); // Should we add prev/next controls? if(this.options.controls) { var css = { padding: '4px 10px 10px', 'font-size': '60px', 'font-family': 'arial, sans-serif', 'line-height': '1em', 'font-weight': 'bold', color: '#FFF', 'text-decoration': 'none', background: 'rgba(0,0,0,0.5)', position: 'absolute', 'z-index': 2000 }; this.nextButton = $('╨а╤Ю╨атА║').css(css).css3({ 'border-radius': '4px' }).appendTo(this.surface).bind('click', function(event){ event.preventDefault(); _this.next(); }); this.prevButton = $('╨а╤Ю╨атА╣').css(css).css3({ 'border-radius': '4px' }).appendTo(this.surface).bind('click', function(event){ event.preventDefault(); _this.prev(); }); var top = (this.height - this.nextButton.height())/2; this.nextButton.css({ top: top+'px', right: '10px' }); this.prevButton.css({ top: top+'px', left: '10px' }); } // Should we use captions? if(this.options.captions) { this.captionBar = $('
    ').css({ background: 'rgba(0,0,0,0.6)', color: '#FFF', 'font-size': '16px', 'font-family': 'helvetica, arial, sans-serif', 'text-decoration': 'none', 'font-weight': 'bold', padding: '1.5em 1em', opacity: 0, position: 'absolute', 'z-index': 110, width: '100%', bottom: 0 }).css3({ 'transition-property': 'opacity', 'transition-duration': '800ms', 'box-sizing': 'border-box' }).prependTo(this.surface); } this.updateCaption(); }, setupImages: function() { var img1 = this.getImage(this.currentImageIndex), css1 = { 'background-image': 'url("'+img1.src+'")', 'z-index': 101, 'cursor': 'auto' }; // Does this image have an associated link? if($(img1).data('href')) { css1.cursor = 'pointer'; this.image1.addClass('hasLink'); this.image1.data('href', $(img1).data('href')); } else { this.image1.removeClass('hasLink'); this.image1.data('href', null); } this.image1.css(css1).children().remove(); this.image2.css({ 'background-image': 'url("'+this.getImage(this.nextImageIndex).src+'")', 'z-index': 100 }).show(); if(this.options.pagination && this.pagination) { this.pagination.find('li.current').removeClass('current'); $(this.pagination.find('li')[this.currentImageIndex]).addClass('current'); } }, transition: function(transition, opts) { // Allow a transition to be picked from ALL available transitions (not just the reduced set) if(transition == undefined || !flux.transitions[transition]) { // Pick a transition at random from the (possibly reduced set of) transitions var index = Math.floor(Math.random()*(this.options.transitions.length)); transition = this.options.transitions[index]; } var tran = null; try { tran = new flux.transitions[transition](this, $.extend(this.options[transition] ? this.options[transition] : {}, opts)); } catch(e) { // If an invalid transition has been provided then use the fallback (default is to just switch the image) tran = new flux.transition(this, {fallback: true}); } tran.run(); this.currentImageIndex = this.nextImageIndex; this.setNextIndex(this.currentImageIndex+1); this.updateCaption(); }, updateCaption: function() { var str = $(this.getImage(this.currentImageIndex)).attr('title'); if(this.options.captions && this.captionBar) { if(str !== "") this.captionBar.html(str); this.captionBar.css('opacity', str === "" ? 0 : 1); } }, getImage: function(index) { index = index % this.images.length; return this.images[index]; }, setNextIndex: function(nextIndex) { if(nextIndex == undefined) nextIndex = this.currentImageIndex+1; this.nextImageIndex = nextIndex; if(this.nextImageIndex > this.images.length-1) this.nextImageIndex = 0; if(this.nextImageIndex < 0) this.nextImageIndex = this.images.length-1; }, increment: function() { this.currentImageIndex++; if(this.currentImageIndex > this.images.length-1) this.currentImageIndex = 0; } }; })(window.jQuery || window.Zepto); /** * Helper object to determine support for various CSS3 functions * @author Joe Lambert */ (function($) { flux.browser = { init: function() { // Have we already been initialised? if(flux.browser.supportsTransitions !== undefined) return; var div = document.createElement('div'), prefixes = ['-webkit', '-moz', '-o', '-ms'], domPrefixes = ['Webkit', 'Moz', 'O', 'Ms']; // Does the current browser support CSS Transitions? if(window.Modernizr && Modernizr.csstransitions !== undefined) flux.browser.supportsTransitions = Modernizr.csstransitions; else { flux.browser.supportsTransitions = this.supportsCSSProperty('Transition'); } // Does the current browser support 3D CSS Transforms? if(window.Modernizr && Modernizr.csstransforms3d !== undefined) flux.browser.supports3d = Modernizr.csstransforms3d; else { // Custom detection when Modernizr isn't available flux.browser.supports3d = this.supportsCSSProperty("Perspective"); if ( flux.browser.supports3d && 'webkitPerspective' in $('body').get(0).style ) { // Double check with a media query (similar to how Modernizr does this) var div3D = $('
    '); var mq = $(''); $('body').append(div3D); $('head').append(mq); flux.browser.supports3d = div3D.get(0).offsetLeft == 9; div3D.remove(); mq.remove(); } } }, supportsCSSProperty: function(prop) { var div = document.createElement('div'), prefixes = ['-webkit', '-moz', '-o', '-ms'], domPrefixes = ['Webkit', 'Moz', 'O', 'Ms']; var support = false; for(var i=0; i 0) { var add = colRemainder >= colAddPerLoop ? colAddPerLoop : colRemainder; thisColWidth += add; colRemainder -= add; } for(var j=0; j 0) { var add = thisRowRemainder >= rowAddPerLoop ? rowAddPerLoop : thisRowRemainder; thisRowHeight += add; thisRowRemainder -= add; } var tile = $('
    ').css({ width: thisColWidth+'px', height: thisRowHeight+'px', position: 'absolute', top: totalTop+'px', left: totalLeft+'px' }); this.options.renderTile.call(this, tile, i, j, thisColWidth, thisRowHeight, totalLeft, totalTop); fragment.appendChild(tile.get(0)); totalTop += thisRowHeight; } totalLeft += thisColWidth; } // Append the fragement to the surface this.slider.image1.get(0).appendChild(fragment); }, execute: function() { var _this = this, height = this.slider.image1.height(), bars = this.slider.image1.find('div.barcontainer'); this.slider.image2.hide(); // Get notified when the last transition has completed bars.last().transitionEnd(function(event){ _this.slider.image2.show(); _this.finished(); }); bars.css3({ 'transform': flux.browser.rotateX(-90) + ' ' + flux.browser.translate(0, height/2, height/2) }); }, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.bars = function(fluxslider, opts) { return new flux.transition_grid(fluxslider, $.extend({ columns: 10, rows: 1, delayBetweenBars: 40, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { $(elem).css({ 'background-image': this.slider.image1.css('background-image'), 'background-position': '-'+leftOffset+'px 0px' }).css3({ 'transition-duration': '400ms', 'transition-timing-function': 'ease-in', 'transition-property': 'all', 'transition-delay': (colIndex*this.options.delayBetweenBars)+'ms' }); }, execute: function() { var _this = this; var height = this.slider.image1.height(); var bars = this.slider.image1.find('div.tile'); // Get notified when the last transition has completed $(bars[bars.length-1]).transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ bars.css({ 'opacity': '0.5' }).css3({ 'transform': flux.browser.translate(0, height) }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.bars3d = function(fluxslider, opts) { return new flux.transition_grid(fluxslider, $.extend({ requires3d: true, columns: 7, rows: 1, delayBetweenBars: 150, perspective: 1000, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { var bar = $('
    ').css({ width: colWidth+'px', height: '100%', position: 'absolute', top: '0px', left: '0px', 'z-index': 200, 'background-image': this.slider.image1.css('background-image'), 'background-position': '-'+leftOffset+'px 0px', 'background-repeat': 'no-repeat' }).css3({ 'backface-visibility': 'hidden' }), bar2 = $(bar.get(0).cloneNode(false)).css({ 'background-image': this.slider.image2.css('background-image') }).css3({ 'transform': flux.browser.rotateX(90) + ' ' + flux.browser.translate(0, -rowHeight/2, rowHeight/2) }), left = $('
    ').css({ width: rowHeight+'px', height: rowHeight+'px', position: 'absolute', top: '0px', left: '0px', background: '#222', 'z-index': 190 }).css3({ 'transform': flux.browser.rotateY(90) + ' ' + flux.browser.translate(rowHeight/2, 0, -rowHeight/2) + ' ' + flux.browser.rotateY(180), 'backface-visibility': 'hidden' }), right = $(left.get(0).cloneNode(false)).css3({ 'transform': flux.browser.rotateY(90) + ' ' + flux.browser.translate(rowHeight/2, 0, colWidth-rowHeight/2) }); $(elem).css({ width: colWidth+'px', height: '100%', position: 'absolute', top: '0px', left: leftOffset+'px', 'z-index': colIndex > this.options.columns/2 ? 1000-colIndex : 1000 // Fix for Chrome to ensure that the z-index layering is correct! }).css3({ 'transition-duration': '800ms', 'transition-timing-function': 'linear', 'transition-property': 'all', 'transition-delay': (colIndex*this.options.delayBetweenBars)+'ms', 'transform-style': 'preserve-3d' }).append(bar).append(bar2).append(left).append(right); }, execute: function() { this.slider.image1.css3({ 'perspective': this.options.perspective, 'perspective-origin': '50% 50%' }).css({ '-moz-transform': 'perspective('+this.options.perspective+'px)', '-moz-perspective': 'none', '-moz-transform-style': 'preserve-3d' }); var _this = this, height = this.slider.image1.height(), bars = this.slider.image1.find('div.tile'); this.slider.image2.hide(); // Get notified when the last transition has completed bars.last().transitionEnd(function(event){ _this.slider.image1.css3({ 'transform-style': 'flat' }); _this.slider.image2.show(); _this.finished(); }); setTimeout(function(){ bars.css3({ 'transform': flux.browser.rotateX(-90) + ' ' + flux.browser.translate(0, height/2, height/2) }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.blinds = function(fluxslider, opts) { return new flux.transitions.bars(fluxslider, $.extend({ execute: function() { var _this = this; var height = this.slider.image1.height(); var bars = this.slider.image1.find('div.tile'); // Get notified when the last transition has completed $(bars[bars.length-1]).transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ bars.css({ 'opacity': '0.5' }).css3({ 'transform': 'scalex(0.0001)' }); }, 50); } }, opts)); } })(window.jQuery || window.Zepto); (function($) { flux.transitions.blinds3d = function(fluxslider, opts) { return new flux.transitions.tiles3d(fluxslider, $.extend({ forceSquare: false, rows: 1, columns: 6 }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.zip = function(fluxslider, opts) { return new flux.transitions.bars(fluxslider, $.extend({ execute: function() { var _this = this; var height = this.slider.image1.height(); var bars = this.slider.image1.find('div.tile'); // Get notified when the last transition has completed $(bars[bars.length-1]).transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ bars.each(function(index, bar){ $(bar).css({ 'opacity': '0.3' }).css3({ 'transform': flux.browser.translate(0, (index%2 ? '-'+(2*height) : height)) }); }); }, 20); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.blocks = function(fluxslider, opts) { return new flux.transition_grid(fluxslider, $.extend({ forceSquare: true, delayBetweenBars: 100, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { var delay = Math.floor(Math.random()*10*this.options.delayBetweenBars); $(elem).css({ 'background-image': this.slider.image1.css('background-image'), 'background-position': '-'+leftOffset+'px -'+topOffset+'px' }).css3({ 'transition-duration': '350ms', 'transition-timing-function': 'ease-in', 'transition-property': 'all', 'transition-delay': delay+'ms' }); // Keep track of the last elem to fire if(this.maxDelay === undefined) this.maxDelay = 0; if(delay > this.maxDelay) { this.maxDelay = delay; this.maxDelayTile = elem; } }, execute: function() { var _this = this; var blocks = this.slider.image1.find('div.tile'); // Get notified when the last transition has completed this.maxDelayTile.transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ blocks.each(function(index, block){ $(block).css({ 'opacity': '0' }).css3({ 'transform': 'scale(0.8)' }); }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.blocks2 = function(fluxslider, opts) { return new flux.transition_grid(fluxslider, $.extend({ cols: 12, forceSquare: true, delayBetweenDiagnols: 150, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { var delay = Math.floor(Math.random()*10*this.options.delayBetweenBars); $(elem).css({ 'background-image': this.slider.image1.css('background-image'), 'background-position': '-'+leftOffset+'px -'+topOffset+'px' }).css3({ 'transition-duration': '350ms', 'transition-timing-function': 'ease-in', 'transition-property': 'all', 'transition-delay': (colIndex+rowIndex)*this.options.delayBetweenDiagnols+'ms', 'backface-visibility': 'hidden' // trigger hardware acceleration }); }, execute: function() { var _this = this; var blocks = this.slider.image1.find('div.tile'); // Get notified when the last transition has completed blocks.last().transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ blocks.each(function(index, block){ $(block).css({ 'opacity': '0' }).css3({ 'transform': 'scale(0.8)' }); }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.concentric = function(fluxslider, opts) { return new flux.transition(fluxslider, $.extend({ blockSize: 60, delay: 150, alternate: false, setup: function() { var w = this.slider.image1.width(), h = this.slider.image1.height(), largestLength = Math.sqrt(w*w + h*h), // Largest length is the diagonal // How many blocks do we need? blockCount = Math.ceil(((largestLength-this.options.blockSize)/2) / this.options.blockSize) + 1, // 1 extra to account for the round border fragment = document.createDocumentFragment(); for(var i=0; i').attr('class', 'block block-'+i).css({ width: thisBlockSize+'px', height: thisBlockSize+'px', position: 'absolute', top: ((h-thisBlockSize)/2)+'px', left: ((w-thisBlockSize)/2)+'px', 'z-index': 100+(blockCount-i), 'background-image': this.slider.image1.css('background-image'), 'background-position': 'center center' }).css3({ 'border-radius': thisBlockSize+'px', 'transition-duration': '800ms', 'transition-timing-function': 'linear', 'transition-property': 'all', 'transition-delay': ((blockCount-i)*this.options.delay)+'ms' }); fragment.appendChild(block.get(0)); } //this.slider.image1.append($(fragment)); this.slider.image1.get(0).appendChild(fragment); }, execute: function() { var _this = this; var blocks = this.slider.image1.find('div.block'); // Get notified when the last transition has completed $(blocks[0]).transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ blocks.each(function(index, block){ $(block).css({ 'opacity': '0' }).css3({ 'transform': flux.browser.rotateZ((!_this.options.alternate || index%2 ? '' : '-')+'90') }); }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.warp = function(fluxslider, opts) { return new flux.transitions.concentric(fluxslider, $.extend({ delay: 30, alternate: true }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.cube = function(fluxslider, opts) { return new flux.transition(fluxslider, $.extend({ requires3d: true, barWidth: 100, direction: 'left', perspective: 1000, setup: function() { var width = this.slider.image1.width(); var height = this.slider.image1.height(); // Setup the container to allow 3D perspective this.slider.image1.css3({ 'perspective': this.options.perspective, 'perspective-origin': '50% 50%' }); this.cubeContainer = $('
    ').css({ width: width+'px', height: height+'px', position: 'relative' }).css3({ 'transition-duration': '800ms', 'transition-timing-function': 'linear', 'transition-property': 'all', 'transform-style': 'preserve-3d' }); var css = { height: '100%', width: '100%', position: 'absolute', top: '0px', left: '0px' }; var currentFace = $('
    ').css($.extend(css, { background: this.slider.image1.css('background-image') })).css3({ 'backface-visibility': 'hidden' }); this.cubeContainer.append(currentFace); var nextFace = $('').css($.extend(css, { background: this.slider.image2.css('background-image') })).css3({ 'transform' : this.options.transitionStrings.call(this, this.options.direction, 'nextFace'), 'backface-visibility': 'hidden' }); this.cubeContainer.append(nextFace); this.slider.image1.append(this.cubeContainer); }, execute: function() { var _this = this; var width = this.slider.image1.width(); var height = this.slider.image1.height(); this.slider.image2.hide(); this.cubeContainer.transitionEnd(function(){ _this.slider.image2.show(); _this.finished(); }); setTimeout(function(){ _this.cubeContainer.css3({ 'transform' : _this.options.transitionStrings.call(_this, _this.options.direction, 'container') }); }, 50); }, transitionStrings: function(direction, elem) { var width = this.slider.image1.width(); var height = this.slider.image1.height(); // Define the various transforms that are required to perform various cube rotations var t = { 'up' : { 'nextFace': flux.browser.rotateX(-90) + ' ' + flux.browser.translate(0, height/2, height/2), 'container': flux.browser.rotateX(90) + ' ' + flux.browser.translate(0, -height/2, height/2) }, 'down' : { 'nextFace': flux.browser.rotateX(90) + ' ' + flux.browser.translate(0, -height/2, height/2), 'container': flux.browser.rotateX(-90) + ' ' + flux.browser.translate(0, height/2, height/2) }, 'left' : { 'nextFace': flux.browser.rotateY(90) + ' ' + flux.browser.translate(width/2, 0, width/2), 'container': flux.browser.rotateY(-90) + ' ' + flux.browser.translate(-width/2, 0, width/2) }, 'right' : { 'nextFace': flux.browser.rotateY(-90) + ' ' + flux.browser.translate(-width/2, 0, width/2), 'container': flux.browser.rotateY(90) + ' ' + flux.browser.translate(width/2, 0, width/2) } }; return (t[direction] && t[direction][elem]) ? t[direction][elem] : false; } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.tiles3d = function(fluxslider, opts) { return new flux.transition_grid(fluxslider, $.extend({ requires3d: true, forceSquare: true, columns: 5, perspective: 600, delayBetweenBarsX: 200, delayBetweenBarsY: 150, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { var tile = $('
    ').css({ width: colWidth+'px', height: rowHeight+'px', position: 'absolute', top: '0px', left: '0px', //'z-index': 200, // Removed to make compatible with FF10 (Chrome bug seems to have been fixed) 'background-image': this.slider.image1.css('background-image'), 'background-position': '-'+leftOffset+'px -'+topOffset+'px', 'background-repeat': 'no-repeat', '-moz-transform': 'translateZ(1px)' }).css3({ 'backface-visibility': 'hidden' }); var tile2 = $(tile.get(0).cloneNode(false)).css({ 'background-image': this.slider.image2.css('background-image') //'z-index': 190 // Removed to make compatible with FF10 (Chrome bug seems to have been fixed) }).css3({ 'transform': flux.browser.rotateY(180), 'backface-visibility': 'hidden' }); $(elem).css({ 'z-index': (colIndex > this.options.columns/2 ? 500-colIndex : 500) + (rowIndex > this.options.rows/2 ? 500-rowIndex : 500) // Fix for Chrome to ensure that the z-index layering is correct! }).css3({ 'transition-duration': '800ms', 'transition-timing-function': 'ease-out', 'transition-property': 'all', 'transition-delay': (colIndex*this.options.delayBetweenBarsX+rowIndex*this.options.delayBetweenBarsY)+'ms', 'transform-style': 'preserve-3d' }).append(tile).append(tile2); }, execute: function() { this.slider.image1.css3({ 'perspective': this.options.perspective, 'perspective-origin': '50% 50%' }); var _this = this; var tiles = this.slider.image1.find('div.tile'); this.slider.image2.hide(); // Get notified when the last transition has completed tiles.last().transitionEnd(function(event){ _this.slider.image2.show(); _this.finished(); }); setTimeout(function(){ tiles.css3({ 'transform': flux.browser.rotateY(180) }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.turn = function(fluxslider, opts) { return new flux.transition(fluxslider, $.extend({ requires3d: true, perspective: 1300, direction: 'left', setup: function() { var tab = $('
    ').css({ width: '50%', height: '100%', position: 'absolute', top: '0px', left: this.options.direction == 'left' ? '50%' : '0%', 'z-index':101 }).css3({ 'transform-style': 'preserve-3d', 'transition-duration': '1000ms', 'transition-timing-function': 'ease-out', 'transition-property': 'all', 'transform-origin': this.options.direction == 'left' ? 'left center' : 'right center' }), front = $('
    ').appendTo(tab).css({ 'background-image': this.slider.image1.css('background-image'), 'background-position': (this.options.direction == 'left' ? '-'+(this.slider.image1.width()/2) : 0)+'px 0', width: '100%', height: '100%', position: 'absolute', top: '0', left: '0', '-moz-transform': 'translateZ(1px)' }).css3({ 'backface-visibility': 'hidden' }), back = $('
    ').appendTo(tab).css({ 'background-image': this.slider.image2.css('background-image'), 'background-position': (this.options.direction == 'left' ? 0 : '-'+(this.slider.image1.width()/2))+'px 0', width: '100%', height: '100%', position: 'absolute', top: '0', left: '0' }).css3({ transform: flux.browser.rotateY(180), 'backface-visibility': 'hidden' }), current = $('
    ').css({ position: 'absolute', top: '0', left: this.options.direction == 'left' ? '0' : '50%', width: '50%', height: '100%', 'background-image': this.slider.image1.css('background-image'), 'background-position': (this.options.direction == 'left' ? 0 : '-'+(this.slider.image1.width()/2))+'px 0', 'z-index':100 }), overlay = $('
    ').css({ position: 'absolute', top: '0', left: this.options.direction == 'left' ? '50%' : '0', width: '50%', height: '100%', background: '#000', opacity: 1 }).css3({ 'transition-duration': '800ms', 'transition-timing-function': 'linear', 'transition-property': 'opacity' }), container = $('
    ').css3({ width: '100%', height: '100%' }).css3({ 'perspective': this.options.perspective, 'perspective-origin': '50% 50%' }).append(tab).append(current).append(overlay); this.slider.image1.append(container); }, execute: function() { var _this = this; this.slider.image1.find('div.tab').first().transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ _this.slider.image1.find('div.tab').css3({ // 179 not 180 so that the tab rotates the correct way in Firefox transform: flux.browser.rotateY(_this.options.direction == 'left' ? -179 : 179) }); _this.slider.image1.find('div.overlay').css({ opacity: 0 }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.slide = function(fluxslider, opts) { return new flux.transition(fluxslider, $.extend({ direction: 'left', setup: function() { var width = this.slider.image1.width(), height = this.slider.image1.height(), currentImage = $('
    ').css({ height: height+'px', width: width+'px', position: 'absolute', top: '0px', left: '0px', background: this.slider[this.options.direction == 'left' ? 'image1' : 'image2'].css('background-image') }).css3({ 'backface-visibility': 'hidden' }), nextImage = $('').css({ height: height+'px', width: width+'px', position: 'absolute', top: '0px', left: width+'px', background: this.slider[this.options.direction == 'left' ? 'image2' : 'image1'].css('background-image') }).css3({ 'backface-visibility': 'hidden' }); this.slideContainer = $('
    ').css({ width: (2*width)+'px', height: height+'px', position: 'relative', left: this.options.direction == 'left' ? '0px' : -width+'px', 'z-index': 101 }).css3({ 'transition-duration': '600ms', 'transition-timing-function': 'ease-in', 'transition-property': 'all' }); this.slideContainer.append(currentImage).append(nextImage); this.slider.image1.append(this.slideContainer); }, execute: function() { var _this = this, delta = this.slider.image1.width(); if(this.options.direction == 'left') delta = -delta; this.slideContainer.transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ _this.slideContainer.css3({ 'transform' : flux.browser.translate(delta) }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.swipe = function(fluxslider, opts) { return new flux.transition(fluxslider, $.extend({ setup: function() { var img = $('
    ').css({ width: '100%', height: '100%', 'background-image': this.slider.image1.css('background-image') }).css3({ 'transition-duration': '1600ms', 'transition-timing-function': 'ease-in', 'transition-property': 'all', 'mask-image': '-webkit-linear-gradient(left, rgba(0,0,0,0) 0%, rgba(0,0,0,0) 48%, rgba(0,0,0,1) 52%, rgba(0,0,0,1) 100%)', 'mask-position': '70%', 'mask-size': '400%' }); this.slider.image1.append(img); }, execute: function() { //return; var _this = this, img = this.slider.image1.find('div'); // Get notified when the last transition has completed $(img).transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ $(img).css3({ 'mask-position': '30%' }); }, 50); }, compatibilityCheck: function() { return flux.browser.supportsCSSProperty('MaskImage'); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.dissolve = function(fluxslider, opts) { return new flux.transition(fluxslider, $.extend({ setup: function() { var img = $('
    ').css({ width: '100%', height: '100%', 'background-image': this.slider.image1.css('background-image') }).css3({ 'transition-duration': '600ms', 'transition-timing-function': 'ease-in', 'transition-property': 'opacity' }); this.slider.image1.append(img); }, execute: function() { var _this = this, img = this.slider.image1.find('div.image'); // Get notified when the last transition has completed $(img).transitionEnd(function(){ _this.finished(); }); setTimeout(function(){ $(img).css({ 'opacity': '0.0' }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto); (function($) { flux.transitions.explode = function(fluxslider, opts) { return new flux.transition_grid(fluxslider, $.extend({ columns: 6, forceSquare: true, delayBetweenBars: 30, perspective: 800, requires3d: true, renderTile: function(elem, colIndex, rowIndex, colWidth, rowHeight, leftOffset, topOffset) { var delay = Math.floor(Math.random()*10*this.options.delayBetweenBars); $(elem).css({ 'background-image': this.slider.image1.css('background-image'), 'background-position': '-'+leftOffset+'px -'+topOffset+'px' }).css3({ 'transition-duration': '500ms', 'transition-timing-function': 'ease-in', 'transition-property': 'all', 'transition-delay': delay+'ms' }); // Keep track of the last elem to fire if(this.maxDelay === undefined) this.maxDelay = 0; if(delay > this.maxDelay) { this.maxDelay = delay; this.maxDelayTile = elem; } }, execute: function() { this.slider.image1.css3({ 'perspective': this.options.perspective, 'perspective-origin': '50% 50%' }).css({ '-moz-transform': 'perspective('+this.options.perspective+'px)', '-moz-perspective': 'none', '-moz-transform-style': 'preserve-3d' }); var _this = this; var blocks = this.slider.image1.find('div.tile'); // Get notified when the last transition has completed this.maxDelayTile.transitionEnd(function(){ _this.slider.image1.css3({ 'transform-style': 'flat' }); _this.finished(); }); setTimeout(function(){ blocks.each(function(index, block){ $(block).css({ 'opacity': '0' }).css3({ 'transform': flux.browser.translate(0, 0, 700) + " rotate3d("+(Math.round(Math.random()*2)-1)+", "+(Math.round(Math.random()*2)-1)+", "+(Math.round(Math.random()*2)-1)+", 90deg) " }); }); }, 50); } }, opts)); }; })(window.jQuery || window.Zepto);