点透(click)——web移动端常见问题的产生原因及解决办法(fastclick)

序言: 关于click点透的原因和方法可以参考文章 :https://www.cnblogs.com/zldream1106/p/3670988.html 在这里面讲的已经很详细了。

当需要制作一个页面, 既能在pc端和移动端响应, 但是没有点透, 操作也没有延迟 。这时常常需要用 fastclick 来解决点透这个问题。

注: 使用 fastclick.js 可以解决点透这个问题,原先是因为源生的tap事件以及zepto中的tap都不能有效的解决这个问题,不过最新的zepto已经修复了。但是这里还是看看源生的tap是怎么产生点透的。

一、代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>Title</title>
    <style>
        body {
            padding: 0;
            margin: 0;
            background-color: #F7F7F7;
        }

        .box {
            width: 320px;
            height: 320px;
            margin: 100px auto;
            position: relative;
        }

        .tap {
            width: 200px;
            height: 200px;
            text-align: center;
            line-height: 200px;
            font-size: 30px;
            margin: -100px 0 0 -100px;
            background-color: red;
            position: absolute;
            left: 50%;
            top: 50%;
        }

        .click {
            width: 300px;
            height: 300px;
            text-align: center;
            line-height: 300px;
            font-size: 30px;
            margin: -150px 0 0 -150px;
            background-color: pink;
            position: absolute;
            left: 50%;
            top: 50%;
        }
    </style>
</head>

<body>
   
    <div class="box">
        <div class="click">click</div>
        <div class="tap">tap</div>
    </div>
    <script>
        var tap = document.querySelector(".tap");
        var click = document.querySelector(".click");

        /*为tap添加touch事件*/
        tap.addEventListener("touchstart",function(){
            tap.style.visibility="hidden";
        })
        /*为click添加click事件*/
        click.onclick=function(){
            console.log(123);
        }
    </script>
</body>

</html>

二、运行之后 当你点击tap元素块的时候 在控制台会打印出 123 如下图所示:在这里插入图片描述

为什么点击 tap 元素块会打印出 click 元素块的结果呢? 原因就是产生了点透 当我点击tap元素块的时候 它透过了tap元素块
去操作了tap元素块下面的click元素块。

三、这里还要特别注意点透产生的条件有哪些

  1. A/B两个层上下z轴重叠。

  2. 上层的A点击后消失或移开。(这一点很重要)

  3. B元素本身有默认click事件(如a标签) 或 B绑定了click事件。

    在以上情况下,点击A/B重叠的部分,就会出现点透的现象。

四、如何使用 fastclick 来解决

  1. 下载fastclick.js 地址 :https://github.com/ftlabs/fastclick fastclick.js 在 lib 目录下。
  2. 在页面中引入fastclick.js
<!--引入fastclick文件-->
    <script src="./js/fastclick.js"></script> -->
  1. 绑定 :
 /*使用fastclick:在pc端也能响应  解决延迟问题*/
        if ('addEventListener' in document) {
            document.addEventListener('DOMContentLoaded', function () {
                //参数可以是任意的dom元素,如果写document.body,说明会将document.body下面的所的元素都绑定fastclick/
                FastClick.attach(document.body);
            }, false);
        }

或者 :

 $(function() {
        FastClick.attach(document.body);
    });

五、完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <title>Title</title>
    <style>
        body {
            padding: 0;
            margin: 0;
            background-color: #F7F7F7;
        }
        .box {
            width: 320px;
            height: 320px;
            margin: 100px auto;
            position: relative;
        }
        .tap {
            width: 200px;
            height: 200px;
            text-align: center;
            line-height: 200px;
            font-size: 30px;
            margin: -100px 0 0 -100px;

            background-color: red;

            position: absolute;
            left: 50%;
            top: 50%;
        }
        .click {
            width: 300px;
            height: 300px;
            text-align: center;
            line-height: 300px;
            font-size: 30px;
            margin: -150px 0 0 -150px;
            background-color: pink;
            position: absolute;
            left: 50%;
            top: 50%;
        }
    </style>
</head>
<body>
<!--引入fastclick文件-->
<script src="./js/fastclick.js"></script>
<div class="box">
    <div class="click">click</div>
    <div class="tap">tap</div>
</div>
<script>
    var tap=document.querySelector(".tap");
    var click=document.querySelector(".click");
    /*使用fastclick:在pc端也能响应  解决延迟问题*/
    if ('addEventListener' in document) {
        document.addEventListener('DOMContentLoaded', function() {
            /!*参数可以是任意的dom元素,如果写document.body,说明会将document.body下面的所的元素都绑定fastclick*!/
            FastClick.attach(document.body);
        }, false);
    }
    tap.addEventListener("click",function(){
        tap.style.visibility="hidden";
    })
    click.addEventListener("click",function(){
        console.log(123);
    })
</script>
</body>
</html>

之后运行你会发现 刚刚那个问题已经没有了在这里插入图片描述
六、所涉及知识点:

  1. touch 事件只有在移动端才能使用 在 pc 端无效;

  2. 为什么我们后来都是添加的 click 事件在这里插入图片描述

  3. 原因

  1. 在pc和移动端都能响应–click
    2. 不能点透–click
    3. 操作不能有延迟–touch

所以我们最终选择都为 click

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值