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


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 相关文章推荐
JavaScript 学习笔记(十五)
Jan 28 Javascript
Extjs407 getValue()和getRawValue()区别介绍
May 21 Javascript
jQuery中的read和JavaScript中的onload函数的区别
Aug 27 Javascript
JavaScript实现的一个日期格式化函数分享
Dec 06 Javascript
BootStrop前端框架入门教程详解
Dec 25 Javascript
Jquery EasyUI $.Parser
Jun 02 jQuery
原生JS实现多个小球碰撞反弹效果示例
Jan 31 Javascript
mpvue项目中使用第三方UI组件库的方法
Sep 30 Javascript
微信小程序动态添加view组件的实例代码
May 23 Javascript
微信小程序 this.triggerEvent()的具体使用
Dec 10 Javascript
Vuex模块化应用实践示例
Feb 03 Javascript
javascript实现扫雷简易版
Aug 18 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
JSON辅助格式化处理方法
2013/03/26 Javascript
Javascript计算两个marker之间的距离(Google Map V3)
2013/04/26 Javascript
jquery中post方法用法实例
2014/10/21 Javascript
jQuery设置指定网页元素宽度和高度的方法
2015/03/25 Javascript
jQuery实现单击弹出Div层窗口效果(可关闭可拖动)
2015/09/19 Javascript
Bootstrap编写导航栏和登陆框
2016/05/30 Javascript
简单实现的JQuery文本框水印插件
2016/06/14 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
jQuery与JavaScript节点创建方法的对比
2016/11/18 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
Vue2.0利用 v-model 实现组件props双向绑定的优美解决方案
2017/03/13 Javascript
[js高手之路]寄生组合式继承的优势详解
2017/08/28 Javascript
解决Vue 浏览器后退无法触发beforeRouteLeave的问题
2017/12/24 Javascript
JavaScript实现简单的隐藏式侧边栏功能示例
2018/08/31 Javascript
Vue文件配置全局变量的实例
2018/09/06 Javascript
浅谈webpack SplitChunksPlugin实用指南
2018/09/17 Javascript
微信小程序实现左滑修改、删除功能
2020/10/19 Javascript
深入浅析nuxt.js基于ssh的vue通用框架
2019/05/21 Javascript
[01:09:10]NB vs Liquid Supermajor小组赛 A组胜者组决赛 BO3 第一场 6.2
2018/06/04 DOTA
Python中的闭包总结
2014/09/18 Python
Python实现二叉堆
2016/02/03 Python
tensorflow saver 保存和恢复指定 tensor的实例讲解
2018/07/26 Python
python3的输入方式及多组输入方法
2018/10/17 Python
更改Python的pip install 默认安装依赖路径方法详解
2018/10/27 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
python时间序列按频率生成日期的方法
2019/05/14 Python
基于Python+Appium实现京东双十一自动领金币功能
2019/10/31 Python
windows中安装Python3.8.0的实现方法
2019/11/19 Python
CSS3 transition 实现通知消息轮播条
2020/10/14 HTML / CSS
Hotels.com加拿大:领先的在线住宿网站
2018/10/05 全球购物
英国领先的酒杯和水晶玻璃器皿制造商:Dartington Crystal
2019/06/23 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
党校培训思想汇报
2013/12/30 职场文书
坎儿井导游词
2015/02/09 职场文书
庭外和解协议书
2016/03/23 职场文书
《金肉人》米特&《航海王》阿鹤声优松岛实因胰脏癌去世 享寿81岁
2022/04/13 日漫