如何让 H5 体验接近 APP:(一)触摸反馈

算法研
• 阅读 26568

如何让 H5 体验接近 APP:(一)触摸反馈

要说互联网发展趋势,必然会提及一个词汇:H5。从H5游戏,H5站点,H5营销等等。H5跨平台的特性极大地降低了开发成本和推广难度,同时也带来了一个问题: 如何让h5的体验能达到app一样呢?让我们先来看一组对比(京东APP对比京东H5):

如何让 H5 体验接近 APP:(一)触摸反馈如何让 H5 体验接近 APP:(一)触摸反馈

在h5页中,手指接触到列表项时,列表项没有任何反应。而在app中,手指刚接触到列表项时,列表项则从白色背景变为灰色背景。这种交互反馈几乎可以在所有移动端APP中看见,甚至可以说,交互反馈已经成为一种用户习惯。相较之下,h5页虽然有着跨平台的优势,但在细节处理上就差了很多,并且这种交互反馈h5并没有原生支持。react native官方文档有这么一段介绍:

Tappable Components
Tappable components should provide feedback that show the user what is handling their touch, and what will happen when they lift their finger. The user should also be able to cancel a tap by dragging their finger away.

这段介绍主要是说,原生APP组件中,“可点击组件”就应该对用户的操作做出及时反馈。下面一段话更是直接指出了为什么"web" app doesn't feel 'native'。

TouchableWithoutFeedback
Do not use unless you have a very good reason. All the elements that respond to press should have a visual feedback when touched. This is one of the primary reason a "web" app doesn't feel "native".

综上所述,我们在开发h5页面的时候,很有必要给页面一些可点击元素加上一些触摸反馈,这样可以大幅度提升页面的整体体验,使h5页体验更为接近APP。去哪网的h5首页便是这么做的:

如何让 H5 体验接近 APP:(一)触摸反馈

那么,如何在页面上加入这样的反馈呢?目前了解到的有三种方案,总结如下:

active 伪类

这种方式大多数前端童鞋都能联想到,因为PC web就是这样定义这种反馈的,那么在移动端,这个方案如何呢?我们先来看看w3c对:active的定义:

the-user-action-pseudo-classes-hover-act
The :active pseudo-class applies while an element is being activated by the user. For example, between the times the user presses the mouse button and releases it. On systems with more than one mouse button, :active applies only to the primary or primary activation button (typically the "left" mouse button), and any aliases thereof.

可以看到,w3c标准里对它的描述都是基于mouse事件的,完全没有说明如何支持touch事件。而正是由于标准对此并没有一个准确定义,浏览器对此的理解和实际支持也是参差不齐。

在实际应用中,active伪类在移动端的表现也不是太好,在ios系统中甚至需要"hack"才能正常使用。若仔细看MDN对active伪类介绍,会发现下面这一段话:

MDN :active
[1] By default, Safari Mobile does not use the :active state unless there is a touchstart event handler on the relevant element or on the <body>.

也就是说,在iOS中,我们需要绑定一个touchstart事件来激活这一行为。代码如下:

document.addEventListener('touchstart', function(){});

经过反复测试,得出结论如下:

  1. 安卓机型上触发反馈会有延迟。和click的300ms延迟一样。

  2. ios上按住反馈元素后再将手指移出元素,反馈效果依然还在。(正常情况,手指移出元素应当取消反馈效果)

测试demo: http://www.dearhaoge.com/touchFeedback/demo/delay-test.html

a 标签包裹

在移动端,有个还在草案中的属性-webkit-tap-highlight-color,定义了点击一个超链接显示的颜色。MDN上描述如下:

-webkit-tap-highlight-color
-webkit-tap-highlight-color is a non-standard CSS property that sets the color of the highlight that appears over a link while it's being tapped. The highlighting indicates to the user that their tap is being successfully recognized, and indicates which element they're tapping on.

所以,我们可以在需要反馈的元素上包裹一层a标签,然后设置这个属性。缺点是只能设置颜色和透明图(rgba)。如果想要设置一些动画效果(比如去哪网首页的缩放效果),这个方案也是不适用的。

自定义添加 class

第三个方法通过自定义touch事件来触发反馈,具体方法如下文所示:

如何让 H5 体验接近 APP:(一)触摸反馈

在touchstart触发的时候,给元素加上class(比如图中是波纹效果)并且在手指持续放在元素上的时候保持class不被移除。

如何让 H5 体验接近 APP:(一)触摸反馈

touchmove移出元素或者触发滚动条时移除class。当然,touchend和touchcancel也必须移除反馈class。

总结

如果只是想要简单实现的话,可以选择前两种方案,配置相对简单。追求良好体验的童鞋推荐第三种方案,第三种方案整体思想不是很复杂,但也不能对所有的交互元素都单独配置一次,这样也有失代码的优雅。

经过思考和折腾,本人提出了一个方案-->touchFeedback.js,在用户体验和开发体验之间取了一个平衡,这里是一些使用touchFeedback.js做的反馈效果(PC需要模拟手机查看):一些有趣的反馈效果

项目地址: https://github.com/backToNature/touchFeedback

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
3年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
HTML5游戏开发凭什么这么火?看了你就知道了...
很多人都会问H5游戏(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fedu.51cto.com%2Fcourse%2Fcourse_id1307.html)有前途吗?其实我个人是比较看好H5的前景,尤其是在这个移动互联网的时代,Web技术的触角必然会深入到各个领域.当然H5目前仍然
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Java服务总在半夜挂,背后的真相竟然是... | 京东云技术团队
最近有用户反馈测试环境Java服务总在凌晨00:00左右挂掉,用户反馈Java服务没有定时任务,也没有流量突增的情况,Jvm配置也合理,莫名其妙就挂了
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
算法研
算法研
Lv1
殊方日落玄猿哭,旧国霜前白雁来。
文章
3
粉丝
0
获赞
0