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


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 数组实现一个类似ruby的迭代器
Oct 27 Javascript
谈谈关于JavaScript 中的 MVC 模式
Apr 11 Javascript
JS 实现点击a标签的时候让其背景更换
Oct 15 Javascript
js实现鼠标悬停图片上时滚动文字说明的方法
Feb 17 Javascript
JavaScript父子窗体间的调用方法
Mar 31 Javascript
jQuery随手笔记之常用的jQuery操作DOM事件
Nov 29 Javascript
前端分页功能的实现以及原理(jQuery)
Jan 22 Javascript
基于angular-utils-ui-breadcrumbs使用心得(分享)
Nov 03 Javascript
Vue 自定义指令功能完整实例
Sep 17 Javascript
jquery选择器和属性对象的操作实例分析
Jan 10 jQuery
VueCli4项目配置反向代理proxy的方法步骤
May 17 Javascript
微信小程序实现多行文字滚动
Nov 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
深入PHP5中的魔术方法详解
2013/06/17 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
PHP连接数据库实现注册页面的增删改查操作
2016/03/27 PHP
PHP 7安装调试工具Xdebug扩展的方法教程
2017/06/17 PHP
jQuery bind事件使用详解
2011/05/05 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
2013/09/04 Javascript
jquery 实现两级导航菜单附效果图
2014/03/07 Javascript
JQuery记住用户名和密码的具体实现
2014/04/04 Javascript
JavaScript使用setTimeout实现延迟弹出警告框的方法
2015/04/07 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
jQuery插件jqGrid动态获取列和列字段的方法
2017/03/03 Javascript
jQuery实现选项卡功能(两种方法)
2017/03/08 Javascript
js 概率计算(简单版)
2017/09/12 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
vue路由拦截及页面跳转的设置方法
2018/05/24 Javascript
node.js使用mongoose操作数据库实现购物车的增、删、改、查功能示例
2019/12/23 Javascript
node.js express捕获全局异常的三种方法实例分析
2019/12/27 Javascript
jQuery实现鼠标滑动切换图片
2020/05/27 jQuery
vue中路由跳转不计入history的操作
2020/09/21 Javascript
[06:15]2016国际邀请赛中国区预选赛单车采访:我顶WINGS
2016/06/27 DOTA
[47:04]LGD vs infamous Supermajor小组赛D组 BO3 第二场 6.3
2018/06/04 DOTA
[02:58]魔廷新尊——痛苦女王至宝语音台词节选
2020/06/14 DOTA
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
Python安装并操作redis实现流程详解
2020/10/13 Python
使用 css3 实现圆形进度条的示例
2017/07/05 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
有趣的睡衣和礼物:LazyOne
2019/11/27 全球购物
俄罗斯宠物用品网上商店:ZooMag
2019/12/12 全球购物
高中生学习生活的自我评价
2013/10/09 职场文书
财务与信息服务专业推荐信
2013/11/28 职场文书
2015年城乡环境综合治理工作总结
2015/07/24 职场文书
高中生综合素质评价范文
2015/08/18 职场文书
党校团干班培训心得体会
2016/01/06 职场文书