移动端事件

移动端的常见事件

touchstart 手指按下时触发
touchmove 手指移动
touchend 手指抬起

<div></div>
<p></p>
<script>

var oDiv = document.querySelector('div');
var oP = document.querySelector('p');

//最好不要用on的方式, 在chrome 模拟器下时好时坏
oDiv.addEventListener('touchstart', function(){
    oP.innerHTML += '按下';
}, false);

oDiv.addEventListener('touchmove', function(){
    oP.innerHTML += '移动';
}, false);

oDiv.addEventListener('touchend', function(){
    oP.innerHTML += '抬起';
}, false);
</script>

pc端的事件在移动端的问题

pc上的事件比移动端的事件略慢, 大概在300ms左右

oDiv.addEventListener('mouseup', function(){
    oP.innerHTML += '鼠标抬起 ';
}, false);

oDiv.addEventListener('touchend', function(){
    oP.innerHTML += '抬起 ';
}, false);

每次点击, 都是抬起 鼠标抬起

注意不要:移动手指, 移动之后就不会触发mouseup事件了

移动端的点透

<style>
div{
    height: 200px;
    width: 200px;
    background: rgba(99, 99, 99, 0.5);
    position: absolute;
    top: 0;
}
</style>
<span>span, 点击我</span>

<div>
<script>
var oDiv = document.querySelector('div');
var oSpan = document.querySelector('span');


oDiv.addEventListener('touchend', function(){
    this.style.display = 'none';
}, false);

oSpan.addEventListener('click', function(){
    alert(1);
}, false);

</script>

效果是点击div,手指抬起div消失

但是,当你点到div上span标签的位置,会触发span的click事件,div是覆盖了span标签的

span标签应该是点不到的, 如果将div的背景设为实色, 根本就看不到span标签

这就是移动端的点透问题:

当两个元素重叠时,当上层元素发生点击, 并且下层元素也有点击(焦点)特性,
如果在300ms之内, 上层元素消失, 目标点就会到下层元素, 触发下层元素的点击行为

所以如果你点击div300毫秒之后才抬起手指, 也不会触发span的click事件

原因就是因为pc上的事件比移动端的事件的300ms延迟

关于a标签,也会发生上面的点透问题

<style>
div{
    height: 200px;
    width: 200px;
    background: rgba(99, 99, 99, 0.5);
    position: absolute;
    top: 0;
}
</style>
<a href="/">a标签</a>

<div>
<script>
var oDiv = document.querySelector('div');


oDiv.addEventListener('touchend', function(){
    this.style.display = 'none';
}, false);


</script>

解决办法

  1. 换成移动端事件
 oSpan.addEventListener('touchend', function(){
    alert(1);
}, false);
  1. 阻止pc的事件

//猜想(pc的事件应该都算默认行为) 
document.addEventListener('touchstart', function(ev){
    ev.preventDefault();
}, false);

这是你注册的click事件, 永远都不会触发, a标签也不会跳转,

touch所有类型事件都会冒泡,如果阻止了touchstart的默认行为,后续的mousedown和click事件将不会触发

阻止了touchmove的默认行为,后续的mousemove事件将不会触发

如果阻止了touchend的默认行为,后续的mouseup和click事件将不会触发

同时解决了:

  1. IOS10下设置meta禁止用户缩放是不可行的。(使用阻止pc事件就可以在IOS10下禁止用户缩放)

  2. 解决IOS10下溢出隐藏的问题。

  3. 禁止系统默认的滚动条、阻止橡皮筋效果

  4. 禁止长按选中文字、选中图片、系统默认菜单

  5. 解决点透问题

  6. 也阻止了焦点元素的焦点行为(要正常使用:ev.stopPropagation()阻止冒泡)

移动端的事件对象

touchs

当前位于屏幕上的所有手指的一个列表

targetTouches

位于当前DOM元素上的手指的一个列表

changedTouches

涉及当前事件的手指的一个列表

<style>
div{
    height: 100px;
    width: 100px;
    background: red;
}
</style>
<div></div>
<script>
var div = document.querySelector('div');
div.addEventListener('touchmove', function(ev){
    //只要我有几个手指在屏幕上, 就会显示几
    // div.innerHTML = ev.touches.length;
    

})
</script>

例子:轮播图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
<style>
*{
    margin: 0;
    padding: 0;
}
.container{
    width: 100%;
    height: 321px;
    overflow: hidden;
    position: relative;

}
.wrap{
    position: absolute;
    width: 100%;
    white-space: nowrap;
    font-size: 0;
    left: 0;
}

img{
    width: 100%;
    display: inline-block;
}
</style>
</head>
<body>
<div class="container">
    <div class="wrap">
        ![](1.jpg)
        ![](2.jpg)
        ![](3.jpg)
        ![](4.jpg)
    </div>

</div>
<script>
document.addEventListener('touchstart', function(ev){
    ev.preventDefault();
})
var wrap = document.querySelector('.wrap');
var img = document.querySelector('img');

var width = img.offsetWidth;

wrap.addEventListener('touchstart', function(ev){

    // 需要去掉过渡效果,因为会跟移动产生冲突,造成卡顿
    wrap.style.transition = 'none';
    //移动端只需加webkit前缀
    wrap.style.webkitTransition = 'none';


    var e = ev.changedTouches[0];
    var disX = e.pageX;
    var left = this.offsetLeft;
    

    wrap.addEventListener('touchmove', function(ev){
        var e = ev.changedTouches[0];
        this.style.left = left + (e.pageX - disX) + 'px';
    });

    wrap.addEventListener('touchend', function(ev){
        var e = ev.changedTouches[0];

        
        left = this.offsetLeft;
        var num = Math.round(left/width);

        wrap.style.transition = '1s';
        //移动端只需加webkit前缀
        wrap.style.webkitTransition = '1s';
        wrap.style.left = num*width+'px';

    })
});
</script>
</body>
</html>

无缝滚动, 复制相同的img, 如果你本来有4张图片, 那么现在就有8张

如果点toucnstart到第一张, 迅速跳的第5张, 如果点toucnstart到第8张, 迅速跳的第4张,

wrap.addEventListener('touchstart', function(ev){
    ....
    num = Math.round(left/width);
    if(num==0){
        num = -length;
    }
    if(-num==2*length-1){
        num = -(length-1);
    }

    this.style.left = num*width + 'px';
    left = this.offsetLeft;
    ....
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容