移动端点击态处理的三种实现方式


Posted in Javascript onJanuary 12, 2017

前言

在开发移动端页面的时候,为了提高用户体验,通常会给被触控的元素加上一个效果来对用户的操作进行反馈。这种反馈主要有三种实现方式,有需要的朋友们下面来一起看看吧。

一、伪类:active

:active伪类常用于设定点击状态下或其他被激活状态下一个链接的样式。最常用于锚点<a href="#">这种情况,一般主流浏览器下也支持其他元素,如button等。在多按键的鼠标系统中,:active只适用于主按键,目前的大部分情况都是左键即主键。

该伪类下定义的CSS样式只在按下鼠标按钮与释放鼠标按钮之间的短暂瞬间被触发显示。使用键盘的tab键也可以触发:active状态。

值得注意的是:伪类是一种比较方便的实现方式,但在ios中,需要在相关的元素或者body上绑定touchstart事件才能使元素的:active生效。

By default, Safari Mobile does not use the :active state unless there is a touchstart event handler on the relevant element or on the .—MDN
document.body.addEventListener('touchstart', function (){});

也可以直接在body上添加

<body touchstart>
 <!-- ... -->
</body>

此外,由于移动端300ms延迟问题,触摸反馈会有延迟,可以使用Fastclick解决。

二、webkit-tap-highlight-color

这个属性并不是标准的,被用于设置超链接被点击时高亮的颜色,在ios设备上表现为一个半透膜的灰色背景,可以设置-webkit-tap-highlight-color为任何颜色,例如rgba(0,0,0,0.5) ,如果未设置颜色的alpha值,将使用默认的透明度,alpha为0时,将禁用高亮,alpha为1时,元素在点击时将不可见

大部分安卓设备也支持这个属性,但是显示的效果不同,表现为一个边框, -webkit-tap-highlight-color的值为边框的颜色

三、touch事件

当用户手指放在移动设备在屏幕上滑动会触发的touch事件。原理就是touchstart时,给元素添加classNametouchstend时移除className

<!-- 省略 -->
<li data-touch="true">
点我
</li>
<!-- 省略 -->
<script>
 document.body.addEventListener('touchstart', function(e){
 var target = e.target
 if(target.dataset.touch === 'true'){
  target.classList.add('active')
 }
 })
 document.body.addEventListener('touchmove', function(e){
 var target = e.target,
  rect = target.getBoundingClientRect()
 if(target.dataset.touch === 'true'){
  // 移出元素时,取消active状态
  if(e.changedTouches[0].pageX<rect.left || e.changedTouches[0].pageX>rect.right || e.changedTouches[0].pageY<rect.top || e.changedTouches[0].pageY>rect.bottom){
  target.classList.remove('active')
  }
 }
 })
 document.body.addEventListener('touchcancel', function(e){
 var target = e.target
 if(target.dataset.touch === 'true'){
  target.classList.remove('active')
 }
 })
 document.body.addEventListener('touchend', function(e){
 var target = e.target
 if(target.dataset.touch === 'true'){
  target.classList.remove('active')
 }
 })
</script>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Javascript 相关文章推荐
解决js下referer兼容各大浏览器的方法
Nov 03 Javascript
使用控制台破解百小度一个月只准改一次名字
Aug 13 Javascript
JQuery实现简单的图片滑动切换特效
Nov 22 Javascript
Bootstrap CDN和本地化环境搭建
Oct 26 Javascript
详解堆的javascript实现方法
Nov 29 Javascript
老生常谈js中的MVC
Jul 25 Javascript
node.js 用socket实现聊天的示例代码
Oct 17 Javascript
vue+vuex+axios实现登录、注册页权限拦截
Mar 09 Javascript
使用webpack搭建vue环境的教程详解
Dec 31 Javascript
jQuery 选择器用法基础入门示例
Jan 04 jQuery
如何通过JS实现转码与解码
Feb 21 Javascript
JavaScript实现网页动态生成表格
Nov 25 Javascript
js手机号批量滚动抽奖实现代码
Apr 17 #Javascript
js图片轮播手动切换特效
Jan 12 #Javascript
原生js实现倒计时功能(多种格式调用)
Jan 12 #Javascript
JavaScript定义全局对象的方法示例
Jan 12 #Javascript
Node.js制作简单聊天室
Jan 12 #Javascript
jQuery 插件实现随机自由弹跳气泡样式
Jan 12 #Javascript
微信小程序学习(4)-系统配置app.json详解
Jan 12 #Javascript
You might like
php empty,isset,is_null判断比较(差异与异同)
2010/10/19 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
浮动的div自适应居中显示的js代码
2013/12/23 Javascript
Uploadify上传文件方法
2016/03/16 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
完全深入学习Bootstrap表单
2016/11/28 Javascript
浅谈mint-ui loadmore组件注意的问题
2017/11/08 Javascript
详解tween.js 中文使用指南
2018/01/05 Javascript
vue强制刷新组件的方法示例
2019/02/28 Javascript
jQuery ajax仿Google自动提示SearchSuggess功能示例
2019/03/28 jQuery
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
webpack中的模式(mode)使用详解
2020/02/20 Javascript
vue+vant使用图片预览功能ImagePreview的问题解决
2020/04/10 Javascript
[49:08]FNATIC vs Infamous 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
浅谈python中字典append 到list 后值的改变问题
2018/05/04 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
Django如何将URL映射到视图
2019/07/29 Python
Python的形参和实参使用方式
2019/12/24 Python
python爬虫模拟浏览器访问-User-Agent过程解析
2019/12/28 Python
Django 解决由save方法引发的错误
2020/05/21 Python
Python 实现3种回归模型(Linear Regression,Lasso,Ridge)的示例
2020/10/15 Python
Restful_framework视图组件代码实例解析
2020/11/17 Python
Amara美国站:英国高端家居礼品网站,世界各地的奢侈家具品牌
2017/07/26 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
软件测试工程师结构化面试题库
2016/11/23 面试题
机电一体化专业应届本科生求职信
2013/09/27 职场文书
电子信息毕业生自荐信
2013/11/16 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
学雷锋月活动总结
2014/04/25 职场文书
尊老爱幼演讲稿
2014/09/04 职场文书
郭明义电影观后感
2015/06/08 职场文书
baselines示例程序train_cartpole.py的ImportError
2022/05/20 Python