该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

正在学习或者自学html5的小伙伴,是不是有的已经让video动画整疯掉了呢?哈哈!下面华清远见的小编就为大家两种实现方式!好好学习哦!

(1) canvas元素结合JS

(2) CSS3结合Jquery实现

知道如何使用CSS3动画比知道如何使用元素更重要:因为浏览器能够优化那些元素的性能(通常是他们的样式,比如CSS),而我们使用canvas自定义画出来的效果却不能被优化。原因又在于,浏览器使用的硬件主要取决于显卡的能力。目前,浏览器没有给予我们直接访问显卡的权力,比如,每一个绘画操作都不得不在浏览器中先调用某些函数。

1.canvas

html代码:

Animation in HTML5 using the canvas element

Your browser does not support the -element.Please think about updating your brower!

Slower

Play Faster

js代码:

定义一些变量:

var dx=5,//当前速率 rate=1,//当前播放速度 ani,//当前动画循环 c,//画图(Canvas Context) w,//汽车[隐藏的](Canvas Context) grassHeight=130,//背景高度 carAlpha=0,//轮胎的旋转角度 carX=-400,//x轴方向上汽车的位置(将被改变) carY=300,//y轴方向上汽车的位置(将保持为常量) carWidth=400,//汽车的宽度 carHeight=130,//汽车的高度 tiresDelta=15,//从一个轮胎到最接近的汽车底盘的距离 axisDelta=20,//汽车底部底盘的轴与轮胎的距离 radius=60;//轮胎的半径

为了实例化汽车canvas(初始时被隐藏),我们使用下面的自执行的匿名函数

(function(){ var car=document.createElement('canvas');//创建元素

car.height=carHeight+axisDelta+radius;//设置高度

car.width=carWidth;//设置宽度

w=car.getContext('2d');})();

点击“Play”按钮,通过定时重复执行“画汽车”操作,来模拟“帧播放”功能:

function play(s){//参数s是一个button if(ani){//如果ani不为null,则代表我们当前已经有了一个动画 clearInterval(ani);//所以我们需要清除它(停止动画) ani=null; s.innerHTML='Play';//重命名该按钮为“播放” }else{ ani=setInterval(drawCanvas,40);//我们将设置动画为25fps[帧每秒],40/1000,即为二十五分之一 s.innerHTML='Pause';//重命名该按钮为“暂停” }}

加速,减速,通过以下方法,改变移动距离的大小来实现:

function speed(delta){ var newRate=Math.max(rate+delta,0.1); dx=newRate/rate*dx; rate=newRate;}

页面加载的初始化方法:

//init function init(){ c=document.getElementById('canvas').getContext('2d'); drawCanvas();}

主调方法:

function drawCanvas(){ c.clearRect(0,0,c.canvas.width, c.canvas.height);//清除Canvas(已显示的),避免产生错误 c.save();//保存当前坐标值以及状态,对应的类似“push”操作 drawGrass();//画背景 c.translate(carX,0);//移动起点坐标 drawCar();//画汽车(隐藏的canvas) c.drawImage(w.canvas,0,carY);//画最终显示的汽车 c.restore();//恢复Canvas的状态,对应的是类似“pop”操作 carX+=dx;//重置汽车在X轴方向的位置,以模拟向前走 carAlpha+=dx/radius;//按比例增加轮胎角度 if(carX>c.canvas.width){//设置某些定期的边界条件 carX=-carWidth-10;//也可以将速度反向为dx*=-1; }}

画背景:

function drawGrass(){ //创建线性渐变,前两个参数为渐变开始点坐标,后两个为渐变结束点坐标 var grad=c.createLinearGradient(0,c.canvas.height-grassHeight,0,c.canvas.height); //为线性渐变指定渐变色,0表示渐变起始色,1表示渐变终止色 grad.addColorStop(0,'#33CC00'); grad.addColorStop(1,'#66FF22'); c.fillStyle=grad; c.lineWidth=0; c.fillRect(0,c.canvas.height-grassHeight,c.canvas.width,grassHeight); }

画车身:

function drawCar(){ w.clearRect(0,0,w.canvas.width,w.canvas.height);//清空隐藏的画板 w.strokeStyle='#FF6600';//设置边框色 w.lineWidth=2;//设置边框的宽度,单位为像素 w.fillStyle='#FF9900';//设置填充色 w.beginPath();//开始绘制新路径 w.rect(0,0,carWidth,carHeight);//绘制一个矩形 w.stroke();//画边框 w.fill();//填充背景 w.closePath();//关闭绘制的新路径 drawTire(tiresDelta+radius,carHeight+axisDelta);//我们开始画第一个轮子 drawTire(carWidth-tiresDelta-radius,carHeight+axisDelta);//同样的,第二个 }

画轮胎:

function drawTire(x,y){ w.save(); w.translate(x,y); w.rotate(carAlpha); w.strokeStyle='#3300FF'; w.lineWidth=1; w.fillStyle='#0099FF'; w.beginPath(); w.arc(0,0,radius,0,2*Math.PI,false); w.fill(); w.closePath(); w.beginPath(); w.moveTo(radius,0); w.lineTo(-radius,0); w.stroke(); w.closePath(); w.beginPath(); w.moveTo(0,radius); w.lineTo(0,-radius); w.stroke(); w.closePath(); w.restore();}

由于原理简单,并且代码中作了详细注释,这里就不一一讲解!

2.CSS3

你将看到我们未通过一句JS代码就完全实现了和上面一样的动画效果:

HTML代码(可以看到与CSS3中的HTML代码并无不同):

Animations in HTML5 using CSS3 animations

CSS:

JS代码:

首先引入在线API:

实现动画代码:

怎么样是不是很详细!是不是据详细呢?不要问我小编是怎么会的。小编才不会告诉你实在华清远见学习的!

html5生日福利页面,福利到!HTML5实现动画两种方式相关推荐

  1. 【转】系统缓存全解析二:动态缓存(2)-页面局部缓存的两种方式

    有时缓存整个页面是不现实的,因为页的某些部分可能在每次请求时都需要变化.在这些情况下,只能缓存页的一部分.顾名思义,页面部分缓存是将页面部分内容保存在内存中以便响应用户请求,而页面其他部分内容则为动态 ...

  2. Android页面数据传递的两种方式

    在android中实现页面中数据的传递有两种方式: 1:第一种数据传递的方式是通过inputExtra方法来进行数据的传递的 2:第二中方法是通过bundle的方法来实现数据的传递的 接下来我们首先来 ...

  3. HTML5实现动画三种方式

    HTML5实现动画三种方式 编者注:作者以一个运动的小车为例子,讲述了三种实现HTML5动画的方式,思路清晰,动画不仅仅是Canvas,还有css3和javascript.通过合理的选择,来实现最优的 ...

  4. react 调用 html5,React-Native Webview 和H5交互的两种方式

    React-Native WebView 和H5交互有两种方式: 方式1:RN Webview 向H5注入JS 此方式可作为Webview向H5端传递数据. RN Webview 有以下属性,可以注入 ...

  5. 进一步封装axios并调用其读取数据(吐槽~在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据)

    注意!!!(修改于2020年7月18日) 在安卓9.0以下或者IOS10.X以下手机端H5页面不支持,在这两种情况下的系统只能使用ajax或者原生js请求后台数据 报错截图如下 报错内容: {&quo ...

  6. java提交数据到另一个页面_JS实现把一个页面层数据传递到另一个页面的两种方式...

    由于之前面试,被问到过此问题,所以今天特意整理了一下.由于自己技术水平有限,若存在错误,欢迎提出批评. 本博客整理了两种方式从一个页面层向另一个页面层传递参数. 一. 通过cookie方式 1. 传递 ...

  7. 页面导航的两种方式——声明式导航、编程式导航||vue-router编程式导航||router.push() 方法的参数规则

    页面导航的两种方式 vue-router编程式导航 编程式导航基本用法 <!DOCTYPE html> <html lang="en"><head&g ...

  8. JSP页面中的pageEncoding和contentType两种属性

    关于JSP页面中的pageEncoding和contentType两种属性的区别: pageEncoding是jsp文件本身的编码 contentType的charset是指服务器发送给客户端时的内容 ...

  9. javascript控制页面控件隐藏显示的两种方法

    javascript控制页面控件隐藏显示的两种方法,方法的不同之处在于控件隐藏后是否还在页面上占位 方法一: document.all<"PanelSMS">.styl ...

最新文章

  1. 2022年十大AI预测
  2. Android 使用Application类保存应用的全局数据
  3. 开源的那些事儿之如何看待开源
  4. python从入门到放弃系列恶搞短片-太惨!学Python方法用错,直接从入门到放弃!...
  5. 小程序 生成条形码barcode.js
  6. NLB+Cluster(一)
  7. [vue] 你知道vue2.0兼容IE哪个版本以上吗?
  8. java简述标识符和保留字区别_Java 基础语法 - 流年似水莫停留的个人页面 - OSCHINA - 中文开源技术交流社区...
  9. 扇贝和不背单词_你还没找到中意的背单词APP?我都试过,我来帮你盘点盘点
  10. java 使用 lamba 表达式处理二维数组
  11. 【CAIL2021】任务① | 阅读理解
  12. springboot mybatis如何打印出查询语句_Java 面试,如何坐等 offer?
  13. swoft使用phpunit之CodeCoverage
  14. linux flex安装包,安装flex builder for Linux在Ubuntu
  15. 公众平台手机版来临 微信公众平台推出手机版运营中心
  16. PHPExcel导入excel的内容以及表格里的图片
  17. Linux下的Curses库的下载与安装
  18. 太简单了!串口触摸屏开发HMI的全流程介绍
  19. java的login_Java中login的两种实现方式
  20. 考研数据结构之查找(9.8)——练习题之编写一个函数利用二分查找算法在一个有序表中插入关键字k并保持表的有序性(C表示)

热门文章

  1. android 浏览器 cookie,从Android的浏览器中传递cookie数据到App中
  2. 程序员们,快把这款AI“魔法”做到手机相机里,求求了
  3. 电脑颜色 (视力保护的最佳选择) 什么颜色对眼睛最好?
  4. 799. 香槟塔 ----- 动态规划、模拟、逆向
  5. worpress主题ripro7.2美化设计子主题(兼容ripro7.2集成后台+无加密无授权)
  6. 《暗恋是一种美丽的情愫》
  7. java安装教程win10_Java安装教程win10
  8. oracle排序函数
  9. sql拼接字段,拼接同1行的不同列,拼接同1列的不同行
  10. 为四川汶川捐款可靠的三大途径(来源于百度)