HTML5触摸事件实现移动端简易进度条的实现方法


Posted in HTML / CSS onMay 04, 2018

前言

HTML中新添加了许多新的事件,但由于兼容性的问题,许多事件都没有广泛的应用,接下来为大家介绍一些好用的移动端触摸事件: touchstart、touchmove、touchend。

介绍

下面我们来简单介绍一下这几个事件:

  1. touchstart: 当手指触摸屏幕时候触发,即使已经有一个手指放在屏幕上也会触发。
  2. touchmove:当手指在屏幕上滑动的时候连续地触发。在这个事件发生期间,调用preventDefault()事件可以阻止滚动。
  3. touchend:当手指从屏幕上离开的时候触发。

这些触摸事件具有常见的dom属性。此外,他们还包含着三个用于跟踪触摸的属性:

  1. touches:表示当前跟踪的触摸操作的touch对象的数组。
  2. targetTouches:特定于事件目标的Touch对象的数组。
  3. changeTouches:表示自上次触摸以来发生了什么改变的Touch对象的数组。

每个touch对象包含的属性如下:

  1. clientX:触摸目标在视口中的x坐标。
  2. clientY:触摸目标在视口中的y坐标。
  3. pageX:触摸目标在页面中的x坐标。
  4. pageY:触摸目标在页面中的y坐标。
  5. screenX:screenX:触摸目标在屏幕中的x坐标。
  6. screenY:screenX:触摸目标在屏幕中的x坐标。
  7. identifier:标识触摸的唯一ID。
  8. target:screenX:触摸目标在屏幕中的x坐标。

了解了触摸事件的特征,那就开始紧张刺激的实战环节吧

实战

下面我们来通过使用触摸事件来实现一个移动端可滑动的进度条

我们先进行HTML的布局

<div class="progress-wrapper">
    <div class="progress"></div>
    <div class="progress-btn"></div>
</div>

CSS部分此处省略

获取dom元素,并初始化触摸起点和按钮离容器最左方的距离

const progressWrapper = document.querySelector('.progress-wrapper')
const progress = document.querySelector('.progress')
const progressBtn = document.querySelector('.progress-btn')
const progressWrapperWidth = progressWrapper.offsetWidth

let touchPoint = 0
let btnLeft = 0

监听touchstart事件

progressBtn.addEventListener('touchstart', e => {
    let touch = e.touches[0]
    touchPoint = touch.clientX // 获取触摸的初始位置
 btnLeft = parseInt(getComputedStyle(progressBtn, null)['left'], 10) // 此处忽略IE浏览器兼容性
})

监听touchmove事件

progressBtn.addEventListener('touchmove', e => {
e.preventDefault()
    let touch = e.touches[0]

    let diffX = touch.clientX - touchPoint // 通过当前位置与初始位置之差计算改变的距离
    let btnLeftStyle = btnLeft + diffX // 为按钮定义新的left值

    touch.target.style.left = btnLeftStyle + 'px'

    progress.style.width = (btnLeftStyle / progressWrapperWidth) * 100 + '%' // 通过按钮的left值与进度条容器长度的比值,计算进度条的长度百分比
})

通过一系列的逻辑运算,我们的进度条已经基本实现了,但是发现了一个问题,当触摸位置超出进度条容器时,会产生bug,我们再来做一些限制

if (btnLeftStyle > progressWrapperWidth) {
    btnLeftStyle = progressWrapperWidth
    } else if (btnLeftStyle < 0) {
    btnLeftStyle = 0
}

至此,一个简单的移动端滚动条就实现了

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
用React加CSS3实现微信拆红包动画效果
Mar 13 HTML / CSS
CSS3实现文本垂直排列的方法
Jul 10 HTML / CSS
详解css3 flex弹性盒自动铺满写法
Sep 17 HTML / CSS
Canvas 文字碰撞检测并抽稀的方法
May 27 HTML / CSS
html5通过canvas实现刮刮卡效果示例分享
Jan 27 HTML / CSS
HTML5 新标签全部总汇(推荐)
Jun 13 HTML / CSS
phonegap常用事件总结(必看篇)
Mar 31 HTML / CSS
教你使用Canvas处理图片的方法
Nov 28 HTML / CSS
详解如何通过H5(浏览器/WebView/其他)唤起本地app
Dec 11 HTML / CSS
html5视频常用API接口的实战示例
Mar 20 HTML / CSS
amazeui 验证按钮扩展的实现
Aug 21 HTML / CSS
浅谈移动端中的视口(viewport)的具体使用
Apr 13 HTML / CSS
HTML5声音录制/播放功能的实现代码
May 03 #HTML / CSS
HTML5离线应用与客户端存储的实现
May 03 #HTML / CSS
浅谈Html5多线程开发之WebWorkers
May 02 #HTML / CSS
html5的input的required使用中遇到的问题及解决方法
Apr 24 #HTML / CSS
HTML5轻松实现全屏视频背景的示例
Apr 23 #HTML / CSS
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
Apr 23 #HTML / CSS
HTML5拖拽API经典实例详解
Apr 20 #HTML / CSS
You might like
php提示undefined index的几种解决方法
2012/05/21 PHP
php生成局部唯一识别码LUID的代码
2012/10/06 PHP
php实现在服务器端调整图片大小的方法
2015/06/16 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
IE DOM实现存在的部分问题及解决方法
2009/07/25 Javascript
javascript中获取下个月一号,是星期几
2012/06/01 Javascript
在JavaScript中typeof的用途介绍
2013/04/11 Javascript
简单选项卡 js和jquery制作方法分享
2014/02/26 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
window.location.hash知识汇总
2015/11/09 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
js对字符串进行编码的方法总结(推荐)
2016/11/10 Javascript
js原生实现FastClick事件的实例
2016/11/20 Javascript
AngularJS解决ng-if中的ng-model值无效的问题
2017/06/21 Javascript
vue3.0 上手体验
2020/09/21 Javascript
Python 初始化多维数组代码
2008/09/06 Python
python数据结构之列表和元组的详解
2017/09/23 Python
详解从Django Rest Framework响应中删除空字段
2019/01/11 Python
Python告诉你木马程序的键盘记录原理
2019/02/02 Python
python 三元运算符使用解析
2019/09/16 Python
决策树剪枝算法的python实现方法详解
2019/09/18 Python
Python编写打字训练小程序
2019/09/26 Python
Python 从attribute到property详解
2020/03/05 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
2020/06/10 Python
golang/python实现归并排序实例代码
2020/08/30 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
2020/10/15 Python
模具数控专业自荐信
2014/01/27 职场文书
婚纱摄影师求职信
2014/03/07 职场文书
机械专业技术员求职信
2014/06/14 职场文书
副总经理岗位职责
2015/02/02 职场文书
2019终止劳动合同协议书最新范本!
2019/07/09 职场文书
2019通用版导游词范本!
2019/08/07 职场文书
教你漂亮打印Pandas DataFrames和Series
2021/05/29 Python
java如何实现获取客户端ip地址的示例代码
2022/04/07 Java/Android
速龙x4-860k处理器相当于i几
2022/04/20 数码科技
JS函数式编程实现XDM一
2022/06/16 Javascript