在移动设备中,几乎所有的操作都和触摸有关,而基于这一特性,近年来在移动端中也兴起了一些较为特别的交互方式。用手指在屏幕上“刮奖”就是其中的一个非常典型的例子,它不仅需要前端设计师能够熟悉触摸手势的控制方法,还需要设计师掌握一定的图像处理技巧。接下来我们就将通过制作一个简单的刮奖案例,来了解HTML5中触摸操作的相关知识。
1. 触摸交互操作基础——Touch与Click的区别
在移动设备上,人们的交互方式不再是键盘和鼠标,而是手指。因此,对应的移动端页面的交互方式也会与桌面端有所不同。
在桌面端,为某个提交按钮制作点击功能,可以使用如下的JavaScript代码:
var submit = document.getElementById("submit"); submit.onclick = function(){ // 功能代码 };
以上代码使用了onclick事件来对应鼠标的点击行为。然而,在iPhone这样的移动端测试时,我们会发现onclick事件有大约半秒的延迟,这是因为iOS系统需要等待一段时间来判断用户是点击还是拖动。要使得用户在移动端的交互更为流畅,则需要使用到Touch事件,使页面得知用户的交互行为不是一次点击,而是一次“触摸”。代码如下:
submit.addEventListener("touchstart", submitForm); function submitForm(){ // 功能代码 }
以上代码使用了addEventListener方法为submit元素注册了事件侦听,侦听的事件为touchstart,触发的函数为submitForm()。也就是说,当用户在移动设备中触摸这个submit按钮时,就会触发按钮的touchstart事件,并执行submitForm函数。
在触发touchstart事件时,也会同时产生一个event对象,在这个对象中包括了触摸行为的各种信息,如我们可以用以下代码输出触摸点的个数:
function submitForm(event){ submit.innerHTML = "触摸点个数为" + event.touches.length; }
我们也可以获取到触摸点的x、y位置属性,其属性名分别为pageX和pageY。以下代码将输出第一个触摸点的x坐标:
function submitForm(event){ submit.innerHTML = "第一个触摸点的X位置" + event.touches[0].pageX; }
除touchstart外,在HTML5中与触摸相关的事件还包括touchmove和touchend,前者是在手指拖曳页面元素的过程中不断触发,而后者是手指从一个页面元素上移开时触发。
除touch事件外,在iOS设备中还提供了gesture事件,即多指操作。可以这么理解,当用户将一根手指放到按钮上时,此时触发了touch,而此时将第二根手指也放到按钮上时,就触发了gesture(手势)事件。我们将在随后的教程中对手势操作进行详细讲解。
在了解了触摸事件基础知识后,接下来,我们将使用touch时间来制作“刮奖”效果。
2. HTML素材准备——准备好HTML代码、必要的CSS样式和素材文件
首先,我们在页面中创建一个Canvas元素,并将其放入一个div容器中
3. 利用触摸事件实现刮奖效果——编写JavaScript代码
我们希望刮奖的结果默认被一个颜色涂层所覆盖,用户直接是看不到这一结果的,只有当用手指在屏幕中“刮一刮”以后,才能够通过擦除涂层看到下方的奖项。这一操作需要在JavaScript中完成,代码如下:
<script type="text/javascript"> var canvas=document.getElementById("mask"); var context=canvas.getContext("2d"); context.fillStyle="#D1D1D1"; //设置填充色为浅灰色 context.fillRect(0,0,240,65); //填充该颜色,以覆盖下方的背景图片 </script>
以上代码通过在Canvas中绘制了一块浅灰色的矩形,使其盖住了下方背景中的奖项图片
接下来,我们就需要制作基于触摸的交互功能,使得用户手指在移过涂层时,擦除掉相应区域的浅灰色。在此,我们可以运用Canvas中一种名为globalCompositeOperation的属性,通过将其设置为destination-out,使得在已经填充颜色的基础上再次进行绘制时,所绘制的区域变得透明,从而露出下方的奖项图片,代码如下:
context.globalCompositeOperation = 'destination-out';
接下来,我们为画布创建touchmove事件侦听,当手指在画布上移动时,在触摸的位置绘制相应的圆形,该圆形将与已有的填充色互相消减,从而擦去灰色涂层。代码如下:
canvas.addEventListener('touchmove', function(event) { //当手指在画布上移动时 event.preventDefault(); //先去除默认的响应行为 var touch = event.touches[0]; //获取触摸的第一个点 context.beginPath(); //开始路径的绘制 context.arc(touch.pageX-canvas.offsetLeft,touch.pageY-canvas.offsetTop,20,0,Math.PI*2); //在所触摸处绘制圆形,半径为20像素 context.closePath(); //结束路径绘制 context.fillStyle="#BDC3C7"; //随意设置一种绘制颜色 context.fill(); //填充该颜色 }); 在以上代码中,需要注意的是,圆形的绘制坐标值应该是当前的触摸位置对应的坐标值。但是触摸点的pageX和pageY属性返回的是针对整个页面的全局坐标,我们需要将上述属性值减去画布自身的x和y坐标,才能得到画布中所要绘制的圆形的坐标。 测试页面,现在我们就能够在屏幕上用手指“刮奖”了。 4. 案例收尾——一些需要考虑的细节 看上去刮奖效果就这样顺利地完成了。但是设想一下,在我们实际开发中,用户刮奖完毕后基本都将跳转到下一个界面,来提示领奖的具体信息等,而如何判断用户是不是已经刮奖完毕呢?用户如果只零星触摸了一两下,是不会刮开所有涂层的,也看不到完整的获奖信息。我们在此做了一个假设,当90%的涂层像素都被抵消掉以后,即90%的面积都被刮开时,用户才已较为完整地得到了获奖信息,此时可以判断刮奖已经结束。代码如下: canvas.addEventListener('touchmove', function(event) { //此前代码省略 var imgData = context.getImageData(0,0,240,65); //获取画布中的所有像素 var pixelsArr = imgData.data; //得到像素的字节数据 var loop = pixelsArr.length; //获取该数据的长度 var transparent = 0; //设置一个变量来记录已经变为透明的像素点的数量 for (var i = 0; i < loop; i += 4) { //循环遍历每一个像素 var alpha = pixelsArr[i + 3]; //获取每个像素的透明度数值 if (alpha < 10) { //当透明度小于10时,认为它已经被擦除 transparent++; //使transparent数值加1 } } var percentage = transparent / (loop / 4); //计算透明像素在所有像素点中所占比例 if(percentage>.9){ //当该比例大于90%时 document.getElementById("status").innerHTML = "刮奖结束!"; //显示刮奖结束字样 } });
现在,再次刷新页面,当我们刮奖到一定程度时,下方就将显示出“刮奖结束”字样。
所有代码:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-scale=1.0,user-scalable=no,maximum-scale = 1.0"> <title>Touch实践</title> <style type="text/css"> #guajiang{ width:240px; height:65px; background:url(./guajiang.fw.png) no-repeat; background-size: auto 100%; } </style> </head> <body> <div id="guajiang"> <canvas width="240" height="65" id="mask"></canvas> </div> <script type="text/javascript"> var canvas=document.getElementById("mask"); var context=canvas.getContext("2d"); context.fillStyle="#D1D1D1"; //设置填充色为浅灰色 context.fillRect(0,0,240,65); //填充该颜色,以覆盖下方的背景图片 context.globalCompositeOperation = 'destination-out';//再次绘制时所经过区域变透明 canvas.addEventListener('touchmove', function(event) { //当手指在画布上移动时 // event.preventDefault(); //先去除默认的响应行为 var touch = event.touches[0]; //获取触摸的第一个点 context.beginPath(); //开始路径的绘制 context.arc(touch.pageX-canvas.offsetLeft,touch.pageY-canvas.offsetTop,10,0,Math.PI*2); //在所触摸处绘制圆形,半径为20像素 context.closePath(); //结束路径绘制 context.fillStyle="#BDC3C7"; //随意设置一种绘制颜色 context.fill(); //填充该颜色 var imgData = context.getImageData(0,0,240,65); //获取画布中的所有像素 var pixelsArr = imgData.data; //得到像素的字节数据 var loop = pixelsArr.length; //获取该数据的长度 var transparent = 0; //设置一个变量来记录已经变为透明的像素点的数量 for (var i = 0; i < loop; i += 4) { //循环遍历每一个像素 var alpha = pixelsArr[i + 3]; //获取每个像素的透明度数值 if (alpha < 10) { //当透明度小于10时,认为它已经被擦除 transparent++; //使transparent数值加1 } } var percentage = transparent / (loop / 4); //计算透明像素在所有像素点中所占比例 if(percentage>.3){ //当该比例大于90%时 alert("结束") // document.getElementById("status").innerHTML = "刮奖结束!"; //显示刮奖结束字样 } }); </script> </body> </html>
拓展:H5新属性---最高兼容IE9!!!
<canvas> 标签定义图形,比如图表和其他图像。
<canvas> 标签只是图形容器,必须使用脚本来绘制图形。
这个 HTML 元素是为了客户端矢量图形而设计的。它自己没有行为,但却把一个绘图 API 展现给客户端 JavaScript 以使脚本能够把想绘制的东西都绘制到一块画布上。
默认情况下 <canvas> 元素没有边框和内容
本身是没有绘图能力的。所有的绘制工作必须在 JavaScript 内部完
相关推荐
在当今的移动互联网时代,为了提高用户交互体验和安全性,手势解锁已经成为一种流行的技术。本篇文章将深入探讨“devin-h5手势解锁”这一技术,它是基于HTML5实现的一种轻量级、易用的手势解锁解决方案,由devin开发...
H5(HTML5)是下一代超文本标记语言,提供了更丰富的交互性和多媒体支持。电子签名,简单来说,是指通过电子方式创建的一种与手写签名或印章具有同等法律效力的签名形式。在H5环境下,用户可以通过触控设备或鼠标...
3. **事件监听**:用户通过触摸屏或键盘进行交互,开发者需要监听和处理这些事件,如触摸开始、结束和移动,以及按键按下和释放。 4. **动画制作**:通过requestAnimationFrame实现平滑的游戏动画效果,确保帧率...
还有,为了增加用户体验,JavaScript可能会添加触摸事件处理,使得在触屏设备上操作更加流畅。 总的来说,"h5 适配手机 -城市选择器" 是一个综合运用了HTML5、CSS和JavaScript技术的Web组件,旨在为移动用户提供...
通过学习和实践这个H5小游戏项目,开发者不仅可以掌握基础的H5开发技能,还能提升自己的项目管理和优化能力,同时对移动互联网营销有所了解。无论是个人成长还是职业发展,都是非常有价值的实践。
9. 交互细节:细节决定成败,如触摸区域大小、滚动行为、键盘交互等,都需要在设计规范中予以明确,以提升用户的操作效率和舒适度。 10. 设计工具与资源:为了便于设计师遵循规范,可能还会提供设计模板、组件库、...
在移动互联网时代,H5小游戏因其无需下载、即开即玩的特点,深受用户喜爱。"砸金蛋"是一款简单有趣的H5小游戏,适用于各种活动抽奖场景,如节日促销、公司年会等。本篇将深入探讨这款游戏的开发细节,带你一步步了解...
jSignature插件的核心功能是提供一个无刷新的画布,用户可以通过鼠标或触摸设备在上面绘制签名。这个签名可以被保存为多种格式,如JSON、PNG或SVG,便于存储和传输。数字签名的目的是确保数据的完整性和来源的不可...
标签“APP点餐系统”进一步强调了这是一个专门针对移动应用的解决方案,意味着该系统不仅需要在网页上运行,还应适配移动设备的特性,例如触摸操作和较小的屏幕尺寸。 至于压缩包内的“APP点餐系统HTML”和“3”这...
**H5移动Web开发指南** HTML5移动Web开发是当今互联网技术的重要组成部分,它使得开发者能够构建具有丰富功能和交互性的网页应用,特别是在移动设备上。随着智能手机和平板电脑的普及,HTML5移动Web开发的需求日益...
在交互设计方面,H5提供了丰富的API和元素,如drag and drop(拖放)用于商品的添加和移除,Touch事件用于移动端的触摸操作优化。此外,利用CSS3的Flexbox或Grid布局,可以轻松创建响应式界面,确保购物车在不同屏幕...
"h5 移动开发框架.zip" 文件很可能包含了一个用于快速搭建H5移动应用的基础架构,名为 "h5-mobile-scaffold-master"。这个框架可能是开发者为了简化H5移动应用开发流程而设计的一套工具集,它可以帮助开发者快速地...
同时,还可以添加触摸事件支持,以适应移动设备的触屏操作。 五、CSS样式设计 为了提升游戏视觉效果,CSS3可以用来美化棋盘和棋子的外观。通过设置边框、阴影、渐变等样式,使棋盘更立体,棋子更有质感。此外,...
此外,H5还支持触摸事件,使得在移动设备上的操作更加流畅,提升了用户的触控体验。 四、H5在实际应用中的场景 1. **移动应用**:许多移动应用选择使用H5技术进行开发,如微信小程序、支付宝小程序等,因为它们...
- **触控优化**:针对移动设备的触摸操作进行优化,确保滑动、点击等交互顺畅。 - **加载提示**:在数据加载或异步操作时,使用加载动画让用户知道系统状态。 - **错误提示**:友好地提示用户可能出现的问题,如...
玩家通过触摸屏幕或鼠标操作摇杆,控制游戏人物或视角的移动,从而实现游戏内的交互。 实现H5仿游戏操作杆的关键技术包括: 1. HTML5 Canvas:Canvas是H5中的一个重要元素,它允许开发者通过JavaScript来绘制图形...
H5移动时间控件是HTML5为提升用户体验,特别是在移动设备上操作日期和时间的一种重要组件。它允许用户方便地选择日期、时间或者日期时间组合,常见于表单填写、日程安排等应用场景。 一、H5移动时间控件概述 HTML5...
"mobile"标签则揭示了这个项目是面向移动设备的,这意味着在设计和开发时,需要考虑不同屏幕尺寸、触摸操作和网络环境等因素,以确保在各种移动设备上都能提供良好的用户体验。 综上所述,"纯H5小树长大"项目是一个...
然而,仅仅使用标签可能无法满足所有设计需求,特别是在移动设备上,需要考虑触摸交互和响应式设计。这就是AUDIOPLAYER插件的用武之地。AUDIOPLAYER插件是一款专门针对HTML5音频元素的增强工具,它提供了丰富的...
总结起来,"h5手机端触摸裁剪图片相片cropper.js"是一个基于HTML5和JavaScript的轻量级库,专为手机移动端设计,提供触摸操作的图片裁剪功能。借助cropper.js,开发者可以轻松创建响应式、交互性强的图片裁剪界面,...