来源 http://www.imooc.com/learn/374
pageswitch.js
(function ($) { var defaults = { 'container': '#container', //容器 'sections': '.section', //子容器 'easing': 'ease', //特效方式,ease-in,ease-out,linear 'duration': 1000, //每次动画执行的时间 'pagination': true, //是否显示分页 'loop': true, //是否循环 'keyboard': true, //是否支持键盘 'direction': 'vertical', //滑动的方向 horizontal,vertical, 'onpageSwitch': function (pagenum) { } }; var win = $(window), container, sections; var opts = {}, canScroll = true; var iIndex = 0; var arrElement = []; var SP = $.fn.switchPage = function (options) { opts = $.extend({}, defaults, options || {}); container = $(opts.container), sections = container.find(opts.sections); sections.each(function () { arrElement.push($(this)); }); return this.each(function () { if (opts.direction == "horizontal") { initLayout(); } if (opts.pagination) { initPagination(); } if (opts.keyboard) { keyDown(); } }); } //滚轮向上滑动事件 SP.moveSectionUp = function () { if (iIndex) { iIndex--; } else if (opts.loop) { iIndex = arrElement.length - 1; } scrollPage(arrElement[iIndex]); }; //滚轮向下滑动事件 SP.moveSectionDown = function () { if (iIndex < (arrElement.length - 1)) { iIndex++; } else if (opts.loop) { iIndex = 0; } scrollPage(arrElement[iIndex]); }; //私有方法 //页面滚动事件 function scrollPage(element) { var dest = element.position(); if (typeof dest === 'undefined') { return; } initEffects(dest, element); } //重写鼠标滑动事件 $(document).on("mousewheel DOMMouseScroll", MouseWheelHandler); function MouseWheelHandler(e) { e.preventDefault(); var value = e.originalEvent.wheelDelta || -e.originalEvent.detail; var delta = Math.max(-1, Math.min(1, value)); if (canScroll) { if (delta < 0) { SP.moveSectionDown(); } else { SP.moveSectionUp(); } } return false; } //横向布局初始化 function initLayout() { var length = sections.length, width = (length * 100) + "%", cellWidth = (100 / length).toFixed(2) + "%"; container.width(width).addClass("left"); sections.width(cellWidth).addClass("left"); } //初始化分页 function initPagination() { var length = sections.length; if (length) { } var pageHtml = '<ul id="pages"><li class="active"></li>'; for (var i = 1; i < length; i++) { pageHtml += '<li></li>'; } pageHtml += '</ul>'; $("body").append(pageHtml); } //分页事件 function paginationHandler() { var pages = $("#pages li"); pages.eq(iIndex).addClass("active").siblings().removeClass("active"); } //是否支持css的某个属性 function isSuportCss(property) { var body = $("body")[0]; for (var i = 0; i < property.length; i++) { if (property[i] in body.style) { return true; } } return false; } //渲染效果 function initEffects(dest, element) { var transform = ["-webkit-transform", "-ms-transform", "-moz-transform", "transform"], transition = ["-webkit-transition", "-ms-transition", "-moz-transition", "transition"]; canScroll = false; if (isSuportCss(transform) && isSuportCss(transition)) { var traslate = ""; if (opts.direction == "horizontal") { traslate = "-" + dest.left + "px, 0px, 0px"; } else { traslate = "0px, -" + dest.top + "px, 0px"; } container.css({ "transition": "all " + opts.duration + "ms " + opts.easing, "transform": "translate3d(" + traslate + ")" }); container.on("webkitTransitionEnd msTransitionend mozTransitionend transitionend", function () { canScroll = true; }); } else { var cssObj = (opts.direction == "horizontal") ? { left: -dest.left} : { top: -dest.top }; container.animate(cssObj, opts.duration, function () { canScroll = true; }); } element.addClass("active").siblings().removeClass("active"); if (opts.pagination) { paginationHandler(); } } //窗口Resize var resizeId; win.resize(function () { clearTimeout(resizeId); resizeId = setTimeout(function () { reBuild(); }, 500); }); function reBuild() { var currentHeight = win.height(), currentWidth = win.width(); var element = arrElement[iIndex]; if (opts.direction == "horizontal") { var offsetLeft = element.offset().left; if (Math.abs(offsetLeft) > currentWidth / 2 && iIndex < (arrElement.length - 1)) { iIndex++; } } else { var offsetTop = element.offset().top; if (Math.abs(offsetTop) > currentHeight / 2 && iIndex < (arrElement.length - 1)) { iIndex++; } } if (iIndex) { paginationHandler(); var cuerrentElement = arrElement[iIndex], dest = cuerrentElement.position(); initEffects(dest, cuerrentElement); } } //绑定键盘事件 function keyDown() { var keydownId; win.keydown(function (e) { clearTimeout(keydownId); keydownId = setTimeout(function () { var keyCode = e.keyCode; if (keyCode == 37 || keyCode == 38) { SP.moveSectionUp(); } else if (keyCode == 39 || keyCode == 40) { SP.moveSectionDown(); } }, 150); }); } })(jQuery);
demo.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>页面切换</title> <script type="text/javascript" src="jquery-1.11.2.min.js"></script> <script type="text/javascript" src="pageswitch.js"></script> <script type="text/javascript"> $(function () { $("#container").switchPage({ }); }); </script> <style type="text/css"> h1, body, html { padding: 0; margin: 0; } body { font-family: Arial, "Microsoft YaHei" , "Hiragino Sans GB" ,sans-serif; } html, body { height: 100%; overflow: hidden; } #container, .section { height: 100%; position: relative; } div.section { background-color: #000; background-size: cover; background-position: 50% 50%; } #section0 { background-image: url(images/1.jpg); } #section1 { background-image: url(images/2.jpg); } #section2 { background-image: url(images/3.jpg); } #section3 { background-image: url(images/7.jpg); } #section4 { background-image: url(images/5.jpg); } #section5 { background-image: url(images/6.jpg); } #section6 { background-image: url(images/4.jpg); } .left { float: left; } #pages { position: fixed; right: 10px; top: 50%; list-style: none; } #pages li { width: 8px; height: 8px; border-radius: 50%; background: #fff; margin: 0 0 10px 5px; } #pages li.active { width: 14px; height: 14px; border: 2px solid #FFFE00; background: none; margin-left: 0; } </style> </head> <body> <div id="container"> <div class="section active" id="section0"> </div> <div class="section" id="section1"> </div> <div class="section" id="section2"> </div> <div class="section" id="section3"> </div> <div class="section" id="section4"> </div> <div class="section" id="section5"> </div> <div class="section" id="section6"> </div> </div> </body> </html>