移动端事件——移动端滑屏切换的幻灯片(一)

在我们开始用原声JS写移动端轮播前,我们先了解一些移动端的基础。

    touch事件、touchEvents对象、滑屏的思想与实现

移动端touch事件

  • touchstart
  • touchmove
  • touchend
let box = document.querySelector("#box");
    /*
        touchstart --> mousedown
            手指触碰元素
        touchmove --> mousemove
            手指触碰元素之后,在屏幕中移动
        touchend --> mouseup
            手指触碰元素之后,从屏幕上抬起
    */
    box.addEventListener("touchstart",()=>{
        console.log("手指触碰")
    });
    box.addEventListener("touchmove",({target})=>{
        console.log("手指移动",target)
    });
    box.addEventListener("touchend",()=>{
        console.log("手指抬起")
    });
  • touch 事件 和 mouse 事件的区别
{
    let box = document.querySelector("#box");
    box.addEventListener("mouseup",()=>{
        console.log("鼠标抬起");// 移动端也支持 mouse 事件
        console.timeEnd(1);
    });
    box.addEventListener("touchend",()=>{
        console.log("手指抬起");// PC 端不支持 touch 事件
        console.time(1);
    });

}  
  • 事件点透
    • touch 事件本身没有延迟,触发之后立马执行,另外浏览器会记录当前的一个点击位置,延迟一段时间,在该坐标找到相应的元素,如果元素有 mouse 事件,就执行
      解决方案:
      1. 给 touch 事件 加延迟
      2. 绝对不在页面使用 mouse 事件
      3. 阻止默认事件
    • mouse 事件的延迟问题
let box = document.querySelector("#box");
// box.addEventListener("touchend",()=>{
//     setTimeout(()=>{
//         box.style.display = "none";
//     },300);
// });
box.addEventListener("touchend",(e)=>{
    box.style.display = "none";
    // setTimeout(()=>{
    //     box.style.display = "none";
    // },300);
    e.preventDefault();
});
  • 阻止默认事件
    •   阻止 touchstart 事件带来的影响
    •   阻止 touchmove 事件带来的影响
document.addEventListener("touchmove",(e)=>{
        e.preventDefault();
    },{
        passive:false // true 不允许阻止默认事件 ,false 允许阻止默认事件
    });
    // txt.addEventListener("touchstart",()=>{
    //     txt.focus();
    // })

阻止 touchstart 默认事件带来的危害:
1. 所有的 mouse 事件,全部都会失效(包括a标签的href)
2. 滚动条不能拖动
3. 没有办法获得焦点和失去焦点
4. 多指不能缩放页面
5. 长按选中会被阻止,系统菜单也会被阻止

阻止 touchmove 默认事件带来的危害:
1. 滚动条不能拖动
2. 多指不能缩放页面

TouchEvent 对象详解

  • touches 当前屏幕上的手指列表
  • targetTouches 当前元素上的手指列表
  • changedTouches 触发当前事件的手指列表

滑屏

  • 构思
    1.   摁下时,记录手指坐标和元素坐标
    2.   移动后,获取手指新坐标
    3.   计算手指移动距离 = 用移动后的手指 - 摁下时手指坐标
    4.   移动后的元素位置 = 手指移动距离 + 摁下时元素的坐标
  • 实现
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, user-scalable=no">
    <title>Document</title>
    <style>
        body {
            margin: 0;
        }
        #box {
            position: fixed;
            left: 0;
            top: 20%;
            width: 100vw;
            height: 50%;
            overflow: -hidden;
            border: 1px  solid red;
        }
    </style>
</head>
<body>
<div id="box">

</div>
<script>

// 滑屏实现
{
    let box = document.querySelector("#box");
    let translateY = 0; // 元素的位置
    let startY = 0; // 记录摁下时元素的位置
    let startOffset = 0; // 记录摁下时手指坐标
    let list = document.querySelector("#list");
    box.addEventListener("touchstart",({changedTouches})=>{
        startY = translateY;
        startOffset = changedTouches[0].pageY;
    });
    box.addEventListener("touchmove",({changedTouches})=>{
        let nowOffset = changedTouches[0].pageY;//当前手指坐标
        let disOffset = nowOffset - startOffset;//手指移动距离
        translateY = disOffset + startY;
        list.style.transform = `translateY(${translateY}px)`
    });

}
</script>
</body>
</html>

因为俺也是在学,如果有遇到什么bug,欢迎和俺一块探讨。

原文地址:https://www.cnblogs.com/jfen625/p/12535758.html

时间: 2024-11-07 03:38:50

移动端事件——移动端滑屏切换的幻灯片(一)的相关文章

H5单页面手势滑屏切换原理

H5单页面手势滑屏切换是采用HTML5 触摸事件(Touch) 和 CSS3动画(Transform,Transition)来实现的,效果图如下所示,本文简单说一下其实现原理和主要思路. 1.实现原理 假设有5个页面,每个页面占屏幕100%宽,则创建一个DIV容器viewport,将其宽度(width) 设置为500%,然后将5个页面装入容器中,并让这5个页面平分整个容器,最后将容器的默认位置设置为0,overflow设置为hidden,这样屏幕就默认显示第一个页面. <div id="v

利用轮播原理结合hammer.js实现简洁的滑屏功能

最近有个任务,做一个非常小的h5的应用,只有2屏,需要做横向的全屏滑动切换和一些简单的动画效果,之前做这种东西用的是fullpage.js和jquery,性能不是很好,于是就想自己动手弄一个简单的东西来实现.最后我用zepto + hammer.js 和轮播的方式解决了这个问题,效果还不错,整个页面不开启Gzip时所有资源请求的数据大小为200KB左右.这篇文章总结下这个方法的实现思路. 效果演示(代码下载): 1. 实现要点 1)滑屏借鉴bootstrap的carousel插件,不过完全没有它

滑屏框架

适合上下滑屏.左右滑屏等滑屏切换页面的效果 slip.js iSlider.js fullpage.js swiper.js

H5案例分享:移动端滑屏 touch事件

移动端滑屏 touch事件 移动端触屏滑动的效果的效果在电子设备上已经被应用的越来越广泛,类似于PC端的图片轮播,但是在移动设备上,要实现这种轮播的效果,就需要用到核心的touch事件.处理touch事件能跟踪到屏幕滑动的每根手指. 以下是四种touch事件 touchstart: //触摸屏幕时触发:即使已经有一个手指放在了屏幕上也会触发.touchmove: //在屏幕上滑动时连续的触发.在这个事件发生期间,调用preventDefault()可阻止滚动.touchend: //从屏幕上移开

H5案例分享:移动端touch事件判断滑屏手势的方向

移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标moveEndX和纵坐标moveEndY;最后,通过这两次获取的坐标差值来判断手指在手机屏幕上的滑动方向. 思路:用touchmove的最后坐标减去touchstart的起始坐标,X的结果如果正数,则说明手指是从左往右划动:X的结果如果负数,则说明手指是从右往左划动:Y的结果如果正数,则说明手指是从

关于移动端开发时iOS上滑屏卡顿的问题,以及电话类数字的样式失控问题

写在前面的话: tips:写移动的时候,那些头部需要固定显示在显示屏顶部的,通常在PC端我会用fixed来写.但是,在移动端,这并不是一个好方法,因为弹出输入小键盘的时候,会造成fixed 的元素偏移掉,在这里有两种方法可以解决: 1.建议移动端布局采用以下方式(见正文),如果有错误的地方,还请指正~ 2.另外还看到一篇文章提到这个问题,作者让固定的头部仍然采用fixed, 然后内容区也用了fixed,内容区的fixed元素这样写:{position:fixed;top:80px;bottom:

移动端touch触屏滑动事件、滑动触屏事件监听!

移动端touch触屏滑动事件.滑动触屏事件监听! 一.触摸事件 ontouchstart.ontouchmove.ontouchend.ontouchcancel 目前移动端浏览器均支持这4个触摸事件,包括IE.由于触屏也支持MouseEvent,因此他们的顺序是需要注意的:touchstart → mouseover → mousemove → mousedown → mouseup → click1 Apple在iOS 2.0中引入了触摸事件API,Android正迎头赶上这一事实标准,缩小

移动端滑屏全应用【二】滑屏封装注意事项与移动端轮播

移动端滑屏封装注意事项: 1.touchMove时候方向判断(可以控制在 以x轴位中心正负15度之内为横向滑屏,纵向滑屏同理) 2.上下滑屏与左右滑屏的冲突(判断用户滑动方向后,只做单方向的处理) 3.安卓触摸(例如某个人手指很粗)触发touchMove(记录上一次的手指坐标,每一次move的时候判断,上次的坐标与这一次的坐标相同则return掉) 移动端轮播封装注意事项: 1.使用transition做过度效果时,需要在每次start的时候清除transition,否则效果会有卡顿 2.每次e

移动端 竖屏切换横屏时候字体变大

最近遇到ios设备竖屏切换到横屏时候,字体会发生变化的情况.用以下方法可以解决此类问题 -webkit-text-size-adjust : none ; -moz-text-size-adjust : none ; -ms-text-size-adjust : none ; text-size-adjust : none 这样就能禁止当手机由竖屏转向横屏的时内容中的文字自动调整大小,各浏览器下的私有属性为-webkit-text-size-adjust,-moz-text-size-adjus