移动端拖滑到指定位置demo

 

touches: 当前屏幕上所有触摸点的列表;

targetTouches: 当前对象上所有触摸点的列表;

changedTouches: 涉及当前(引发)事件的触摸点的列表

通过一个例子来区分一下触摸事件中的这三个属性:

1. 用一个手指接触屏幕,触发事件,此时这三个属性有相同的值。

2. 用第二个手指接触屏幕,此时,touches有两个元素,每个手指触摸点为一个值。当两个手指触摸相同元素时,

targetTouches和touches的值相同,否则targetTouches 只有一个值。changedTouches此时只有一个值,

为第二个手指的触摸点,因为第二个手指是引发事件的原因

3. 用两个手指同时接触屏幕,此时changedTouches有两个值,每一个手指的触摸点都有一个值

4. 手指滑动时,三个值都会发生变化

5. 一个手指离开屏幕,touches和targetTouches中对应的元素会同时移除,而changedTouches仍然会存在元素。

6. 手指都离开屏幕之后,touches和targetTouches中将不会再有值,changedTouches还会有一个值,

此值为最后一个离开屏幕的手指的接触点。

2. 触点坐标选取

touchstart和touchmove使用: e.targetTouches[0].pageX 或 (jquery)e.originalEvent.targetTouches[0].pageX

touchend使用: e.changedTouches[0].pageX 或 (jquery)e.originalEvent.changedTouches[0].pageX

3.touchmove事件对象的获取

想要在touchmove:function(e,参数一)加一个参数,结果直接使用e.preventDefault()就会 e 报错,处理方法为使用arguments[0]获取event参数

touchmove:function(e,参数一){

  var e=arguments[0]

  e.preventDefault()

}

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


<head>
    <meta charset="UTF-8">
    <title>移动端拖拽</title>
    <style>
        * {
            padding: 0;
            margin: 0;
            box-sizing: border-box;
        }

        .container {
            position: absolute;
            top: 0;
            left: 0;
            bottom: 0;
            right: 0;
            overflow: hidden;
            border: 1px solid #000;
        }

        .target {
            width: 200px;
            height: 200px;
            background: lightcoral;
            position: absolute;
            z-index: 1;
        }

        .border {
            z-index: 0;
            width: 202px;
            height: 202px;
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            border: 1px solid #000;
        }

        span {
            font-size: 50px;
            margin-left: 25px;
        }
    </style>
</head>


<body>
    <div id="inp">1123333</div>
    <div class="container">
            <div class="target"></div>
            <div class="border"></div>
    </div>
    <script>
        load()
        function load() {
            document.addEventListener('touchstart', touch, false);
            document.addEventListener('touchmove', touch, false);
            document.addEventListener('touchend', touch, false);
            function touch(event) {
                var event = event || window.event;
                var oInp = document.getElementById("inp");
                switch (event.type) {
                    case "touchstart": oInp.innerHTML = "Touch started (" + event.touches[0].clientX + "," + event.touches[0].clientY + ")"; break;
                    case "touchend": oInp.innerHTML = "<br>Touch end (" + event.changedTouches[0].clientX + "," + event.changedTouches[0].clientY + ")"; break;
                    case "touchmove": event.preventDefault(); oInp.innerHTML = "<br>Touch moved (" + event.touches[0].clientX + "," + event.touches[0].clientY + ")"; break;
                }
            }
        }
        window.addEventListener('load', load, false);
        window.onload = function () {
            var maxW = document.documentElement.clientWidth;
            var maxH = document.documentElement.clientHeight;
            // document.querySelector('.container').style.width = maxW;
            var target = document.querySelector('.target');
            var startX = 0;
            var startY = 0;
            var leftX = 0
            var topY = 0;
            target.addEventListener('touchstart', function (e) {
                //鼠标在图片中位置
                startX = e.targetTouches[0].pageX - this.offsetLeft;
                startY = e.targetTouches[0].pageY - this.offsetTop;
            });
            //鼠标e.targetTouches[0].pageX当前X位置
            //图像this.offsetLeft当前Left位置
            //鼠标在图片中位置 startX startY
            //图片距父级的边距 leftX topY
            target.addEventListener('touchmove', function (e) {
                leftX = e.targetTouches[0].pageX - startX;
                topY = e.targetTouches[0].pageY - startY;
                var thisW = e.targetTouches[0].target.clientWidth;
                var parentW = e.targetTouches[0].target.offsetParent.clientWidth;
                var thisH = e.targetTouches[0].target.clientHeight;
                var parentH = e.targetTouches[0].target.offsetParent.clientHeight;
                if (leftX <= 0) {
                    leftX = 0;
                }
                if (leftX >= parentW - thisW) {
                    leftX = parentW - thisW;
                }
                if (topY <= 0) {
                    topY = 0;
                }
                if (topY >= parentH - thisH) {
                    topY = parentH - thisH;
                }
                this.style.left = leftX + 'px';
                this.style.top = topY + 'px';
                this.innerHTML = '我又被揪起来了,真烦人!';
            });
            target.addEventListener('touchend', function (e) {
                // console.log(leftX);
                // console.log(maxW / 2 - target.clientWidth / 2);
                // console.log(maxW / 1.8 + target.clientWidth / 1.8);
                if (leftX > maxW / 2 - target.clientWidth
                    && leftX < maxW / 2 + target.clientWidth * 0.2
                    && topY > maxH / 2 - target.clientHeight
                    && topY < maxH / 2 + target.clientHeight * 0.2
                ) {
                    target.style.transition = 'all 1s'
                    target.style.left = (maxW / 2 - target.clientWidth / 2) + 'px';
                    target.style.top = (maxH / 2 - target.clientHeight / 2) + 'px';
                    setTimeout(() => {
                        target.style.transition = 'all 0s'
                    }, 1000);
                } else {
                    target.style.left = 0;
                    target.style.top = '3%';
                }
                this.innerHTML = '你终于放弃揪着我了,谢谢!';
            });

        };
    </script>


</body>


</html>

 

touches:表示当前跟踪的触摸操作的touch对象的数组。

targetTouches:特定于事件目标的Touch对象的数组。

changeTouches:表示自上次触摸以来发生了什么改变的Touch对象的数组。

每个Touch对象包含的属性如下。

clientX:触摸目标在视口中的x坐标。

clientY:触摸目标在视口中的y坐标。

identifier:标识触摸的唯一ID。

pageX:触摸目标在页面中的x坐标。

pageY:触摸目标在页面中的y坐标。

screenX:触摸目标在屏幕中的x坐标。

screenY:触摸目标在屏幕中的y坐标。

target:触目的DOM节点目标。

 

: 当前屏幕上所有触摸点(⼿指)的列表;

touches

2.

: 当前DOM元素上所有触摸点(⼿指)的列表;

targetTouches

3.

: 涉及当前事件的触摸点(⼿指)的列表 changedTouches 通过⼀个例⼦来区分⼀下触摸事件中的这三个属性: ⽤⼀个⼿指接触屏幕,触发事件,此时这三个属性有相同的值。 ⽤第⼆个⼿指接触屏幕,此时,touches有两个元素,每个⼿指触摸点为⼀个值。当两个⼿指触摸相同元素时,targetTouches和 touches的值相同,否则targetTouches 只有⼀个值。changedTouches此时只有⼀个值,为第⼆个⼿指的触摸点。 ⽤两个⼿指同时接触屏幕,此时changedTouches有两个值,每⼀个⼿指的触摸点都有⼀个值 ⼿指滑动时,三个值都会发⽣变化 ⼀个⼿指离开屏幕,touches和targetTouches中对应的元素会同时移除,⽽changedTouches仍然会存在元素。 ⼿指都离开屏幕之后,touches和targetTouches中将不会再有值,changedTouches还会有⼀个值,此值为最后⼀个离开屏幕的⼿ 指的接触点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值