页面动画知识点整理_html/css_WEB
平时工作中会遇到需要实现一些存在动画的页面。这里对动画的实现知识做一个整理。页面动画的实现可以分为两类:CSS动画、Canvas动画、JavaScript动画。JavaScript动画没啥好讲的,这里就不整理了。 CSS动画CSS3中提供了一个属性 transition,用来实现CSS样式的平滑变化。举个例子: .box { width: 100px; height: 100px; background: red; transition: width 1s;}.box:hover { width: 300px;}
当鼠标hover到 .box元素时,元素会在1s内逐渐的将宽度变化到300px。 具体效果可以去 这里查看。 使用 transition可以实现较为简单的动画。如果需要实现比较复杂的动画,可以使用 amination来实现。举个例子: @keyframes cssAmination { 0% {background: red; transform: skew(0deg);} 25% {background: yellow; transform: skew(-20deg);} 50% {background: blue; transform: skew(0deg);} 75% {background: green; transform: skew(20deg);} 100% {background: red; transform: skew(0deg);}}.amin { animation: cssAmination 1s infinite ease;}
在上的例子中,首先由 keyframes定义一个动画叫做: cssAnimation。在 cssAnimation中定义了动画过程中关键的5帧。每一帧都设置了当前帧的样式特征。然后在 .amin节点上设置了动画属性 animation,并将其设为前面定义的动画 cssAnimation,每一次动画1秒, infinite表示无限循环, ease表示缓动方式,两个关键帧之间的变化是 ease方式逐步变化的。 具体效果可以到 这里查看 animation的缓动函数有很多类型的值,有一个值比较特别就是 step[n[, start | end]]。 step的效果是将 keyframes中的每一个关键帧之间的切换并不是逐步变化的,而是到达某一关键帧后直接变化成新的关键帧样式,并保持不变,直到下一关键帧。所以使用 step可以实现CSS3的帧动画。写法如下: @keyframes cssFrameAmination { 0% {background-position: 0 0;} 25% {background-position: -100px 0;} 50% {background-position: -200px 0;} 75% {background-position: -300px 0;} 100% {background-position: -400px 0;}}.amin-frame { background: url("./sprite.png") 0 0 no-repeat; animation: cssFrameAmination 1s infinite step(5, start);} 在上面的例子中,设置动画 cssFrameAmination,其中每一关键帧都是精灵动画图片的一帧图片。然后在 animation中设置 animation-timing-function为 step(5, start)表示动画分5帧。 有关CSS3动画相关的知识细节可以去 这里了解。 Canvascanvas是一个HTML标签,用于提供给脚本进行画图图形的绘制。 canvas的绘制主要由 CanvasRenderingContext2D的实例来进行绘制。 CanvasRenderingContext2D可以通过 canvasDOM对象的 getContext获得,代码如下: const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');
getContext的参数是指在画布上绘制的类型,’2d’表示绘制二维图形。目前三维还没有实现,所以参数只支持’2d’。 绘制图形canvas的上下文提供了众多的绘制方法。当你绘制一个图形时,基本思路是这样的:
上面过程中的 save和 restore的作用是将已经设置的样式进行保存和恢复。当存在多个图形时,前面的样式如果不恢复为默认样式,会影响到第二个图形的样式。使用 save和 restore可以保证每一个图形在绘制开始时,都是默认的样式。当然,你也可以不调用 save和 restore,而是通过将前面已经设置过的所有样式进行逐个的还原。 save可以保存的样式类型有:
步骤5 closePath尽量不要忘记。原因和 save, restore类似,如果忘记调用 closePath就会导致前后图形间多绘制一根线。 我写了一个时钟的例子: github
下面对各类接口做了一个整理 样式设置
路径
绘制
清除
文字
样式保存
绘制图片
canvas虽然可以绘制图形,但是最常用的应该是绘制图片。图片的绘制和图形的绘制类似。 canvas使用接口 drawImage()进行接口绘制,接口定义如下: drawImage(image, x, y, width, height, dx, dy, dWidth, dHeight); 其中的参数定义如下:
图片变形canvas还可以和CSS一样对图形进行变形转化。接口列表如下:
图形重叠处理前面的例子中,当两个图形重叠后,都是由后面绘制的图形覆盖住前面绘制的图形。有时候需要改变这种情况。这种时候就可以使用 globalCompositeOperation来进行设置(还可以用来遮盖,清除某些区域)。具体参数可以去 这里查看 globalCompositeOperation: type 动画实现使用上面的接口可以在canvas上绘制图片,但是都是固定的。当我们不断的对canvas进行重绘时,就可以达到动画的而效果。 动画的帧率达到60帧每秒时,也就是16ms没帧时,动画过程是流畅的。所以我们要对动画过程的绘制进行控制。有三个方法可以进行控制:
Canvas性能
Canvas调试查了很多资料,发现Chrome 44版本之前是有Canvas调试功能的,但是Chrome 44之后,将Canvas调试功能去除了,并以扩展接口的方式提供功能。找了很久没有找到调试Canvas的扩展。另外,Firefox有提供专门的Canvas调试面板。试用了下,功能太少,对定位问题并没什么软用。所以,关于调试的问题,只能试用传统的设断点,并逐步运行看效果进行调试。 |