博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
移动web端自定义tap与模拟hover效果
阅读量:5806 次
发布时间:2019-06-18

本文共 4169 字,大约阅读时间需要 13 分钟。

在上两篇文章【】【】中分别对移动web端的自定义tap事件、模拟hover效果的原理进行了简单的说明。这篇文章主要把两者结合在了一起,解决了一些bug,使得整体效果更佳。

之前的自定义tap没有考虑到双击、长按等使用场景(感谢 的建议!),这次新增了langTap、doubleTap事件。模拟hover效果由于是独立于自定义tap的,效果有些小瑕疵,这次结合了tap,效果好了很多

效果预览

核心代码

//tap定时器var timer_tap;//langTap定时器var timer_langTap;//自定义tap、doubleTap、langTap$(document).on("touchstart", function (e) {    var $target = $(e.target);    var tapData = $target.data("tapData");    //不处理含有disable class的对象    if ($target.hasClass("disable")) return;    //状态信息    tapData = tapData ? tapData : {};    tapData.state = "start";    tapData.isMoved = 0;    tapData.preTouchStartTime = tapData.touchStartTime ? tapData.touchStartTime : null;    tapData.touchStartTime = new Date().getTime();    //doubleTap    if(tapData.preTouchStartTime && tapData.touchStartTime - tapData.preTouchStartTime < 250) {        //doubleTap        tapData.doubleTapTime = tapData.touchStartTime;        //记录信息        $target.data("tapData", tapData);        //清除timer_tap        clearTimeout(timer_tap);        return;    }    //langTap    timer_langTap = setTimeout(function() {        var tapData = $target.data("tapData");        if(tapData.state != "start") return;        $target.trigger("langTap");        if(tapData.$hover) tapData.$hover.removeClass("active");    }, 700);    //寻找$hover对象    var $hover;    if($target.hasClass("action-btn")) {        $hover = $target;    }else {        $target.parents().each(function() {            if($(this).hasClass("action-btn")) $hover = $hover ? $hover : $(this);        });    }    tapData.$hover = $hover;    //记录信息    $target.data("tapData", tapData);    //点击效果    if(!$hover) return;    //延迟78ms    setTimeout(function() {        var tapData = $target.data("tapData");        //移动过        if(tapData.isMoved != 0) return;        //添加点击效果        tapData.$hover.addClass("active");    }, 78);});$(document).on("touchmove", function (e) {    var $target = $(e.target);    var tapData = $target.data("tapData");    //不处理含有disable class的对象    if ($target.hasClass("disable")) return;    //记录信息    tapData.state = "move";    tapData.isMoved = 1;    tapData.touchStartTime = 0;    $target.data("tapData", tapData);    //点击效果    if(tapData.$hover) tapData.$hover.removeClass("active");});$(document).on("touchend", function (e) {    var $target = $(e.target);    var tapData = $target.data("tapData");    //不处理含有disable class的对象    if ($target.hasClass("disable")) return;    //清除长按倒计时    clearTimeout(timer_langTap);    //记录信息    tapData.state = "end";    $target.data("tapData", tapData);    //是否移动过    if (tapData.isMoved == 1) return;    //触摸时间    var duration = new Date().getTime() - tapData.touchStartTime;    //doubleTap    if(tapData.doubleTapTime == tapData.touchStartTime) {        //触发doubleTap        $target.trigger("doubleTap");        if(tapData.$hover) tapData.$hover.removeClass("active");        //重置开始点击事件(防止连续触发doubleTap)        tapData.touchStartTime = 0;        $target.data("tapData", tapData);        return;    }    //tap    if(duration <= 250) {        //点击效果持续250ms        timer_tap = setTimeout(function() {            //tap            $target.trigger("tap");            if(tapData.$hover) tapData.$hover.removeClass("active");        }, 250 - duration);        return;    }    //触摸时间在250ms到700ms之间    if(tapData.$hover) tapData.$hover.removeClass("active");});$(document).on("touchcancel", function (e) {    var $target = $(e.target);    var tapData = $target.data("tapData");    if(tapData.$hover) tapData.$hover.removeClass("active");});

新增内容

langTap

触发条件:当用户触摸屏幕的时间达到700ms时且未移动过

//langTaptimer_langTap = setTimeout(function() {    var tapData = $target.data("tapData");    if(tapData.state != "start") return;    $target.trigger("langTap");    if(tapData.$hover) tapData.$hover.removeClass("active");}, 700);

doubleTap

触发条件:用户在250ms内连续触摸屏幕两次

//doubleTapif(tapData.preTouchStartTime && tapData.touchStartTime - tapData.preTouchStartTime < 250) {    //doubleTap    tapData.doubleTapTime = tapData.touchStartTime;    //记录信息    $target.data("tapData", tapData);    //清除timer_tap    clearTimeout(timer_tap);    return;}

其他

自定义tap和模拟hover效果的原理在上两篇文章中都有说明,这里就不再赘述了(主要是不知道该怎么描述了(-_-))。

文章有什么不对的地方,望大家指正。欢迎交流!

转载地址:http://hrubx.baihongyu.com/

你可能感兴趣的文章
关于二叉树重构的思索
查看>>
$_SERVER['SCRIPT_FLENAME']与__FILE__
查看>>
skynet实践(8)-接入websocket
查看>>
系统版本判断
查看>>
关于Css选择器优先级
查看>>
My97DatePicker 日历插件
查看>>
0603 学术诚信与职业道德
查看>>
小点心家族第3位成员——楼层定位效果
查看>>
Knockout.Js官网学习(enable绑定、disable绑定)
查看>>
hive基本操作与应用
查看>>
excel快捷键设置
查看>>
poj3692
查看>>
python之信号量【Semaphore】
查看>>
html5纲要,细谈HTML 5新增的元素
查看>>
Android应用集成支付宝接口的简化
查看>>
[分享]Ubuntu12.04安装基础教程(图文)
查看>>
[Vim] 搜索模式(正则表达式)
查看>>
#HTTP协议学习# (二)基本认证
查看>>
Android开发之线性布局详解(布局权重)
查看>>
WCF
查看>>