CSS 动画指南: 原理和实战

CSS3 transition过渡:打造流畅动画效果的全面指南 transition属性是CSS3中用于定义元素从一种样式状态平滑过渡到另一种样式状态的动画效果。当元素的指定样式属性发生变化时,transition会自动为其添加一个过渡动画,而非立即跳变。Css.element {CSS3transition属性为网页元素的样式变化提供了优雅的过渡动画效果,极大地增强了网页的动态表现力和用户体验。通过深入理解transition属性的工作原理、组成部分以及实际应用技巧,您将能灵活运用这一特性,为您的项目增添生动而流畅的动画效果。 阅读详情

简介:无论动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是用Flash还是CSS, 动画的基本原理和设计准则都未曾变过的。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们以一个例子贯穿始终,利用传统动画的准则来逐步构建这个动画。


作者: Tom Waterhouse

原文连接:http://coding.smashingmagazine.com/2011/09/14/the-guide-to-css-animation-principles-and-examples/#more-105335

译者: feijia  (tiimfei@gmail.com)

(译者注:本文章中的示例页面需要翻墙,并推荐使用最新的FF,Chrome等查看)

下篇已经发表:

CSS 动画指南: 原理和实战(二)


Firefox和Webkit系列的浏览器都已经支持CSS 动画,是时候动手学习这个新的技术了。 不管动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是使用Flash技术还是CSS3, 制作动画的基本原理和设计准则都未曾改变。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们将以一个网球下落的例子贯穿始终,利用传统动画的准则来逐步构建这个CSS动画。最后我们会看一些真实世界里的CSS动画用法。 




CSS 动画属性


在开始前,我们需要了解CSS 动画的基础知识。 动画是一种新的CSS 特性,它可以在不借助JavaScript和Flash的情况下使绝大多数HTML元素动起来(例如div,h1,或者Span等等) 。 现在它已经被Webkit家族的浏览器(包括Safari 4+, Safari for iOS(iOS2+),Chrome1+ ) 以及Firefox 5 所支持。不支持这些属性的浏览器则会直接忽略它们,所以使用它们时最好确定你的页面不会完全依赖这些动画属性(译者:或者你可以使用一些代码来检查用户的浏览器是否支持css动画特性 https://developer.mozilla.org/en/CSS/CSS_animations/Detecting_CSS_animation_support)

目前这一属性还比较新,所以各家浏览器厂商在自己支持的属性前都加上了前缀 如-moz- (firefox), -webkit- (Safari 和Chrome)在本文的示例代码中为简洁起见,我们只使用-webkit- 前缀。

CSS动画的声明就是将一段描述动画的样式附加到目标元素上,

  1. /* 这是一段动画代码*/  
  2. @-webkit-keyframes example {  
  3.    from { transform: scale(2.0); }  
  4.    to   { transform: scale(1.0); }  
  5. }  
  6.   
  7. /* 这是动画即将应用的目标元素 */  
  8. div {  
  9.    -webkit-animation-name: example;  
  10.    -webkit-animation-duration: 1s;  
  11.    -webkit-animation-timing-function: ease; /* ease is the default */  
  12.    -webkit-animation-delay: 1s;             /* 0 is the default */  
  13.    -webkit-animation-iteration-count: 2;    /* 1 is the default */  
  14.    -webkit-animation-direction: alternate;  /* normal is the default */  
  15. }  

这段代码中,第一部分是描述动画的样式,名字叫“example",它可以出现在样式表中的任何位置,或前或后。在描述元素的类中可以使用animation-name 属性来指定要使用哪个动画效果。

跟其他的样式写法类似的,上面例子中的几个动画属性都可以简写成如下格式: 


  1. div {  
  2. -webkit-animation: example 1s ease 1s 2 alternate;  
  3. }  

甚至你也可以把所有的值都省略掉,这时浏览器会直接使用默认值。 好了,这些就是基本概念了,应该挺简单的吧?

传统动画的基本准则

迪士尼 - 传动动画的鼻祖和大师- 很早就提出了制作动画的12条准则,并出版了著作:The Illusion of life 来阐述这些准则。 这些基本的准则可以应用到所有的动画中去,实际上你不需要是个动画专家也可以学着遵循这些准则。 我们会试着遵循这12条“动画军规”,并使用CSS来实现更逼真可信的动画效果。 


挤压与拉伸(Squash and Stretch)



如果物体在运动过程中它本身的形体不发生任何变化,那会显得的非常僵硬。上图演示是一个夸张的弹跳的网球的草图。当网球从高处落下并撞击地面时,你会看到球被压扁了,而后它再次离地弹起时,又被拉长了。 

球被压扁和拉伸的过程能够让人感觉到网球的弹性,想象一下如果是一个又重又硬的保龄球掉落下来,肯定不会有这样的效果, 那肯定要把地板砸出个窟窿。
实现上面草图中网球球落地压扁再拉伸的效果,我们只要应用CSS3中的transform属性就能实现:

  1. @-webkit-keyframes example {  
  2.    0% { -webkit-transform: scaleY(1.0); }  
  3.    50% { -webkit-transform: scaleY(1.2); }  
  4.    100% { -webkit-transform: scaleY(1.0); }  
  5. }  

上述代码会在动画的不同阶段把页面对象按照纵向(y轴) 拉伸1.2倍再变回原样。

这段代码中我们使用了百分比的方式来指定了变形在动画过程中发生具体时间(也叫关键帧)。对于简单的动画,你可以直接使用from和to来指定开始和结束的动画状态。使用百分比,则可以更加精细的控制动画播放的关键过程。 

接下来我们可以使用translate 属性来让物体动起来。我们可以把transform和translate合并使用:

  1. 50% {  
  2. -webkit-transform: translateY(-300px) scaleY(1.2);  
  3. }  

使用translate属性可以在不改变对象其他属性(例如位置,高度或宽度)的前提下操纵对象的位置,因此该属性常用于CSS动画制作。上述例子代码,指定了球在动画播放中点(50%)处的样子,使它看起来像是正在反弹离开地面。 


注意:要看到我们的例子运行时的效果,你需要使用最新的FF,Chrome或Safari, 在本文写作时,Safari提供了最好的动画体验)

查看示例

好吧,我得承认到目前为止,这个动画还是挺垃圾的。但是我们已经向“逼真”这个目标迈进了第一步!

预期(Aniticipation)


预期,就是在人物出场或动作开始前的先兆,它可以增加悬念。例如,当一个人屈腿下蹲,就会让观众联想到他马上将要起跳了。在我们的掉落小球的动画里,如果我们在球出现之前,加上一个球的阴影,那么无疑是在为观众构造了一个悬念:马上要有一个球掉下来了!

查看示例

我们使用了一个新的DIV元素来表示阴影,这样我们就可以在动画中分别控制阴影和小球。 为了制造这种球即将下落的悬念,我们故意在动画开始时增加一点延时,让小球不是立即掉下来。 只要稍稍调整一下我们动画设置的百分比的位置即可:

  1. @-webkit-keyframes example {  
  2.    0% { -webkit-transform: translateY(-300px) scaleY(1.2); }  
  3.    35% { -webkit-transform: translateY(-300px) scaleY(1.2); } /* 和开始时同样的位置,即让球等待一会儿再下落 0% */  
  4.    65% { -webkit-transform: translateY(0px) scaleY(1.2); }    /* 当动画播放到65%时,球再开始下落 */  
  5.    67% { -webkit-transform: translateY(10px) scaleY(0.8); }  
  6.    85% { -webkit-transform: translateY(-100px) scaleY(1.2); }  
  7.    100% { -webkit-transform: translateY(0px); }  
  8. }  


在动画35%的关键帧设置中,球的位置没有变化,而到65%时,球才完全落地。 除了使用这种方法,你还可以用 animate-delay属性来设置动画延迟以达到增加悬念的效果

  1. div {  
  2. -webkit-animation-delay: 1s;  
  3. }  

舞台布局(Staging)

迪士尼动画电影里绚丽多彩的背景是表现人物的重要手段!因此我们也需要为我们的动画创造一个舞台。 


舞台同时也是帮助动画观众集中注意力的方法,就像在一个剧院中舞台上的聚光灯,会牵引观众的视线。 在我们的小球动画中,我已经加入了一个简单的背景,这个背景使得观众能够知道动画即将发生在页面的中央。

顺序动画和关键帧填充(Straight-Ahead vs. Pose to Pose)

传统动画中,有两种构建动画的手段。第一种是顺序动画,即从动画的第一帧开始绘制按照时间顺序一帧一帧的完成整个动画。第二种方法称为"Pose to Pose", 直译为从姿势到姿势。即先描绘出动画过程中若干关键帧的内容,然后再去填充关键帧之间的部分从而逐步完成整个动画。 填充关键帧之间内容的过程称为”in-betweening,” or “tweening,” 如果你制作过Flash动画,应该对这些术语不会陌生。 

对CSS动画而言,我们一般使用关键帧填充的方式来完成动画。我们先描述动画过程中的关键帧,而后浏览器会自动帮我们完成填充。 不过,有时候我们也需要借助顺序动画的方法来达到精细控制动画效果的目的,浏览器能够自动实现的效果总是有限的。

动作跟随和重叠(Follow-Through and Overlapping)

动作跟随的本质是物理学,要让动画逼真就得让其中的物体和人物的行为符合物理定律。动作跟随和动作重叠常常会用在人物动画中,尤其是肢体的运动,例如当人物把手臂或长发放下时,手臂或头发会在放下后继续前后摇摆一阵。再设想一下一个有啤酒肚的人物(比如史莱克)快速转身时的情形: 他的身体会先转过来,而他突出的肚子则会比身体转动的要慢一些。


对我们的例子而言,就是要让球下落时更符合物理定律。而我们之前展示的动画的小球下落时还不够自然。我们希望看到球可以自由落体式的下落然后再弹起来。 不过,且让我们继续看下一条军规。 

慢进慢出 (Slow  in and Slow Out)

这条规则讲得是物体的运动都是渐变的,加速和减速都需要过程。设想一辆高速行驶的汽车需要停下,如果画面中的汽车突然停下,那肯定让观众觉得不真实。大家都知道汽车停下来会经过减速的过程。因此要做到逼真,就必须模拟汽车先刹车减速,并最终慢慢停下的过程。 

这条规则和重力的效果也有关系。设想一个正在荡秋千的小孩子。当他从低荡到最高点时,他在逐渐减速,由高处再荡回来的过程又是逐渐加速的过程,他的将在秋千的最低点达到最快的速度。 然后他再此经历减速过程荡向反方向的高点。

  1. <img src="http://hi.youkuaiyun.com/attachment/201110/10/0_13182499848iN3.gif" alt="" />  

把这一准则应用到我们的例子中,通过调整小球进入画面和弹出画面的速度,我们可以让观众感到更加逼真的效果:当小球落到地面,并反弹起来的过程中,反弹的越接近高点它的速度就越慢。


在css中我们可以使用animation-timing-function 属性来配置动画随时间变化的速率:

  1. -webkit-animation-timing-function: ease-out;  

这一属性有4个可选值:

ease-in :开始时慢,并逐渐加速
ease-out: 开始时快,并逐渐减速停下
ease-in-out: 开始慢并加速,到中间时最快,然后又逐渐减速并停下
linear :匀速播放

你还可以使用bezier-curve 函数来创建自己的速率函数(easing speed)

查看示例


弧形运行(Arc)


和跟随准则一样,弧度准则也是基于对基本物理定律的观察:”弹起来的物体最终总会落下“, 考虑物体运行轨迹时,恰当运用弧线。

设想我们把小球从画面的左侧掷向舞台。 逼真的动画应该能够模拟出它沿着弧线(抛物线)落下,并弹起,再次沿弧线落下的过程。


使用CSS制作这样一个动画需要一些更加精细的控制。我们需要同时控制小球在纵向和横向两个方向上的运行。 因此我们实际上需要让小球一面平滑的自左向右运动,再结合上之前我们已经制作出的自由下落的动画。与其用一个复杂的动画来描述这两个方向的运动,我们可以直接使用2个动画来实现,更加简单。为了达到这一目的,我们需要在我们的小球之外再添加一个div并为它单独配置动画效果(横向运动)

HTML 代码:

  1. <div class="ball-arc">  
  2.    <div class="ball"></div>  
  3. </div>  

CSS代码:

  1. .ball-arc {  
  2. -webkit-animation: ball-x 2.5s cubic-bezier(0, 0, 0.35, 1);  
  3. }  
  4.    /* cubic-bezier 函数的使用是用来调节动画运行的速度,这里我们使球慢慢减速*/  
  5.   
  6. @-webkit-keyframes ball-x {  
  7.    0% { -webkit-transform: translateX(-275px); }  
  8.    100% { -webkit-transform: translateX(0px); }  
  9. }  

上述代码可以看到,我们新加了一个动画ball-x 它作用在外层div上,负责小球的横向运动,而ball-y则作用在内层div上负责纵向运动。 

当然,这样将动作拆分为横向和纵向的写法有它的缺点,当你真的要创作一些非常复杂的动画时,这些代码在语义上比较难以理解。 
查看示例



简介:无论动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是用Flash还是CSS, 动画的基本原理和设计准则都未曾变过的。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们以一个例子贯穿始终,利用传统动画的准则来逐步构建这个动画。

接上篇

CSS 动画指南: 原理和实战 (一)

作者: Tom Waterhouse

原文连接:http://coding.smashingmagazine.com/2011/09/14/the-guide-to-css-animation-principles-and-examples/#more-105335

译者: feijia  (tiimfei@gmail.com)

(译者注:本文章中的示例页面需要翻墙,并推荐使用最新的FF,Chrome等查看)


次要动作(Secondary Action)


要使动画逼真必须关注细节,除了描绘动画角色的主要动作外,需要通过对次要动作的描绘进一步增加动画的真实感。正如谚语所说“恶魔藏在细节里” 。例如,如果要刻画一个长发飘飘的姑娘在走路时,人物行走是主要动作,而次要动作则是她那跟随步伐摇摆弹跳的长发,又或是她随风摆动的裙角。 通过描绘这些细节(次要动作),能够让观众进一步感到动画的逼真。

当然在我们的小球动画中,要比这简单多了。要给小球的下落增加一些细节,我们可以选择让小球在运动中旋转。那会创造一种小球被人投掷到舞台上的感觉。 

这次我们不用额外添加一个div来实现这一效果,我们可以把这个旋转的动画直接应用到用来显示小球纹理的img元素上

  1. .ball img {  
  2. -webkit-animation: spin 2.5s;  
  3. }  
  4.   
  5. @-webkit-keyframes spin {  
  6.    0% { -webkit-transform: rotate(-180deg); }  
  7.    100% { -webkit-transform: rotate(360deg); }  
  8. }  

查看示例


恰当的节奏(Timing )


这一点很好理解,动画中的物体的运动的速度,节奏,直接关系到他们看起来是不是逼真。  我们的小球动画就是一个生动的例子。 我们目前设定的小球运动的节奏使它看起来比较符合一个质量很轻的网球被抛掷的速度,试想如果我们是在掷一个沉重的保龄球,那么球下落的一定会比较快。 (译者:作者原话,纠结于“两个铁球同时落地“的同学,我想他的意思是,如果是一个弹性很小的保龄球,它落地后再反弹的高度会短很多)同样,如果我们让动画再慢一些,那同样会让它看起来不真实,好似是在太空中打网球了。  

通过调整animation-duration属性,你可以调整动画运行的整体时间从而调整动画运动的节奏,同样你也可以通过设置百分比的方法来进行微调。 


夸张(Exaggeration)


虽然前面我们说了种种通过模拟物理规律来让动画逼真的方法,但是卡通形象当然也不必处处遵循物理规律,恰到好处的夸张可以增加效果。 比如卡通形象可以变形成任何形状,并最后再变回来。夸张的效果可以使一个动作看起来不那么平淡,也可以起到强调的作用。

掌握何时使用夸张的火候很有技巧,迪斯尼动画有一条规则说:在动画中大部分时候尽量模拟真实的基础上再并稍稍使它超出一点。好像一个动画人物跑向一堵墙,他的身体会被挤压到墙上(当然现实世界不会发生这样的情形),这种挤压就是那部分微微夸张的效果。 

我们使用了夸张这一技巧(挤压和拉伸)来强调球在落地时的效果。我还额外添加了一个微小的颤动效果。最后,我们还加入了球在弹起后加入了拉伸效果来表达它的速度感。

向前几次一样,为了加入颤动,我又加了一个新的div,它将会随着球落地而抖动。示例代码如下: 

  1. @-webkit-keyframes wobble {  
  2.   
  3. 0%, 24%, 54%, 74%, 86%, 96%, 100% {  
  4.    -webkit-transform: scaleX(1.0);  
  5. /* 在这些位置,球将会回到正常形状 */  
  6. }  
  7.   
  8. 25%, 55%, 75% {  
  9.    -webkit-transform: scaleX(1.3) scaleY(0.8) translateY(10px);  
  10. /* 球落地的位置:压缩效果(宽度增加,高度变小) */  
  11. }  
  12.   
  13. 30%, 60%, 80% {  
  14.    -webkit-transform: scaleX(0.8) scaleY(1.2);  
  15. /* 球落地后的几个收缩的点 */  
  16. }  
  17.   
  18. 75%, 87% {  
  19.    -webkit-transform: scaleX(1.2);  
  20. /* Subtler squash for the last few bounces */  
  21. }  
  22.   
  23. 97% -webkit-transform: scaleX(1.1);  
  24. /* Even subtler squash for last bounce */  
  25. }  
  26.   
  27. }  
代码看起来有些复杂,不过不用担心,通过不断调整直到你觉得达到了你设想的效果。 

查看示例

扎实的绘画和人物的魅力(Solid Drawing and Appeal)

我能教你的就这么多了,至少没有更多的示例代码了。最后两条准则没办法CSS代码演示。 可它们是你必须掌握的使动画臻于完美的技巧。 

当迪斯尼在制作白雪公主动画时,它把动画师们派回重新去上绘画课,重新理解人类的动作。这种对细节的关注直接提现在它的作品中,优秀的动画必须有扎实的绘画功底,以及对你所描绘事物的细致理解(也许是一个网球,也许是一个人物)

虽然大多数CSS动画可能不会像一个人物动画那么复杂,不过这一原则仍然有效。无论是模拟一扇打开的门,还是制作一个用于”联系我们“图表的打开信封的小动画,都应当尽量逼真。

每个人物的魅力(Appeal) 都是独一无二的。迪斯尼的成功经验告诉我们,任何事物都可以有自己的性格:哪怕是一个茶壶,一棵树,或是一把调羹。使用CSS的创造网页动画,我们也应该考虑这一动画如何帮助提升页面整体设计和体验的作用

开始行动吧!


动画是项了不起的CSS3新特性。就像其他CSS的新功能,人们很有可能会误用甚至滥用它,我们也许会重新看到过去那种Flash風格的花哨頁面。不过我相信今天的Web开发者们应该不会重蹈覆辙。 

CSS动画可以让网站生动起来,我们的弹跳的网球球的示例代码也许不是最好的例子,但是它演示了要在页面中加入一个逼真的CSS动画的必要步骤。

有了CSS动画,你可以给你的页面元素加入许多互动性(而且是在不用Flash前提下!),配合JavaScript,它甚至可以用来制作网页游戏。 通过应用本文所介绍的12条准则,你可以为你的网站制作出更加逼真可信的动画,从而提升网站的整体用户体验。 

CSS动画工具


许多工具可以帮助你制作CSS动画。

Sencha Animator

Adobe Edge

Tumult(mac only)

真实的CSS动画案例


看看真实应用中的CSS动画会让你对它所能实现的效果有更深的影响。 

CSS Spider-man animation by Anthony Calzadilla 

CSS Tricks (animated typography person),by Mircea Piturca 

Walking man,by Andrew Hoyer 

Learning CSS3: Useful References and Guidelines, on Smashing Magazine
Mastering CSS Principles: A Comprehensive Guide, on Smashing Magazine

========================================


译者补充, 下面的代码可以检查用户浏览器是否支持CSS 动画


  1. var animation = false,  
  2.     animationstring = 'animation',  
  3.     keyframeprefix = '',  
  4.     domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),  
  5.     pfx  = '';  
  6.   
  7. if( elm.style.animationName ) { animation = true; }      
  8.   
  9. if( animation === false ) {  
  10.   for( var i = 0; i < domPrefixes.length; i++ ) {  
  11.     if( elm.style[ domPrefixes[i] + 'AnimationName' ] !== undefined ) {  
  12.       pfx = domPrefixes[ i ];  
  13.       animationstring = pfx + 'Animation';  
  14.       keyframeprefix = '-' + pfx.toLowerCase() + '-';  
  15.       animation = true;  
  16.       break;  
  17.     }  
  18.   }  
  19. }  


精通CSS3:鼠标悬停按钮动画效果实战指南 阴影颜色的设置不仅限于传统的黑色,CSS允许使用任何颜色值。合理选择颜色可以增强视觉效果或与页面主题风格保持一致。深色的阴影通常会给人一种凹陷的感觉,而浅色则可能使元素看起来突出或浮起。通过box-shadow属性的综合运用,开发者能够根据设计需求,创建出丰富多样的视觉效果,提高用户界面的美观度和互动性。下一章将介绍:hover伪类的使用,进一步扩展我们对交互动效的理解。在Web开发中,:hover。 阅读详情

相关推荐

css3动画算法实现原理

由浅入深,介绍了css3动画算法的实现,要求数学功底要好,介绍了一些底层的数学矩阵实现

CSS3(一)动画原理

CSS3 Animation 之前一直在用cocos等编辑器做动画,最近想学习一下使用CSS3实现一些基本的动画。所以,将这两种动画开发模式,进行对比学习或许会有更深的理解与体会。 什么是动画 在学习CSS3动画之前,我们必须先介绍一个什么是动画,动画都具有哪些特性。 动画是将静止的画面变为动态的艺术.实现由静止到动态,主要是靠人眼的视觉残留效应。 什...

优快云前端知识共享 5312

Research Proposal:自动驾驶 行人运动预测

Research Proposal about Pedestrian/Cyclist Motion Prediction for Self-Driving Vehicles   If I can be provided with the opportunity to conduct PhD research in pedestrian/cyclist motion prediction for...

Poetry Wanderer的博客 3087

CSS知识总结(浏览器渲染原理及CSS动画)

一个关于浏览器渲染原理和CSS常用的两种动画实现的文章

m0_72552013的博客 586

【论文学习】《Fully-Convolutional Siamese Networks for Object Tracking》2016年SiamFC 全卷积孪生网络用于目标跟踪

在这项工作中,我们脱离了跟踪中采用的传统在线学习方法,并展示了一种专注于在离线阶段学习强嵌入的替代方法。与在分类设置中的使用不同,我们证明,对于跟踪应用,孪生全卷积深度网络能够更有效地使用可用数据。这不仅反映在测试时,通过执行有效的空间搜索,也反映在训练时,其中每个子窗口都有效地代表一个有用的样本,而几乎没有额外的成本。实验表明,深度嵌入为在线跟踪器提供了自然丰富的特征来源,并使简单的测试时策略表现良好。我们相信这种方法是对更复杂的在线跟踪方法的补充,并期望未来的工作能够更彻底地探索这种关系。

SkyLeopard的博客 2419

基于PSINS的INS/NHC/ODO组合导航仿真全解析

组合导航通过多传感器融合克服单一导航系统的局限,是车辆自主定位的关键技术。其中惯性导航(INS)依靠陀螺仪与加速度计积分推算运动状态,但误差随时间累积;GNSS提供绝对位置,却在城市峡谷中易受多径效应和遮挡影响导致定位漂移。卡尔曼滤波作为信息融合核心,将不同量测按统计特性加权,实现优势互补。基于PSINS开源工具箱搭建的SINS/GNSS/ODO/NHC组合导航仿真,能够在GNSS失锁条件下利用非完整约束和里程计抑制惯性误差发散,广泛应用于无人驾驶、物流车辆自主定位等场景。本文围绕PSINS仿真环境,详细拆

weixin_29044713的博客 253

前端基础之css动画

说到动画,其实很多人心中都会有一种抵触的情绪 总是认为动画并不是项目内需要的。并且动画也不一定是项目内必须的东西,所以很多人并不是很在意这个玩意儿。但是我想说的是:区别一个人的价值并不是在完成项目的能力,而是将项目优化的程度。而动画正式如此,他并不是你的必须品 但是能让你的能力更上一个台阶。 一、 什么是动画? 说到动画,在很多的眼里 都会认为动画是一个可有可无的东西。因为在很多程序员的日常开...

qianduanshuo的博客 1593

使用gsplat进行3D高斯泼溅的方案

gsplat 不是一个软件,而是一个深度优化CUDA的开源Python库。它的作者是 Nerfstudio 团队,这个团队最出名的项目是 Nerfstudio,是对 NeRFs 方法支持最好的一套框架。据其所述,出于对新一代技术的好奇,他们构建了 gsplat 这个库。它支持 Windows/Linux 两个系统,使用前必须准备好 Nvidia 显卡。跑这个项目真是特别费劲,官方的文档支持不够完善,以至于遇到问题,开发者们都只能在issue区里抱团取暖。

兴趣使然的创作者 2106

【vue】CSS动画原理

transition

刘亚男 285

自建邮局服务器| 批量邮件群发系统PowerMTA+oem(mumara,mailwizz, interspire)

世界顶级自建邮局服务器PowerMTA+oem(mumara,mailwizz, interspire) PowerMTA4.5(最好用的 群发邮件软件)是用于大批量多ip开发的邮件传递邮寄。可按每小时发送数近百万条电子邮件,发送IP地址和域可以详细配置,加上目前流行前端oem,mumara,mailwizz, interspire等,可定时发送,定时重复发送,实现全自动化 邮件群发 方案。 官网(powermta4.5下载) https://www.sparkpost.com/powermta/ 使用Po

ytrsexpo的博客 6503

本地搭建 GitLab 14.1.0版本CI/CD

GitLab 镜像版本 gitlab/gitlab-ce:14.1.0-ce.0 GitLab Runner 镜像版本 gitlab/gitlab-runner:v14.1.0 搭建此套环境是在一台32G的windows电脑上安装的。 使用dokcer安装。 此外还涉及的软件Docker Desktop,WSL 安装GitLab 首先启动 dockcer,打开WSL 打开后 首先定义GitLab的持久化目录 export GITLAB_HOME=/srv/gitlab 然后运行安装GitLab的命令

知无涯 4491

CSS 动画指南: 原理和实战 (一)

简介:无论动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是用Flash还是CSS, 动画的基本原理和设计准则都未曾变过的。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们以一个例子贯穿始终,利用传统动画的准则来

Dojo中文博客 2万+

撸毛笔记-电信营业厅 v5.03

电信营业厅 v5.03签到和完成部分金豆任务, 喂宠物7天,15天,28天连签抽奖, 宠物等级权益兑换自己设置电信的服务密码, 把 手机号#服务密码 填到变量里:每天运行一两次const $ = new Env("电信营业厅");

xiaoshun007的专栏 4497

CSS 动画指南: 原理和实战(二)

简介:无论动画以何种技术载体呈现,无论是传统的手绘动画,还是电脑生成的3D动画,也无论是用Flash还是CSS, 动画的基本原理和设计准则都未曾变过的。 在这篇文章中,我们会先解释CSS动画的基本概念,并且介绍使用CSS创建动画的要点。我们以一个例子贯穿始终,利用传统动画的准则来逐步构建这个动画。接上篇CSS 动画指南: 原理和实战 (一)作者: Tom Waterhouse原文连接:http:/

Dojo中文博客 1万+

深水区探秘:小红书App x-s参数逆向与高并发爬虫实战(2026版)

在移动互联网的碎片化时代,小红书凭借其“社区+电商”的独特模式,积累了超过3亿月活用户。其内容生态覆盖了从美妆、穿搭到旅行、数码等几乎所有垂直领域。对于数据分析师、市场研究员以及AI算法工程师而言,小红书平台蕴含的价值是巨大的——无论是热门趋势洞察、KOL画像分析,还是多模态图文数据的采集。然而,想要高效、稳定地获取小红书App的公开数据,却并非易事。与Web端相比,小红书App的防护体系堪称“铜墙铁壁”。其核心的反爬机制建立在动态混淆的加密参数之上,尤其是请求头中的X-SX-T以及X-S-Common。

2201_76125261的博客 263

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

CSS动画与变换全解析:从原理到性能优化的深度指南

本文系统分析了现代Web动画三大核心技术:CSS变换(Transform)通过4x4矩阵运算实现高效图形处理,触发GPU加速;CSS过渡(Transition)采用贝塞尔曲线插值机制,需谨慎选择过渡属性以避免性能损耗;CSS动画(Animation)在独立合成线程运行,与JS动画相比具有更低的主线程占用。研究揭示了三维变换的透视投影模型,并提供了分层优化、复合属性、帧率控制等实战技巧。数据表明,优化后的CSS动画可实现60fps流畅效果,相比传统JS动画内存占用降低40%,但需注意避免"层爆炸"问题。

Yue 1267

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: 各类音乐api
下一篇: 今天没时间写了
程序员迈克
博客等级 码龄16年 36粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值