CSS3动画之利用requestAnimationFrame触发重新播放功能

来源:脚本之家  责任编辑:小易  

动画函数啊,在函数logo中进行控制就可以了。你的logo定义的不对应该是logo(time)。

css动画

HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了:(1) 你可以用CSS3的a

css3中引入了animation模块,自此css动画进入了我们的视野。css动画名符其实,会写css样式就可以创作动画,对一些不怎么会JS的设计师也是比较包容的。但也正因为如此,当你需要重新播放或者说手动触发动画时,css的局限性就突显出来了,毕竟它不是一门编程语言。像这种在页面中创建一个按钮,点击按钮时开始播放一段动画这种活交给JS才是最合适的。

(1) 你可以用CSS3的animattion+keyframes;(2) 你也可以用css3的

原理和思路

HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了:(1) 你可以用CSS3的a

重新播放css动画,我们只需要将CSS动画效果 删除 ,然后再 重新加上 css动画效果即可。那么如何让浏览器理解我们的意图呢,今天的主角 requestAnimationFrame ,这个任务就交给它来完成。 requestAnimationFrame 会告诉浏览器--你需要执行一个动画,并要求在下一次重绘前调用指定的回调函数更新动画。也就是 requestAnimationFrame 需要传入一个回调函数作为参数,这个函数会在浏览器下一次重绘之前执行。 这个机制可以用花费最短的时间让浏览器理解我们需要重新播放动画的意图。

来看MDN上对其给出的诠释: The window.requestAnimationFram

当然 requestAnimationFrame 只是其中的一步,我们还需要再加上个小技巧-- 分离动画样式 .

探探和陌陌作为主打陌生人社交的社交软件,可谓是有所同,有所不同。场景相同,功能不同。虽然陌陌和探探都是主打基于LBS(地理位置)的陌生人社交软件。而抛开二者本身具备的社交功能以外,陌陌作为发展多年的老大哥,在经历了上市又退市的风波后,也是一路高歌猛进,跟上了直播、短视频等风口。而探探似乎仍旧克制而又保守的留在社交工具阶段。陌陌:社交工具、直播、短视频、社区探探:社交工具功能带动盈利从目前的角度来看,我们分析两者的盈利模式,其实是大有不同的。首先陌陌在盈利模式已经足够清晰。增值服务(会员服务)、广告植入(开屏以及信息流推送)、直播功能。以上这3点已经足够支撑陌陌的盈利模式,在流量基数充裕的前提下

关键代码

谢谢邀请!水猴子又叫水鬼,水猴,日本称之为河童。传说中生活在水里,能把人拖下水死死抱住直到淹死,在水里力大无穷,甚至一个成年男性也打不过它。它的个头像几岁的孩童那么高,相貌类似于水獭。以上这些都是源自民间传说。大家有没有发现,这样传说所描述的东西用心理学解释就很容易明白了。第一点,这些传说一定是有水地区才有的,反映了过去科学不发达的时候,人们对无法解释的东西如死亡恐惧,用想象来做解释。就像远古时期,远古祖先无法解释打雷闪电,就发明了龙的传说一样。人的大脑需要一个解释,需要自己理解,才会觉得安全,有掌控感。第二点,溺水的感觉就像水里有东西死死抱住自己一样,我想有过溺水经验的人应该能深深体会那种恐

<template> <div class="page-animate"> <button @click="handleAnimate">开始动画</button> <div class="rabbit-box"> <div class="rabbit" ref="rabbit"></div> </div> </div> </template> <script> export default { name: "animate", methods: { handleAnimate() { let $rabbit = this.$refs.rabbit; $rabbit.classList.remove('animated'); window.requestAnimationFrame(()=> { window.requestAnimationFrame(()=>{ $rabbit.classList.add('animated'); }) }) } } } </script> <style lang="less"> .page-animate { .rabbit-box { margin-top: 10px; width: 100px; height: 100px; background:#e2b29f; font-size:120%; padding: 100px; border-radius: 50%; } .rabbit { width:5em; height:3em; background:#ffffff; border-radius:70% 90% 60% 50%; position:relative; box-shadow: -0.2em 1em 0 -0.75em #b78e81; transform:rotate(0deg) translate(-2em,0); z-index:1; .no-flexbox & {margin:10em auto 0;} //tail, eye, feet &:before { content:""; position:absolute; width:1em; height:1em; background:white; // tail border-radius:100%; top:0.5em; left:-0.3em; box-shadow: 4em 0.4em 0 -0.35em #3f3334, // eye 0.5em 1em 0 white, // back foot 4em 1em 0 -0.3em white, // front foot 4em 1em 0 -0.3em white, 4em 1em 0 -0.4em white;; } // ears &:after { content:""; position:absolute; width:.75em; height:2em; background:white; border-radius:50% 100% 0 0; transform:rotate(-30deg); right:1em; top:-1em; border-top:1px solid #f7f5f4; border-left: 1px solid #f7f5f4; box-shadow:-0.5em 0em 0 -0.1em white; } &.animated { animation: hop 1s linear; &:before { animation: kick 1s linear; } } } @keyframes hop { 20% { transform:rotate(-10deg) translate(1em,-2em); box-shadow: -0.2em 3em 0 -1em #b78e81; } 40% { transform:rotate(10deg) translate(3em,-4em); box-shadow: -0.2em 3.25em 0 -1.1em #b78e81; } 60%,75% { transform:rotate(0) translate(4em,0); box-shadow: -0.2em 1em 0 -0.75em #b78e81; } } @keyframes kick { 20%,50% { box-shadow: 4em 0.4em 0 -0.35em #3f3334, 0.5em 1.5em 0 white, 4em 1.75em 0 -0.3em white, 4em 1.75em 0 -0.3em white, 4em 1.9em 0 -0.4em white; } 40% { box-shadow: 4em 0.4em 0 -0.35em #3f3334, 0.5em 2em 0 white, 4em 1.75em 0 -0.3em white, 4.2em 1.75em 0 -0.2em white, 4.4em 1.9em 0 -0.2em white; } } } </style>

这是一种误解。实际上,腾讯不但是中国最大的游戏公司,同时也是世界最大的游戏公司。据Newzoo的分析师们的报告,2016年腾讯的游戏业务贡献了102亿美元的总收入,占全球游戏市场的比例已经高达10%。腾讯游戏业务比全球第二名的索尼(同样是只计游戏业务)还多出了23亿美元。2016年,动视暴雪游戏收入为68亿美元,微软游戏额收入为66亿美元,EA“只有”47亿美元,任天堂18亿美元。值得注意的是,网易同期收入为43亿美元,排全球第7位。所以说,腾讯和网易,已经是具备国际竞争力的游戏公司,甚至已经占有相对的优势地位。腾讯和网易的崛起,是和中国成为全球最大的游戏市场分不开的。据Newzoo最新的统计

效果:

:grin:为了生动形象一些,特地找了个兔子的CSS动画。css类 .rabbit 中只定义了兔子的外观,没有定义动画相关的信息。我们把动画相关的信息都放到了 .animated 类中。

 范冰冰和林志玲哪个比较美?这简直是个千古难题。不过,她俩这次要同台正式比一比了,要出大事儿啦!  范冰冰VS林志玲,一言不合同框比美!  作为国内第三季度唯一的时尚类综艺节目,已经成功播出两季的《女神的新衣》正式升级为《我的新衣》。不过这都不是今天的重点,重点是:首期的特邀嘉宾就赫然有范冰冰在列,林志玲更是要成为常驻嘉宾啦!        在流出的录制花絮照中,冰冰一身清纯的白色立体花朵刺绣裙装亮相,一改往日霸气的“范爷”本色,又仙又轻巧。      巧合的是,林志玲在节目中也选择了白色的造型亮相,V领连体裤性感干练又有些知性。怎么有种刚开始就要正面交锋的感觉?  范冰冰:风情万种的女王,也

demo传送

handleAnimate 函数是我们的关键部分: $rabbit.classList.remove('animated') 的作用是每次点击按钮的时候删除动画效果。 requestAnimationFrame 这里用到了两次,而且是嵌套着使用,为何要如此呢?其实也好理解,有个细节--删除Dom元素的class类后,只有在样式重新计算后才会生效,也就是要等到下一次重绘。而 requestAnimationFrame 注册的回调函数是下一次重绘前,所以我们需要调用两次,相当于在中间插入了一个空隙专门用来让删除动画效果生效,然后紧接着下一次重绘重新触发动画。

总结

javascript 相对css更适合用来控制动画,动画的触发机制和浏览器渲染机制相关。

参考

MDN

 总结

以上所述是小编给大家介绍的CSS3动画之利用requestAnimationFrame触发重新播放功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

window.requestAnimationFrame是什么意思,怎么用

  window.requestAnimationFrame()方法用于告诉浏览器,你想在浏览器的下个重绘 之前来执行一个动画或者执行浏览器通过调用一个特定的函数来更新动画的请求。该方法会在下次重回之前执行一个作为参数的回调函数。

  简单的说就是告诉浏览器在刷新屏幕的时候,调用这个方法。

  以前用js来实现动画,我们一般借助setTimeout或setInterval这两个函数,css3动画出来后,我们又可以使用css3来实现动画了,而且性能和流畅度也得到了很大的提升。

  requestAnimationFrame 是专门为实现高性能的帧动画而设计的一个API,目前已在多个浏览器得到了支持,包括IE10+,Firefox,Chrome,Safari,Opera等,在移动设备上,ios6以上版本以及IE mobile 10以上也支持requestAnimationFrame,唯一比较遗憾的是目前安卓上的原生浏览器并不支持requestAnimationFrame,不过对requestAnimationFrame的支持应该是大势所趋了,安卓版本的chrome 16+也是支持requestAnimationFrame的。

例子

window.requestAnimationFrame = window.requestAnimationFrame || window.mozRequestAnimationFrame ||

window.webkitRequestAnimationFrame || window.msRequestAnimationFrame;

var start = null;

var d = document.getElementById("SomeElementYouWantToAnimate");

function step(timestamp) {

var progress;

if (start === null) start = timestamp;

progress = timestamp - start;

d.style.left = Math.min(progress/10, 200) + "px";

if (progress < 2000) {

requestAnimationFrame(step);

}

}

requestAnimationFrame(step);

如何停止requestAnimationFrame方法启动的动画

  HTML5/CSS3时代,我们要在web里做动画选择其实已经很多了:

(1) 你可以用CSS3的animattion+keyframes;

(2) 你也可以用css3的transition;

(3) 你还可以用通过在canvas上作图来实现动画,也可以借助jQuery动画相关的API方便地实现;

(4) 当然最原始的你还可以使用window.setTimout()或者window.setInterval()通过不断更新元素的状态位置等来实现动画,前提是画面的更新频率要达到每秒60次才能让肉眼看到流畅的动画效果。

  现在又多了一种实现动画的方案,那就是还在草案当中的 window.requestAnimationFrame()方法。

  

  初识requestAnimationFrame

来看MDN上对其给出的诠释:

The window.requestAnimationFrame() method tells the browser that you wish to perform an animation and requests that the browser call a specified function to update an animation before the next repaint. The method takes as an argument a callback to be invoked before the repaint.

  window.requestAnimationFrame()将告知浏览器你马上要开始动画效果了,后者需要在下次动画前调用相应方法来更新画面。这个方法就是传递给window.requestAnimationFrame()的回调函数。

  也可这个方法原理其实也就跟setTimeout/setInterval差不多,通过递归调用同一方法来不断更新画面以达到动起来的效果,但它优于setTimeout/setInterval的地方在于它是由浏览器专门为动画提供的API,在运行时浏览器会自动优化方法的调用,并且如果页面不是激活状态下的话,动画会自动暂停,有效节省了CPU开销。

基本语法

(1)可以直接调用,也可以通过window来调用,接收一个函数作为回调;

(2) 返回一个ID值,通过把这个ID值传给window.cancelAnimationFrame()可以取消该次动画。

requestAnimationFrame(callback)//callback为回调函数

  一个简单的例子

模拟一个进度条动画,初始div宽度为1px,在step函数中将进度加1然后再更新到div宽度上,在进度达到100之前,一直重复这一过程。

  为了演示方便加了一个运行按钮(点击观看效果)

html>

<head>

<meta charset="gbk">

<title>动画</title>

</head>

<body>

<div id="test" style="width:1px;height:17px;background:#0f0;">0%</div>

<input type="button" value="Run" id="run"/>

<input type="button" value="停止" id="stop"/>

</body>

<script>

  window.requestAnimationFrame =

window.requestAnimationFrame || window.mozRequestAnimationFrame || window.webkitRequestAnimationFrame

|| window.msRequestAnimationFrame;

var start = null;

var ele = document.getElementById("test");

var progress = 0;

var stop=null;

function step(timestamp) {

if(progress>=100) progress=0;

progress += 1;

ele.style.width = progress + "%";

ele.innerHTML=progress + "%";

if (progress < 100) {

stop=requestAnimationFrame(step);

}

}

document.getElementById("run").addEventListener("click", function() {

ele.style.width = "1px";

step();

}, false);

document.getElementById("stop").addEventListener("click", function() {

window.cancelAnimationFrame(stop);//可以取消该次动画。

}, false);

  </script>

</html>

css3动画和javascript动画相比谁更快

CSS动画和JS动画主要的不同点是

功能涵盖面,JS比CSS3大

定义动画过程的@keyframes不支持递归定义,如果有多种类似的动画过程,需要调节多个参数来生成的话,将会有很大的冗余(比如jQuery Mobile的动画方案),而JS则天然可以以一套函数实现多个不同的动画过程

时间尺度上,@keyframes的动画粒度粗,而JS的动画粒度控制可以很细

CSS3动画里被支持的时间函数非常少,不够灵活

以现有的接口,CSS3动画无法做到支持两个以上的状态转化

实现/重构难度不一,CSS3比JS更简单,性能调优方向固定

对于帧速表现不好的低版本浏览器,CSS3可以做到自然降级,而JS则需要撰写额外代码

CSS动画有天然事件支持(TransitionEnd、AnimationEnd,但是它们都需要针对浏览器加前缀),JS则需要自己写事件

CSS3有兼容性问题,而JS大多时候没有兼容性问题。

怎么控制requestanimframe动画时间间隔

如何使用requestAnimationFrame?

window.requestAnimFrame方法的使用方法如下所示:

window.requestAnimFrame = (function(){

return window.requestAnimationFrame ||

window.webkitRequestAnimationFrame ||

window.mozRequestAnimationFrame ||

window.oRequestAnimationFrame ||

window.msRequestAnimationFrame ||

function( callback ){

window.setTimeout(callback, 1000 / 60);//定义每秒执行60次动画

};

})();

//相当于使用setInterval(render, 16)方法,但是具有更高的性能

(function animloop(){

requestAnimFrame(animloop);

render();

})();

为什么别人做的页面动画都很酷炫流畅?

一个好的前端界面中很重要的内容就是动画,使用符合场景的动画不仅可以优化网站页面中的交互细节,提高用户体验,还可以让页面更具有吸引力,给网站带来更多访问量。通常在前端中,实现动画的方案主要有6种,接下来,小编带你们一一解析这6中实现方案。

JavaScript直接实现动画

JavaScript直接实现动画的方式在前端早期使用较多,起主要的思想是通过JavaScript的setInterval方法或setTimeout方法的回调函数来持续调用改变某个元素的CSS样式以打到元素样式持续变化的结果。例如jQuery的animate()方法就属于这种实现方式不过需要注意的是,通过JavaScript实现动画通常会导致页面频繁重排重绘,很消耗性能,如果是稍微复杂的动画,在性能交差的浏览器上就会明显感觉到卡顿,所以我们尽量避免使用它。

SVG动画

SVG又称可伸缩矢量图形,源生支持一些动画效果,通过组合可以生成较复杂的动画,而且不需要使用JavaScript参与控制。以前这种动画实现的场景相对比较多,但随着CSS3的出现,这种动画实现方式相对使用的越来越少。

CSS3 transiton

CSS3出现后,增加了来年各种实现动画的方式:transition和animation,我们先来看看高效强大的CSS3过度动画transition。其实transiton并不能实现独立的动画,只能在某个标签元素样式或状态改变时进行平滑的动画过度,而不是马上改变。在移动端开发中,直接使用transition动画会让页面变慢甚至变卡顿,所以我们通常通过添加transform:translate3D(0,0,0)或transform:translateZ(0)来开启移动端动画的GPU加速,让动画过程更加流畅。

CSS3 animation

CSS3 animation的动画则可以认为是真正意义上页面内容的CSS3动画,通过对关键帧和循环稀疏的控制,页面标签元素会根据设定好的样式改变进行平滑过度。而且关键帧的状态的控制一般是通过百分比来控制的,这样我们就可以在这个过程中实现很多动画的动作了。

Canvas动画

canvas作为HTML5的新增元素,也可以借助Web API实现页面动画。Canvas动画的实现思路和SVG的思路有点类似,都是借助元素标签来打到页面动画的效果,都需要借助对应的一套API来实现,不过SVG的API可以认为主要是通过SVG元素内部的配置规则来实现的,而Canvas则是通过JavaScript API来实现的。

requestAnimationFrame

requestAnimationFrame是前端表现层实现动画的另一种API实现,他的原理和setTimeout及setInerval类似,但是他是浏览器针对动画专门优化而形成的API,在实现动画方面性能比setInterval要好。

总结

考虑到兼容性的问题,在项目实践中,一般我们在桌面浏览器端任然推荐使用JavaScript直接实现动画的方式或SVG动画的实现方式,移动端则可以考虑使用CSS3、canvas或requestAnimationFrame。


  • 本文相关:
  • 深入理解html5定时器requestanimationframe的使用
  • html5探秘:用requestanimationframe优化web动画
  • html5新增的定时器requestanimationframe实现进度条功能
  • html5+css3制作小型音乐播放器音频播放特效源码
  • 纯css3绘制磁带播放动画特效源码
  • jquery ui+css3制作圆形音乐播放器样式特效源码
  • html5+css3实现的列表式音乐播放器特效源码
  • 基于jquery+css3实现的鼠标点击烟花播放效果源码
  • html5/css3实现旋转图片播放焦点图特效源码
  • css3带播放按钮的鼠标悬停放大特效源码
  • window.requestAnimationFrame是什么意思,怎么用
  • 如何停止requestAnimationFrame方法启动的动画
  • css3动画和javascript动画相比谁更快
  • 怎么控制requestanimframe动画时间间隔
  • 为什么别人做的页面动画都很酷炫流畅?
  • 问一个css3的简单问题。。麻烦高手了。。
  • 如何停止requestAnimationFrame方法启动的动画
  • 如何停止requestAnimationFrame方法启动的动画
  • 如何停止requestAnimationFrame方法启动的动画
  • 如何停止requestAnimationFrame方法启动的动画
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved