来源 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>

  

 

posted on 2015-07-03 15:26  QZB  阅读(636)  评论(0编辑  收藏  举报