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


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 异步操作回调函数如何控制执行顺序
Dec 24 Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 Javascript
jQuery中:hidden选择器用法实例
Dec 30 Javascript
JS实现向表格中动态添加行的方法
Mar 30 Javascript
学习使用bootstrap基本控件(table、form、button)
Apr 12 Javascript
Function.prototype.apply()与Function.prototype.call()小结
Apr 27 Javascript
Vue.js第一天学习笔记(数据的双向绑定、常用指令)
Dec 01 Javascript
canvas时钟效果
Feb 16 Javascript
Javascript中将变量转换为字符串的三种方法
Sep 19 Javascript
React如何利用相对于根目录进行引用组件详解
Oct 09 Javascript
20个最常见的jQuery面试问题及答案
May 23 jQuery
解决小程序无法触发SESSION问题
Feb 03 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下尝试使用GraphicsMagick的缩略图功能
2011/01/01 PHP
php中记录用户访问过的产品,在cookie记录产品id,id取得产品信息
2011/05/04 PHP
PHP求最大子序列和的算法实现
2011/06/24 PHP
php入门学习知识点一 PHP与MYSql连接与查询
2011/07/14 PHP
php中unlink()、mkdir()、rmdir()等方法的使用介绍
2012/12/21 PHP
Zend Framework教程之Bootstrap类用法概述
2016/03/14 PHP
PHP中类属性与类静态变量的访问方法示例
2016/07/13 PHP
PHP+Apache+Mysql环境搭建教程
2016/08/01 PHP
PHP读取大文件的几种方法介绍
2016/10/27 PHP
Laravel自动生成UUID,从建表到使用详解
2019/10/24 PHP
js结合正则实现国内手机号段校验
2015/06/19 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
动态创建按钮的JavaScript代码
2016/01/29 Javascript
AngularJS 自定义指令详解及示例代码
2016/08/17 Javascript
React实践之Tree组件的使用方法
2017/09/30 Javascript
剖析Angular Component的源码示例
2018/03/23 Javascript
Vue 页面跳转不用router-link的实现代码
2018/04/12 Javascript
node+koa2+mysql+bootstrap搭建一个前端论坛
2018/05/06 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
js 实现ajax发送步骤过程详解
2019/07/25 Javascript
Vuex的实战使用详解
2019/10/31 Javascript
Python脚本实现格式化css文件
2015/04/08 Python
Python爬虫包BeautifulSoup异常处理(二)
2018/06/17 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
pytorch之ImageFolder使用详解
2020/01/06 Python
Python学习之os模块及用法
2020/06/03 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
windows下python 3.9 Numpy scipy和matlabplot的安装教程详解
2020/11/28 Python
美国最大的家庭鞋类零售商之一:Shoe Carnival
2017/10/06 全球购物
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
农业资源与环境专业自荐信范文
2013/12/30 职场文书
《白鹅》教学反思
2014/04/13 职场文书
小学作文评语大全
2014/04/21 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
公司庆典欢迎词
2015/01/26 职场文书
MySQL 8.0 Online DDL快速加列的相关总结
2021/06/02 MySQL