朋友圈常见单页面触屏滑动上下翻屏功能jQuery实现

翻页插件;实现原理,用margin-top来控制页面容器位置来实现上下翻页。margin这属性很好用,可以用来制作侧栏动画滑出菜单(左菜单,右内容,控制两者的margin实现);或者head下滑菜单
(上菜单,下内容,控制两者的margin实现)。

JS代码(jquery.showup.js):

/**
 * @Creator: Nelson Kuang/Fast Mover
 * @showup    翻页插件;实现原理,用margin-top来控制页面容器位置来实现上下翻页
 * @License:The MIT License (MIT)
 * @调用方式    
   $("#container").showup({
            startPage: 0,//开始页面
            duration:1000//动画持续时间    
   })
 * @Creator: Nelson Kuang/Fast Mover
 * @wipe 触屏滑动绑定触发事件
 * @License:The MIT License (MIT)
 * @调用方式
   $("#node").wipe({
            upEvent: function(){},//划上事件
            downEvent: function(){},//划下事件
            rightEvent:function(){},//划右事件
            leftEvent:function(){},//划左事件
            delay: 500 //事件延时多久执行
});
 */
$.fn.extend({
wipe: function (options) {
    var defaults = {//wipe的默认参数配置
        leftEvent: '',
        rightEvent: '',
        upEvent: '',
        downEvent: '',
        delay: 500
    };
    var options = $.extend({}, defaults, options);//传入参数与默认参数合并
    var line = {//定义滑动线的起点与终点
        startX: 0, startY: 0,
        endX: 0, endY: 0
    },
    results = {//定义滑动,左,右,上,下,或者任意
        up: false,
        down: false,
        left: false,
        right: false,
        any: function () { return results.up || results.down || results.left || results.right; }
    },
    useMouseEvents = false,//鼠标滑动模式
    timer,//绑定的事件延时执行的计时器
    startTime = false,//滑动开始时间
    endTime = false,//滑动结束时间
    _this = $(this);

    function onTouchStart(e) {
        e.preventDefault();//可选项,阻止事件冒泡
        startTime = new Date().getTime();
        //起点赋值
        line.startX = useMouseEvents ? e.pageX : e.originalEvent.touches[0].pageX;//起点赋值
        line.startY = useMouseEvents ? e.pageY : e.originalEvent.touches[0].pageY;
        _this.on("mousemove", onTouchMove);//绑定鼠标按下并滑动事件并监听滑动位置
        _this.one("mouseup", onTouchEnd);//绑定一次鼠标放开的事件,也即结束滑动事件
        _this.on("touchmove", onTouchMove);//绑定移动设备的触屏滑动事件并监听滑动位置
    }
    function onTouchMove(e) {//绑定鼠标或者移动设备的滑动事件并监听滑动位置
        line.endX = useMouseEvents ? e.pageX : e.originalEvent.touches[0].pageX;
        line.endY = useMouseEvents ? e.pageY : e.originalEvent.touches[0].pageY;
    }
    function onTouchEnd(e) {//滑动结束事件
        e.preventDefault();//可选项,阻止事件冒泡
        _this.off("mousemove", onTouchMove);//解除鼠标滑动事件绑定
        _this.off("touchmove", onTouchMove);//解除移动设备的触屏滑动事件绑定
        endTime = new Date().getTime();
        //特殊情况当点击处理并触发点击事件,退出;1,时间太短小于100ms;2滑动距离小于15;3,点击
        if (endTime - startTime < 100 || (Math.abs(line.endX - line.startX) < 15 && Math.abs(line.endY - line.startY) < 15) || (line.endX == 0 && line.endY == 0)) {
            resetTouch();//重设参数
            _this.trigger("click");
            return;
        }
        if (line.endX > line.startX) {//向右滑动
            results.left = false;
            results.right = true;
        }
        else if (line.endX > line.startX) {//向左滑动
            results.left = true;
            results.right = false;
        }
        if (line.endY < line.startY) {//向上滑动
            results.down = false;
            results.up = true;
        }
        else if (line.endY > line.startY) {//向下滑动
            results.down = true;
            results.up = false;
        }
        clearTimeout(timer);
        timer = setTimeout(function () {//根据滑动方向及相应的传入的函数执行相应的事件
            if (results.left && typeof (options.leftEvent) == 'function')
                options.leftEvent();
            if (results.right && typeof (options.rightEvent) == 'function')
                options.rightEvent();
            if (results.up && typeof (options.upEvent) == 'function')
                options.upEvent();
            if (results.down && typeof (options.downEvent) == 'function')
                options.downEvent();
            resetTouch();
        }, options.delay);

    }
    function resetTouch() {//重设参数
        line.startX = line.startY = line.endX = line.endY = 0;
        results.left = results.down = results.up = results.right = false;

    }
    //函数入口处
    if ("ontouchstart" in document.documentElement) {//移动设备入口
        _this.on("touchstart", onTouchStart);
        _this.on("touchend", onTouchEnd);
    }
    else {//电脑鼠标操作
        useMouseEvents = true;
        _this.on("mousedown", onTouchStart);
        _this.on("mouseout", onTouchEnd);
    }
},
showup: function (options) {
    var defaults = {//showup的默认参数配置
        startPage: 0,//开始打开的页码数
        duration: 1000//动画持续时间
    };
    var options = $.extend({}, defaults, options);//传入参数与默认参数合并

    this.each(function () {
        var _this = $(this);
        var pageWidth = _this.width(),//页面宽度
            pageHeight = _this.height(),//页面高度
            pageNumber = _this.children().children().length;//页面数
        if (pageNumber < 2) { return; }//如果是0或者1页,直接退出
        if (options.startPage > pageNumber - 1) { options.startPage = 0; }//如果传入参数超过页面总数则从0开始
        var totalHeight = pageHeight * pageNumber;//所有页面加起来总高度
        var endPage = pageNumber - 1,//结束页面
            firstPage = 0,//第一页页码为0
            lastPage = pageNumber - 1,//最后一页页码
            currentPage = options.startPage;//把开始页设为当前页
        var _wrapper = _this.children();//获取容器
        if (currentPage > 0)//初始化时打开当前页
            gotoPage(currentPage);
        _this.children().children().each(function (n) {
            var _page = $(this);
            if (n == options.startPage) {
                //页码为开始页时,只需绑定向上翻页事件(控制margin-top使整个wrapper向上移动)
                _page.wipe({
                    upEvent: pageUp
                });
            }
            else if (n == lastPage) {
                //页码为最后一页时,只需绑定向下翻页事件(控制margin-top使整个wrapper向下移动)
                _page.wipe({
                    downEvent: pageDown
                });
            }
            else {
                //其他情况,绑定向上和向下翻页事件
                _page.wipe({
                    upEvent: pageUp,
                    downEvent: pageDown
                });
            }

        });
        function gotoPage(n) {//打开第n页
            var margin_top = -(n * pageHeight);
            _wrapper.css("marginTop", margin_top + "px");
            currentPage = n;
        }
        function pageDown() {//向下翻页
            var margin_top = -(currentPage * pageHeight);
            _wrapper.stop(true, true).animate({ marginTop: (margin_top + pageHeight) + "px" }, {
                duration: options.duration
            });
            currentPage--;
        }
        function pageUp() {//向上翻页
            var margin_top = -(currentPage * pageHeight);
            _wrapper.stop(true, true).animate({ marginTop: (margin_top - pageHeight) + "px" }, {
                duration: options.duration
            });
            currentPage++;
        }

    });
}
});

Html代码(demo.html)

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" />
    <title></title>
    <style>
        body, html {
            background-color: black;
            width: 100%;
            height: 100%;
            padding: 0px;
            margin: 0px;
            border: none;
        }

        #container {
            width: 100%;
            height: 100%;
            overflow: hidden;
        }

        #wrapper {
            width: 100%;
            height: 100%;
            overflow: visible;
        }

        .screen {
            width: 100%;
            height: 100%;
        }

        .first-screen {
            background-color: purple;
        }

        .second-screen {
            background-color: silver;
        }

        .third-screen {
            background-color: gray;
        }

        .fourth-screen {
            background-color: green;
        }

        .fifth-screen {
            background-color: yellow;
        }

        .sixth-screen {
            background-color: orange;
        }

        .seventh-screen {
            background-color: brown;
        }

        #btn-wrapper {
            position: fixed;
            left: 0px;
            bottom: 30px;
            width: 100%;
        }

        .btn-up {
            width: 20px;
            height: 80px;
            margin: 0px auto;
            background-color: white;
        }
    </style>
</head>
<body>
    <div id="container">
        <div id="wrapper">
            <div class="screen first-screen">
            </div>
            <!--Second session--->
            <div class="screen second-screen">
            </div>
            <!--Third session--->
            <div class="screen third-screen">
            </div>
            <!--Fourth session--->
            <div class="screen fourth-screen">
            </div>
            <!--Fifth session--->
            <div class="screen fifth-screen">
            </div>
            <!--Sixth session--->
            <div class="screen sixth-screen">
            </div>
            <!--Seventh session--->
            <div class="screen seventh-screen">
            </div>
        </div>
    </div>
    <div id="btn-wrapper">
        <div class="btn-up"></div>
    </div>
    <script src="jquery.js"></script>
    <script src="jquery.showup.js"></script>
    <script>
        $(document).ready(function () {
            $("#container").showup({
                startPage: 2,
                duration: 500
            });
        });
    </script>
</body>
</html>
posted @ 2015-03-10 22:07  Fast Mover  阅读(2097)  评论(5编辑  收藏  举报
友情链接: A4纸尺寸 | 卡通头像 | +申请友情链接