/** * Coder: EzrealY * Time: 2017.07.31 * Mail: 1005526074@qq.com * 效果原作者: https://oss.so/article/71 */ ;(function ($, window, document, undefined) { var Shutter = function (elem, options) { this.defaults = { shutterW: 1200, shutterH: 500, isAutoPlay: false, playInterval: 3000, curDisplay: 0, fullPage: false }; this.opts = $.extend({}, this.defaults, options); this.inital(elem); }; Shutter.prototype = { play: function () { var self = this; if (this.opts.isAutoPlay) { clearInterval(this.playTime); this.playTime = setInterval(function () { self.$nextBtn.click(); }, this.opts.playInterval); } }, moveSwitch: function (randomNum, command, index) { switch (randomNum) { case 0: this.gridWhole(index, 0); break; case 1: this.gridWhole(index, 1); break; case 2: this.gridWhole(index, 2); break; case 3: this.gridWhole(index, 3); break; case 4: this.gridTop(index, 0); break; case 5: this.gridTop(index, 1); break; case 6: this.gridTop(index, 2); break; case 7: this.gridLeft(index, 0); break; case 8: this.gridLeft(index, 1); break; case 9: this.gridLeft(index, 2); break; case 10: this.gridOpacity(index); break; case 11: this.gridAccordion(index); break; case 12: this.gridLittle(index); break; case 13: this.gridSwitch(index); break; default: this.gridTop(index, 0); break; } }, toggleMove: function (command, index) { if (!command) { if (this.curDisplay === index) { return; } else if (this.curDisplay === 0 && index === this.shutterItem_len - 1 || index < this.curDisplay) { command = 'prev'; } else { command = 'next'; } } if (!index) { if (command === 'prev') { index = this.curDisplay - 1; if (this.curDisplay === 0) { index = this.shutterItem_len - 1; } } else { index = this.curDisplay + 1; if (this.curDisplay === this.shutterItem_len - 1) { index = 0; } } } this.$shutterDesc.animate({bottom: -36}); var random = function (min, max) { return Math.floor(Math.random() * (max + 1) - min); }; this.moveSwitch(random(0, 13), command, index); this.shutterTitle = this.$shutterItem.eq(index).attr('data-shutter-title'); }, initalShutter: function () { var $curElem = this.$shutterItem.eq(this.curDisplay); var $nearlyElem = this.$shutterItem.not($curElem); $curElem.css('zIndex', 20); $nearlyElem.each(function (i) { $(this).css('zIndex', ++ i); }); this.$shutter.css({width: this.opts.shutterW, height: this.opts.shutterH}); if (this.opts.fullPage) { this.$shutter.css({ width: $(window).width(), height: $(window).height(), margin: 0, borderRadius: 0, border: 'none' }); } }, inital: function (elem) { var self = this; this.$shutter = elem; this.$shutterItem = this.$shutter.find('.shutter-img a'); this.$prevBtn = this.$shutter.find('.shutter-btn .prev'); this.$nextBtn = this.$shutter.find('.shutter-btn .next'); this.$shutterNav = this.$shutter.find('.shutter-nav li'); this.$shutterDesc = this.$shutter.find('.shutter-desc'); this.shutterItem_len = this.$shutterItem.length; this.curDisplay = this.opts.curDisplay > this.shutterItem_len - 1 ? this.opts.curDisplay = this.shutterItem_len - 1 : this.opts.curDisplay; this.b_stop = true; this.shutterTitle = ''; this.playTime = null; this.initalShutter(); this.shutterW = this.$shutter.width(); this.shutterH = this.$shutter.height(); this.$prevBtn.bind('click', function () { if (self.b_stop) { self.b_stop = false; self.toggleMove('prev'); } }); this.$nextBtn.bind('click', function () { if (self.b_stop) { self.b_stop = false; self.toggleMove('next'); self.$shutterDesc.animate({bottom: -36}); } }); if (this.opts.fullPage) { $(window).resize(function () { setTimeout(function () { self.$shutter.css({width: $(this).width(), height: $(this).height()}); self.shutterW = self.$shutter.width(); self.shutterH = self.$shutter.height(); }, 30); }); } this.play(); this.$shutter.hover(function () { clearInterval(self.playTime); }, function () { self.play(); }); }, // 图片切换方法 recovery: function (target, cur, index, backup, interval) { var self = this; setTimeout(function () { target.css('zIndex', 20); cur.css('zIndex', self.curDisplay).html(backup); self.curDisplay = index; self.$shutterDesc.animate({bottom: 0}).find('p').text(self.shutterTitle); self.b_stop = true; }, interval); }, gridWhole: function (index, showNum) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); var $createElem = $('
'); var movingVal = 0; $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); $createElem.html(backup).css({ position: 'absolute', zIndex: 20, left: 0, top: 0, overflow: 'hidden', width: this.shutterW, height: this.shutterH }); $curElem.append($createElem); if (showNum === 0) { movingVal = this.shutterW; $createElem.velocity({left: movingVal}, {duration: 1000}); } else if (showNum === 1) { movingVal = -this.shutterW; $createElem.velocity({left: movingVal}, {duration: 1000}); } else if (showNum === 2) { movingVal = this.shutterH; $createElem.velocity({top: movingVal}, {duration: 1000}); } else if (showNum === 3) { movingVal = -this.shutterH; $createElem.velocity({top: movingVal}, {duration: 1000}); } $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH }); this.recovery($targetElem, $curElem, index, backup, 1200); }, gridTop: function (index, showNum) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); var speed = 0; $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); for (var i = 0; i < 12; i ++) { var $createElem = $('
'); $createElem.html(backup).css({ position: 'absolute', zIndex: 20, left: this.shutterW / 12 * i, top: 0, overflow: 'hidden', width: this.shutterW / 12, height: this.shutterH }); $curElem.append($createElem); $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH, marginLeft: this.shutterW / -12 * i }); } if (showNum === 0) { var movingVal = 0; $curElem.find('.created').each(function (i) { if (i % 2 === 0) { movingVal = self.shutterH; } else { movingVal = -self.shutterH; } $(this).velocity({top: movingVal}, {duration: 1000}); }); } else if (showNum === 1) { $curElem.find('.created').each(function (i) { speed = 80 * i; $(this).velocity({top: $(this).height()}, {duration: 120 + speed}); }); } else if (showNum === 2) { $curElem.find('.created').each(function (i) { speed = 80 * i; $(this).velocity({top: -$(this).height()}, {duration: 120 + speed}); }); } this.recovery($targetElem, $curElem, index, backup, 1000); }, gridLeft: function (index, showNum) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); var speed = 0; $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); for (var i = 0; i < 12; i ++) { var $createElem = $('
'); $createElem.html(backup).css({ position: 'absolute', zIndex: 20, left: 0, top: this.shutterH / 12 * i, overflow: 'hidden', width: this.shutterW, height: this.shutterH / 12 }); $curElem.append($createElem); $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH, marginTop: this.shutterH / -12 * i }); } if (showNum === 0) { var movingVal = 0; $curElem.find('.created').each(function (i) { if (i % 2 === 0) { movingVal = self.shutterW; } else { movingVal = -self.shutterW; } $(this).velocity({left: movingVal}, {duration: 1000}); }); } else if (showNum === 1) { $curElem.find('.created').each(function (i) { speed = 80 * i; $(this).velocity({left: $(this).width()}, {duration: 120 + speed}); }); } else if (showNum === 2) { $curElem.find('.created').each(function (i) { speed = 80 * i; $(this).velocity({left: -$(this).width()}, {duration: 120 + speed}); }); } this.recovery($targetElem, $curElem, index, backup, 1000); }, gridOpacity: function (index) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); var $createElem = $('
'); $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); $createElem.html(backup).css({ position: 'absolute', zIndex: 20, left: 0, top: 0, overflow: 'hidden', width: this.shutterW, height: this.shutterH, opacity: 1 }); $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH }); $curElem.append($createElem); $createElem.velocity({opacity: 0}, {duration: 1000}); this.recovery($targetElem, $curElem, index, backup, 1000); }, gridAccordion: function (index) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); var iNow = 0; var speed = 0; $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); for (var i = 0; i < 12; i ++) { var $createElem = $('
'); $createElem.html(backup).css({ position: 'absolute', zIndex: 20, left: this.shutterW / 12 * i, top: 0, overflow: 'hidden', width: this.shutterW / 12, height: this.shutterH, opacity: 1 }); $curElem.append($createElem); $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH, marginLeft: this.shutterW / -12 * i }); } $curElem.find('.created').each(function (i) { speed = i * 80; $(this).velocity({opacity: 0}, {duration: 320 + speed}); }); this.recovery($targetElem, $curElem, index, backup, 1200); }, gridLittle: function (index) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); var coordinate = null; $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); for (var i = 0; i < 24; i ++) { var $createElem = $('
'); $createElem.html(backup).css({ width: this.shutterW / 6, height: this.shutterH / 4, left: (this.shutterW / 6) * (i % 6), top: (this.shutterH / 4) * Math.floor(i / 6) }); $curElem.append($createElem); $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH, marginLeft: -(this.shutterW / 6) * (i % 6), marginTop: -(this.shutterH / 4) * Math.floor(i / 6) }); } coordinate = getXY($curElem.find('.created'), 4, 6); tab(coordinate, 0, 0, function () { var left = parseInt(this.style.left); var top = parseInt(this.style.top); $(this).velocity({ left: left + 100, top: top + 100, opacity: 0 }); }, 100, +1, +1); this.recovery($targetElem, $curElem, index, backup, 1200); }, gridSwitch: function (index) { var self = this; var $curElem = this.$shutterItem.eq(this.curDisplay); var $targetElem = this.$shutterItem.eq(index); var backup = $curElem.html(); $targetElem.css('zIndex', 19); $curElem.find('img').fadeOut(); for (var i = 0; i < 20; i ++) { var $createElem = $('
'); $createElem.html(backup).css({ width: this.shutterW / 5, height: this.shutterH / 4, left: (this.shutterW / 5) * (i % 5), top: (this.shutterH / 4) * Math.floor(i / 5) }); $curElem.append($createElem); $createElem.find('img').css({ display: 'block', width: this.shutterW, height: this.shutterH, marginLeft: -(this.shutterW / 5) * (i % 5), marginTop: -(this.shutterH / 4) * Math.floor(i / 5) }); } $curElem.find('.created').each(function (i) { if (i % 2 === 0) { $(this).find('img').velocity({ marginLeft: $(this).width() }, {duration: 500}); } }); setTimeout(function () { $curElem.find('.created').each(function (i) { if (i % 1 === 0) { $(this).find('img').velocity({ marginLeft: $(this).width() }, {duration: 500}); } }); }, 600); this.recovery($targetElem, $curElem, index, backup, 1200); }, constructor: Shutter }; $.fn.shutter = function (options) { this.each(function () { var shutter = new Shutter($(this), options); }); }; })(jQuery, window, document); function tab(arr, x, y, fn, delay, speedX, speedY) { if (!arr[y] || !arr[y][x]) { return; } if (fn) { fn.call(arr[y][x]); clearTimeout(arr[y][x].timer); arr[y][x].timer = setTimeout(function () { tab(arr, x, y + speedY, fn, delay, speedX, speedY); tab(arr, x + speedX, y, fn, delay, speedX, speedY); }, delay); } }; function getXY(objs, rows, cols) { var arr1 = []; for (var i = 0; i < rows; i ++) { var arr2 = []; for (var j = 0; j < cols; j ++) { objs[i * cols + j].xIndex = j; objs[i * cols + j].yIndex = i; arr2.push(objs[i * cols + j]); } arr1.push(arr2); } return arr1; };