ホームページ > ウェブフロントエンド > htmlチュートリアル > ページアニメーションのナレッジポイント集_html/css_WEB-ITnose

ページアニメーションのナレッジポイント集_html/css_WEB-ITnose

WBOY
リリース: 2016-06-21 08:46:12
オリジナル
1204 人が閲覧しました

毎日の作業では、アニメーションを実装する必要があるページに遭遇することがあります。アニメーション実装の知識をまとめました。ページ アニメーションの実装は、CSS アニメーション、Canvas アニメーション、JavaScript アニメーションの 2 つのカテゴリに分類できます。 JavaScript アニメーションについてはあまり語るべきことがないので、ここでは要約しません。

CSS アニメーション

CSS3 は、CSS スタイルのスムーズな変更を実現するプロパティ遷移を提供します。例:

.box {  width: 100px;  height: 100px;  background: red;  transition: width 1s;}.box:hover {  width: 300px;}
ログイン後にコピー

マウスを .box 要素の上に置くと、要素の幅は 1 秒以内に 300px に徐々に変更されます。

具体的な効果はこちらでご確認いただけます。

トランジションを使用して、よりシンプルなアニメーションを実現します。より複雑なアニメーションを実装する必要がある場合は、アミノ化を使用してそれを実現できます。例:

@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;}
ログイン後にコピー

上記の例では、アニメーションは最初に cssAnimation と呼ばれるキーフレームによって定義されます。アニメーション処理のキーとなる5フレームはcssAnimationで定義されています。各フレームは、現在のフレームのスタイル特性を設定します。次に、.amin ノードにアニメーション属性のアニメーションを設定し、それぞれのアニメーションを 1 秒に設定します。infinite は無限ループを意味し、ease はイージング モードを意味し、2 つのキー フレーム間の変更は easy です。徐々に変化していきます。

具体的な効果はここで確認できます

アニメーションのイージング関数には多くの種類の値がありますが、より特殊な値の 1 つは step[n[, start | end] です。 ]。ステップの効果は、キーフレーム内の各キーフレーム間の切り替えが徐々に変化するのではなく、特定のキーフレームに到達した後に新しいキーフレーム スタイルに直接変更され、次のキーフレームまで変更されないことです。したがって、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 を設定します。ここで、各キーフレームはスプライト アニメーション画像のフレームです。次に、アニメーションのアニメーション タイミング関数を step(5, start) に設定して、アニメーションが 5 つのフレームに分割されることを示します。

CSS3 アニメーションの詳細については、ここを参照してください。

Canvas

Canvas は、スクリプトに描画グラフィックスを提供するために使用される HTML タグです。キャンバスの描画は主に CanvasRenderingContext2D のインスタンスによって行われます。 CanvasRenderingContext2D は、canvasDOM オブジェクトの getContext を通じて取得できます。コードは次のとおりです。

const canvas = document.getElementById('canvas');const ctx = canvas.getContext('2d');
ログイン後にコピー

getContext のパラメーターは、キャンバス上の描画のタイプを参照し、「2d」は 2 つの描画を意味します。 -次元のグラフィック。現在、3D は実装されていないため、パラメータは「2d」のみをサポートしています。

グラフィックの描画

キャンバス コンテキストには、多数の描画メソッドが用意されています。グラフィックを描画するときの基本的な考え方は次のとおりです:

  1. save メソッドを呼び出して前のスタイル状態を保存します

  2. 開始するには beginPath を呼び出しますPath の設定

  3. fillStyle、ストロークスタイルなどを呼び出して、次のパスのスタイルを設定します

  4. moveTo、lineTo、rect、arc、を呼び出しますなどでパスを設定します

  5. closePathを呼び出してパスを閉じます

  6. fillまたはストロークを呼び出してパスを描画します

  7. 保存されたスタイルのステータスを復元するために復元を呼び出す前に

上記のプロセスにおける保存と復元の機能は、設定されたスタイルを保存して復元することです。 。複数のグラフィックがある場合、前のスタイルをデフォルトのスタイルに戻さないと、2 番目のグラフィックのスタイルに影響します。保存と復元を使用すると、描画開始時に各グラフィックがデフォルトのスタイルを持つようになります。もちろん、保存や復元を呼び出さずに、以前に設定したすべてのスタイルを 1 つずつ復元することもできます。

保存によって保存できるスタイル タイプは次のとおりです。

  • 現在適用されている変換 (つまり、移動、回転、拡大縮小)

  • ストロークスタイル、fillStyle、globalAlpha、lineWidth、lineCap、lineJoin、miterLimit、shadowOffsetX、shadowOffsetY、shadowBlur、shadowColor、globalCompositeOperation 値

  • 現在のクリッピング パス (クリッピング パス)

ステップ 5 closePath を忘れないようにしてください。理由は保存と復元の場合と同様で、closePath を呼び出すのを忘れた場合、前面のグラフィックスと背面のグラフィックスの間に余分な線が描画されます。

時計の例を書きました: github

以下はさまざまなインターフェースの概要です

スタイル設定

接口名 接口描述
颜色
fillStyle 图形填充颜色
strokeStyle 图形轮廓颜色
globalAlpha 图形全局透明度
阴影
shadowOffsetX, shadowOffsetY 阴影方向
shadowBlur 设定阴影的模糊程度
shadowColor 阴影的颜色值
线型
lineWidth 线条宽度(int)
lineCap 线条末端样式(butt: 平直; round: 添加半圆; square: 添加方形)
lineJoin 设置线条间的接合处(bevel: 斜角; round: 圆角; miter: 尖角)
miterLimit 两线相交时尖角最大长度(lineJoin:miter时生效,过长不显示)
getLineDash 返回当前虚线样式(数组)
setLineDash 设置虚线样式(数组)
lineDashOffset 设置虚线样式起始偏移量
渐变
createLinearGradient(x1, y1, x2, y2) 线性渐变
createRadialGradient(x1, y1, r1, x2, y2, r2) 圆渐变, 渐变反向是从圆心向外发散
gradient.addColorStop(position, color) 对生成的gradient对象添加结束颜色。position是中间过程,取值0~1
图案样式
createPattern(imageOrCanvas, type) 创建图片填充对象。image必须是已加载完毕的;type: repeat, repeat-x, repeat-y, no-repeat

パス

接口名 描述
moveTo(x, y) 移动路径绘制的起始点
beginPath() 新建一条路径
closePath() 闭合路径
lineTo(x, y) 从开始位置绘制路径到目标位置
rect(x, y, width, height) 绘制矩形路径
arc(x, y, radius, startAngle, endAngle, anticlockwise) 绘制圆弧:x,y为圆心;radius为半径;startAngle,endAngle为起止位置;anticlockwise为反向(顺时针,逆时针)
arcTo(x1, y1, x2, y2, radius) 绘制圆弧,并连接控制点
quadraticCurveTo(cp1x, cp1y, x, y) x,y为结束点; cp1x,xp1y为控制点
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) x,y为结束点;cp1x,cp1y为控制点1; cp2x,cp2y为控制点2
clip() 裁剪区域,区域外的不会发生绘制

描画

接口名 描述
fillRect(x, y, width, height) 绘制填充矩形,等同于rect(); fill();
strokeRect(x, y, width, height) 绘制矩形边框。等同于rect(); stroke()
fill() 填充路径的内容区域
stroke() 通过路径线条绘制图形轮廓

クリア

接口名 描述
clearRect(x, y, width, height) 清除指定矩形区域

文字

接口名 描述
font 设置文字样式,同css的font
textAlign 对其方式
textBaseLine 基线对其
direction 文本方向
fillText(text, x, y [, maxWidth]) 绘制文字填充内容
strokeText(text, x, y [, maxWidth]) 绘制文字边框内容
measureText(text) 返回文本的信息

样式保存

接口名 描述
save() 保存当前样式
restore() 恢复之前保存样式

绘制图片

canvas虽然可以绘制图形,但是最常用的应该是绘制图片。图片的绘制和图形的绘制类似。

canvas使用接口 drawImage()进行接口绘制,接口定义如下:

drawImage(image, x, y, width, height, dx, dy, dWidth, dHeight);
ログイン後にコピー

其中的参数定义如下:

  • image可以使HTMLImageElement, HTMLVideoElement(Video元素的某一帧), HTMLCanvasElement, ImageBitmap。

  • x, y是目标在Canvas中的起始坐标。

  • width, height用于控制canvas绘制的图片的缩放大小。

  • dx, dy是指图片截取的起始位置。

  • dWidth, dHeight是指图片截取的宽高。

图片变形

canvas还可以和CSS一样对图形进行变形转化。接口列表如下:

接口名字 描述
translate(x, y) 偏移。x,y是偏移量
rotate(angle) 旋转角度,顺时针
scale(x, y) 缩放。x, y分别是横轴,纵轴的缩放比例
transform(m11, m12, m21, m22, dx, dy) 变形矩阵转化

图形重叠处理

前面的例子中,当两个图形重叠后,都是由后面绘制的图形覆盖住前面绘制的图形。有时候需要改变这种情况。这种时候就可以使用 globalCompositeOperation来进行设置(还可以用来遮盖,清除某些区域)。具体参数可以去 这里查看

globalCompositeOperation: type
ログイン後にコピー

动画实现

使用上面的接口可以在canvas上绘制图片,但是都是固定的。当我们不断的对canvas进行重绘时,就可以达到动画的而效果。

动画的帧率达到60帧每秒时,也就是16ms没帧时,动画过程是流畅的。所以我们要对动画过程的绘制进行控制。有三个方法可以进行控制:

  • setInterval。设置每16ms执行一次绘制过程。但是该方法存在一个问题,开始运行绘制函数的时间点可能处于某一帧的快结束时间点。这个时候绘制过程需要小于16ms才可以达到流畅。

  • setTimeout。和 setInterval类似。

  • requestAnimationFrame。该方法会在浏览器每一次绘制结束后调用一次。使用该方法可以很好的避免 setInterval和 setTimeout出现的运行绘制函数时间不在每一帧开始的时间点。

Canvas性能

  1. 创建一个离屏canvas, 预先对复杂图形进行绘制。

  2. 避免浮点数的坐标点, 使用Math.floor()对坐标取整。

  3. 不要使用 drawImage去缩放图片。

  4. 使用多canvas绘制复杂场景。

  5. 使用CSS设置大背景图。

Canvas调试

查了很多资料,发现Chrome 44版本之前是有Canvas调试功能的,但是Chrome 44之后,将Canvas调试功能去除了,并以扩展接口的方式提供功能。找了很久没有找到调试Canvas的扩展。另外,Firefox有提供专门的Canvas调试面板。试用了下,功能太少,对定位问题并没什么软用。所以,关于调试的问题,只能试用传统的设断点,并逐步运行看效果进行调试。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート