微信翻页效果

今天闲得蛋疼,重构了之前写的微信翻页效果。

先上地址,觉得可以给颗星星,觉得有问题请大力吐槽。

github:https://github.com/skyweaver213/slide

3个demo地址:
http://skyweaver213.github.io/slide/widget/slide1/slide.html
http://skyweaver213.github.io/slide/widget/slide2/slide.html
http://skyweaver213.github.io/slide/widget/slide3/slide.html

下面说的东西没啥深度,高手到这里止步哈。  if(codeMaster) return;

然后说说我重构的思路,每次说到重构2字我都手心冒汗,我写的破东西也敢称得上重构?勉强说,再改了一下。

我一开始封装的方法很挫的,就是随便传几个参数

/*
 param1 滑动页面的class或者 id  -------------  (必传)
 param2 一共几个滑动的页面      -------------  (必传)
 param3 吸附翻页的范围      -------------  (不必传)
 param4 滑动页面委托事件的父节点,不传默认是document
 */
function slide(slide_page_dom, page_count, slide_range, parent_wrap) {
    //code
}

这样我觉得有一点很不好的地方,就是别人一定要记住参数的顺序,还有是否必传 ,还有如果后续参数扩展更多的话,还可能需要判断参数的类型再作操作,例如添加一个callback函数,还要先检查一下是不是函数才能执行。
还有如果touchstart、touchmove和touchend同时都用callback的时候,就乱得一团糟了。

所以今天我把所有参数都当作一个对象,然后跟他们分别指定特定的名字。
例如:

/**
 * Created by huangjianhua on 14-12-20.
 */
/*
 param1 所有用到参数的obj {
     slide_page_wrap          //滑动区域的class或者 id,            必传
     slide_page_dom          //滑动页面的class或者 id,             必传
     page_count              //一共滑动的页面的总个数               不必传(不传默认是page_dom.length)
     slide_range             //触发翻页效果移动的步长               不必传
 }
 startCallback: function,     //touchStart的回调函数                 不必传
 moveCallback: function,      //touchmove的回调函数                  不必传
 endCallback: function        //touchend的回调函数                   不必传
 */
function slide(options) {

    //默认的值
    var defaultObj = {
        cur_page: 0,
        slide_range: 130,
        parent_wrap: document
    };

    //自定义的参数
    $.extend(defaultObj, options);

    //滑动区域的class或id
    var slide_page_wrap = defaultObj.slide_page_wrap;
    //滑动页面的class或id
    var slide_page_dom= defaultObj.slide_page_dom;
    var $slide_page =  $(slide_page_dom);

    //当前滑动的页码,从0开始算
    var cur_page= 0;
    //保存touchstart的事件对象
    var touchFirst_obj;
    //保存touchend的事件对象
    var touchLast_obj;
    //touch事件移动的Y轴距里
    var moveY;
    //touchstart开始时translateY的坐标点
    var startTranslateY;
    //touchmove时translateY的坐标点
    var currentTranslateY;
    //当touchmove大于设置的slide_range触发翻页
    var slide_range = +defaultObj.slide_range;
    //一共滑动总页数
    var page_count = defaultObj.page_count || $slide_page.length;
    //总滑动页面的包裹器
    var parent_wrap = defaultObj.parent_wrap;

    //兼容不支持calc的浏览器
    $slide_page.css(‘height‘, (100 / page_count) + ‘%‘);

    //滑动页面的事件绑定
    $(parent_wrap).on(‘touchstart‘, slide_page_wrap, function (e) {
        //禁止浏览器默认事件
        e.preventDefault();

        //防止事件冒泡
        e.stopPropagation();

        touchFirst_obj = {
            startY : e.touches[0].clientY
        };

        //移除transition的过渡效果
        $(this).removeClass(‘transition_fast‘);

        //取translateY的值
        var transfrom_info = window.getComputedStyle(e.currentTarget, null).getPropertyValue("-webkit-transform").match(/matrix\((\d+,\s?){1,5}(\-?\d+)/);
        startTranslateY = transfrom_info && transfrom_info[2] || 0;

        $(this).css(‘-webkit-transform‘, ‘translateY(‘+ startTranslateY +‘px) translateZ(0)‘);
//        console.log(startTranslateY , ‘startY‘,window.getComputedStyle(e.currentTarget, null).getPropertyValue("-webkit-transform"));

        //touchstart的回调函数
        defaultObj.startCallback && defaultObj.startCallback($(this));

    }).on(‘touchmove‘, slide_page_wrap, function (e) {
        e.preventDefault();
        e.stopPropagation();

        touchLast_obj = e.touches[0];

        //计算滑动的移动距里
        moveY = touchLast_obj.clientY - touchFirst_obj.startY;
        currentTranslateY = +startTranslateY + +moveY;

        //第一张往上、和最后一张往下 return;
        if((startTranslateY ==0 && moveY > 0) || (startTranslateY == -window.innerHeight * (page_count-1) &&  moveY < 0)) {
            return;
        }
        $(this).css(‘-webkit-transform‘, ‘translateY(‘+ currentTranslateY +‘px) translateZ(0)‘);

        //touchmove的回调函数
        defaultObj.moveCallback && defaultObj.moveCallback($(this));

    }).on(‘touchend‘, slide_page_wrap, function (e) {
        //添加过渡效果的class
        $(this).addClass(‘transition_fast‘);

        //上 或 下
        if(moveY > slide_range) {
            //第一页的话 不作处理
            if(cur_page == 0) return;
            cur_page--;
        } else if(moveY < -slide_range) {
            //最后一页的话 return
            if(cur_page == +page_count-1) return;
            cur_page++;
        }

        $(this).css(‘-webkit-transform‘, ‘translateY(‘+ (-100 * (+cur_page)/page_count) +‘%) translateZ(0)‘);

        //touchend的回调函数
        defaultObj.endCallback && defaultObj.endCallback($(this));
    });
}

这里我是先区分哪些是默认值,然后那些是自定义的参数。代码如下,自定义的参数可以覆盖默认的参数。

//默认的值
    var defaultObj = {
        cur_page: 0,
        slide_range: 130,
        parent_wrap: document
    };

    //自定义的参数
    $.extend(defaultObj, options);

好,代码就上面几行,这么聪明的你肯定一眼就能看懂。  我写的东西木啥深度,先这样吧 ,哈哈。

  

时间: 2024-10-05 23:58:07

微信翻页效果的相关文章

微信里经常看到的滑动翻页效果,slide

上个星期我们的产品姐姐让我帮她写个微信里经常看到的滑动翻页效果,今天抽空写了3个小demo(只写了webkit需要chrome模拟手机看 开启touch事件), 故此写个随笔. 1.demo1,整个大容器tranlateY(性能应该是最好的,但是如果增删一页的话对css影响很大,如果用sass或less除外) html: <!DOCTYPE html> <html> <head> <title></title> <meta name=&qu

android开发教程:android手势翻页效果

听麦子学院android开发老师说要实现手势翻页效果,主要用到ViewFlipper和GestureDetector.  ViewFlipper变化当前显示内容,GestureDetector监听手势.  用于多页的展示非常酷.  现在我就给大家简单说明下,  首先创建工程:TestFlip,创建主Activity:TestFlip.  在res/layout/main.xml中添加flipper信息,如下:  Java代码   1. <?xml version="1.0" en

turn.js 图书翻页效果

今天用turn.js 做图书的翻页效果遇到问题: 图片路径总是出错 调了一天,总算调出来了 我用的thinkphp,其他的不知道是不是一样 两个地方要改动: 1.后台查出地址 注意的地方:1.地址要完全的 2.js要用json格式的数据 $more = M('File')->where(array('id'=>$id))->find(); $more1 = json_decode($more['more'],true); foreach($more1 as $k => $v){ /

CSS3-----图片翻页效果的展示

在开发一个网站的过程中各种翻页效果数不胜数,在这里我将介绍一下简单的一种方法就是使用css3的旋转即可实现这种常见的效果: 显示效果如下: 首先是页面的布局,不用那么复杂; a标签的href属性,一般指向一个URL地址,也可以调用javascript,如href="javascript:xxx();",但是文档中推荐这样写<a href="http://www.111cn.net/zhongxing/U880/ javascript:void(0)" oncl

子数涵数&#183;PS ——翻页效果

一.首先在网络上下载一张图片,作为素材.这是我下载的素材,至于为什么选择这张照片呢,当然不是因为自己的一些羞羞的念头啦. 二.打开Photoshop,我使用的版本是CS3(因为CS3所占的磁盘空间较小,CS4与其就有天壤之别) 三.进入PS之后,打开之前下载好的素材,图如下: 四.复制一个图层,快捷键为Ctrl+J(在每次P图之前复制一个图层是一个好习惯) 五.然后将“背景”图层的可视取消(就是点击一下“背景”图层左边的那个小眼睛) 六.使用矩形选框工具,快捷键为M,在你所想要实现翻页效果的地方

transform3D实现翻页效果

---恢复内容开始--- 闲篇 最近升级了下百度音乐,唯一的感觉就是动画效果很炫丽.我不是个对产品很敏感的人,但是这段时间观察一些大厂的产品发现现在的APP越来越重视动画效果了.大家可能没有注意过,连支付宝的一个很边缘很边缘的小角落(“财富 ->芝麻信用分 ->信用猜猜”)动画也是很炫的.随着手机硬件的增强以及广大苦逼程序员的不懈努力与钻研,APP的会越来越强调交互性,物理效果(UIDynamic)和动画效果(CoreAnimation)会越来越受欢迎. 准备 好吧,闲话不说了,首先跟大家坦白

Android用悬浮按钮实现翻页效果

今天给大家分享下自己用悬浮按钮点击实现翻页效果的例子. 首先,一个按钮要实现悬浮,就要用到系统顶级窗口相关的WindowManager,WindowManager.LayoutParams.那么在AndroidManifest.xml中添加权限: ? 1 <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> 然后,我们要对WindowManager,WindowManager.La

采用cocos2d-x lua 的listview 实现pageview的翻页效果之上下翻页效果

--翻页滚动效果local function fnScrollViewScrolling( sender,eventType)    -- body    if eventType == 10 then        local bposX = sender:getPercentage()*100        _bPosX = bposX    end    if not _bPosX then        return    end    print("-------bposX="

iOS开发日记45-类似淘宝商品详情查看翻页效果的实现

今天博主有一个类似淘宝商品详情查看翻页效果的实现的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 1.使用第三方框架 我用到的第三方库EGORefreshTableHeaderView下拉刷新的效果还有就是PWLoadMoreTableFooterView上拉加载更多 主要的思路在于UISCrollView两页,一页展示商品概况,另一页展示商品更多详情 首先,第一页的view包含一个UITableView,这个tableView实现PWLoadMoreTableFooterView中