亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專(zhuān)欄INFORMATION COLUMN

頁(yè)面動(dòng)畫(huà)知識(shí)點(diǎn)整理

booster / 2126人閱讀

摘要:然后在節(jié)點(diǎn)上設(shè)置了動(dòng)畫(huà)屬性,并將其設(shè)為前面定義的動(dòng)畫(huà),每一次動(dòng)畫(huà)秒,表示無(wú)限循環(huán),表示緩動(dòng)方式,兩個(gè)關(guān)鍵幀之間的變化是方式逐步變化的。

平時(shí)工作中會(huì)遇到需要實(shí)現(xiàn)一些存在動(dòng)畫(huà)的頁(yè)面。這里對(duì)動(dòng)畫(huà)的實(shí)現(xiàn)知識(shí)做一個(gè)整理。
頁(yè)面動(dòng)畫(huà)的實(shí)現(xiàn)可以分為兩類(lèi):CSS動(dòng)畫(huà)、Canvas動(dòng)畫(huà)、JavaScript動(dòng)畫(huà)。JavaScript動(dòng)畫(huà)沒(méi)啥好講的,這里就不整理了。

CSS動(dòng)畫(huà)

CSS3中提供了一個(gè)屬性transition,用來(lái)實(shí)現(xiàn)CSS樣式的平滑變化。舉個(gè)例子:

.box {
  width: 100px;
  height: 100px;
  background: red;
  transition: width 1s;
}
.box:hover {
  width: 300px;
}

當(dāng)鼠標(biāo)hover到.box元素時(shí),元素會(huì)在1s內(nèi)逐漸的將寬度變化到300px。
具體效果可以去這里查看。

使用transition可以實(shí)現(xiàn)較為簡(jiǎn)單的動(dòng)畫(huà)。如果需要實(shí)現(xiàn)比較復(fù)雜的動(dòng)畫(huà),可以使用amination來(lái)實(shí)現(xiàn)。舉個(gè)例子:

@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定義一個(gè)動(dòng)畫(huà)叫做: cssAnimation。在cssAnimation中定義了動(dòng)畫(huà)過(guò)程中關(guān)鍵的5幀。每一幀都設(shè)置了當(dāng)前幀的樣式特征。然后在.amin節(jié)點(diǎn)上設(shè)置了動(dòng)畫(huà)屬性animation,并將其設(shè)為前面定義的動(dòng)畫(huà)cssAnimation,每一次動(dòng)畫(huà)1秒,infinite表示無(wú)限循環(huán),ease表示緩動(dòng)方式,兩個(gè)關(guān)鍵幀之間的變化是ease方式逐步變化的。
具體效果可以到這里查看

animation的緩動(dòng)函數(shù)有很多類(lèi)型的值,有一個(gè)值比較特別就是step[n[, start | end]]。step的效果是將keyframes中的每一個(gè)關(guān)鍵幀之間的切換并不是逐步變化的,而是到達(dá)某一關(guān)鍵幀后直接變化成新的關(guān)鍵幀樣式,并保持不變,直到下一關(guān)鍵幀。所以使用step可以實(shí)現(xiàn)CSS3的幀動(dòng)畫(huà)。寫(xiě)法如下:

@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);
}

在上面的例子中,設(shè)置動(dòng)畫(huà)cssFrameAmination,其中每一關(guān)鍵幀都是精靈動(dòng)畫(huà)圖片的一幀圖片。然后在animation中設(shè)置animation-timing-functionstep(5, start)表示動(dòng)畫(huà)分5幀。

有關(guān)CSS3動(dòng)畫(huà)相關(guān)的知識(shí)細(xì)節(jié)可以去這里了解。

Canvas

canvas是一個(gè)HTML標(biāo)簽,用于提供給腳本進(jìn)行畫(huà)圖圖形的繪制。canvas的繪制主要由CanvasRenderingContext2D的實(shí)例來(lái)進(jìn)行繪制。CanvasRenderingContext2D 可以通過(guò)canvasDOM對(duì)象的getContext獲得,代碼如下:

const canvas = document.getElementById("canvas");
const ctx = canvas.getContext("2d");

getContext的參數(shù)是指在畫(huà)布上繪制的類(lèi)型,"2d"表示繪制二維圖形。目前三維還沒(méi)有實(shí)現(xiàn),所以參數(shù)只支持"2d"。

繪制圖形

canvas的上下文提供了眾多的繪制方法。當(dāng)你繪制一個(gè)圖形時(shí),基本思路是這樣的:

調(diào)用save方法保存之前的樣式狀態(tài)

調(diào)用beginPath表示開(kāi)始設(shè)置路徑

調(diào)用fillStyle, strokeStyle等對(duì)接下來(lái)的路徑進(jìn)行樣式設(shè)置

調(diào)用moveTo,lineTo, rect, arc等設(shè)置路徑

調(diào)用closePath閉合路徑

調(diào)用fill或者stroke對(duì)路徑進(jìn)行繪制

調(diào)用restore恢復(fù)之前保存的樣式狀態(tài)

上面過(guò)程中的saverestore的作用是將已經(jīng)設(shè)置的樣式進(jìn)行保存和恢復(fù)。當(dāng)存在多個(gè)圖形時(shí),前面的樣式如果不恢復(fù)為默認(rèn)樣式,會(huì)影響到第二個(gè)圖形的樣式。使用saverestore可以保證每一個(gè)圖形在繪制開(kāi)始時(shí),都是默認(rèn)的樣式。當(dāng)然,你也可以不調(diào)用saverestore,而是通過(guò)將前面已經(jīng)設(shè)置過(guò)的所有樣式進(jìn)行逐個(gè)的還原。
save可以保存的樣式類(lèi)型有:

當(dāng)前應(yīng)用的變形(即移動(dòng),旋轉(zhuǎn)和縮放)

strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap, lineJoin, miterLimit, shadowOffsetX, shadowOffsetY, shadowBlur, shadowColor, globalCompositeOperation 的值

當(dāng)前的裁切路徑(clipping path)

步驟5closePath盡量不要忘記。原因和save,restore類(lèi)似,如果忘記調(diào)用closePath就會(huì)導(dǎo)致前后圖形間多繪制一根線。
我寫(xiě)了一個(gè)時(shí)鐘的例子:github

下面對(duì)各類(lèi)接口做了一個(gè)整理
樣式設(shè)置

接口名 接口描述
顏色
fillStyle 圖形填充顏色
strokeStyle 圖形輪廓顏色
globalAlpha 圖形全局透明度
陰影
shadowOffsetX, shadowOffsetY 陰影方向
shadowBlur 設(shè)定陰影的模糊程度
shadowColor 陰影的顏色值
線型
lineWidth 線條寬度(int)
lineCap 線條末端樣式(butt: 平直; round: 添加半圓; square: 添加方形)
lineJoin 設(shè)置線條間的接合處(bevel: 斜角; round: 圓角; miter: 尖角)
miterLimit 兩線相交時(shí)尖角最大長(zhǎng)度(lineJoin:miter時(shí)生效,過(guò)長(zhǎng)不顯示)
getLineDash 返回當(dāng)前虛線樣式(數(shù)組)
setLineDash 設(shè)置虛線樣式(數(shù)組)
lineDashOffset 設(shè)置虛線樣式起始偏移量
漸變
createLinearGradient(x1, y1, x2, y2) 線性漸變
createRadialGradient(x1, y1, r1, x2, y2, r2) 圓漸變, 漸變反向是從圓心向外發(fā)散
gradient.addColorStop(position, color) 對(duì)生成的gradient對(duì)象添加結(jié)束顏色。position是中間過(guò)程,取值0~1
圖案樣式
createPattern(imageOrCanvas, type) 創(chuàng)建圖片填充對(duì)象。image必須是已加載完畢的;type: repeat, repeat-x, repeat-y, no-repeat

路徑

接口名 描述
moveTo(x, y) 移動(dòng)路徑繪制的起始點(diǎn)
beginPath() 新建一條路徑
closePath() 閉合路徑
lineTo(x, y) 從開(kāi)始位置繪制路徑到目標(biāo)位置
rect(x, y, width, height) 繪制矩形路徑
arc(x, y, radius, startAngle, endAngle, anticlockwise) 繪制圓弧:x,y為圓心;radius為半徑;startAngle,endAngle為起止位置;anticlockwise為反向(順時(shí)針,逆時(shí)針)
arcTo(x1, y1, x2, y2, radius) 繪制圓弧,并連接控制點(diǎn)
quadraticCurveTo(cp1x, cp1y, x, y) x,y為結(jié)束點(diǎn); cp1x,xp1y為控制點(diǎn)
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) x,y為結(jié)束點(diǎn);cp1x,cp1y為控制點(diǎn)1; cp2x,cp2y為控制點(diǎn)2
clip() 裁剪區(qū)域,區(qū)域外的不會(huì)發(fā)生繪制

繪制

接口名 描述
fillRect(x, y, width, height) 繪制填充矩形,等同于rect(); fill();
strokeRect(x, y, width, height) 繪制矩形邊框。等同于rect(); stroke()
fill() 填充路徑的內(nèi)容區(qū)域
stroke() 通過(guò)路徑線條繪制圖形輪廓

清除

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

文字

接口名 描述
font 設(shè)置文字樣式,同css的font
textAlign 對(duì)其方式
textBaseLine 基線對(duì)其
direction 文本方向
fillText(text, x, y [, maxWidth]) 繪制文字填充內(nèi)容
strokeText(text, x, y [, maxWidth]) 繪制文字邊框內(nèi)容
measureText(text) 返回文本的信息

樣式保存

接口名 描述
save() 保存當(dāng)前樣式
restore() 恢復(fù)之前保存樣式
繪制圖片

canvas雖然可以繪制圖形,但是最常用的應(yīng)該是繪制圖片。圖片的繪制和圖形的繪制類(lèi)似。
canvas使用接口drawImage()進(jìn)行接口繪制,接口定義如下:

drawImage(image, x, y, width, height, dx, dy, dWidth, dHeight);

其中的參數(shù)定義如下:

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

x, y是指圖片截取的起始位置。

width, height是指圖片截取的寬高。

dx, dy是目標(biāo)在Canvas中的起始坐標(biāo)。

dWidth, dHeight用于控制canvas繪制的圖片的縮放大小。

圖片變形

canvas還可以和CSS一樣對(duì)圖形進(jìn)行變形轉(zhuǎn)化。接口列表如下:

接口名字 描述
translate(x, y) 偏移。x,y是偏移量
rotate(angle) 旋轉(zhuǎn)角度,順時(shí)針
scale(x, y) 縮放。x, y分別是橫軸,縱軸的縮放比例
transform(m11, m12, m21, m22, dx, dy) 變形矩陣轉(zhuǎn)化
圖形重疊處理

前面的例子中,當(dāng)兩個(gè)圖形重疊后,都是由后面繪制的圖形覆蓋住前面繪制的圖形。有時(shí)候需要改變這種情況。這種時(shí)候就可以使用globalCompositeOperation來(lái)進(jìn)行設(shè)置(還可以用來(lái)遮蓋,清除某些區(qū)域)。具體參數(shù)可以去這里查看

globalCompositeOperation: type
動(dòng)畫(huà)實(shí)現(xiàn)

使用上面的接口可以在canvas上繪制圖片,但是都是固定的。當(dāng)我們不斷的對(duì)canvas進(jìn)行重繪時(shí),就可以達(dá)到動(dòng)畫(huà)的而效果。

動(dòng)畫(huà)的幀率達(dá)到60幀每秒時(shí),也就是16ms沒(méi)幀時(shí),動(dòng)畫(huà)過(guò)程是流暢的。所以我們要對(duì)動(dòng)畫(huà)過(guò)程的繪制進(jìn)行控制。有三個(gè)方法可以進(jìn)行控制:

setInterval。設(shè)置每16ms執(zhí)行一次繪制過(guò)程。但是該方法存在一個(gè)問(wèn)題,開(kāi)始運(yùn)行繪制函數(shù)的時(shí)間點(diǎn)可能處于某一幀的快結(jié)束時(shí)間點(diǎn)。這個(gè)時(shí)候繪制過(guò)程需要小于16ms才可以達(dá)到流暢。

setTimeout。和setInterval類(lèi)似。

requestAnimationFrame。該方法會(huì)在瀏覽器每一次繪制結(jié)束后調(diào)用一次。使用該方法可以很好的避免setIntervalsetTimeout出現(xiàn)的運(yùn)行繪制函數(shù)時(shí)間不在每一幀開(kāi)始的時(shí)間點(diǎn)。

Canvas性能

創(chuàng)建一個(gè)離屏canvas, 預(yù)先對(duì)復(fù)雜圖形進(jìn)行繪制。

避免浮點(diǎn)數(shù)的坐標(biāo)點(diǎn), 使用Math.floor()對(duì)坐標(biāo)取整。

不要使用drawImage去縮放圖片。

使用多canvas繪制復(fù)雜場(chǎng)景。

使用CSS設(shè)置大背景圖。

Canvas調(diào)試

查了很多資料,發(fā)現(xiàn)Chrome 44版本之前是有Canvas調(diào)試功能的,但是Chrome 44之后,將Canvas調(diào)試功能去除了,并以擴(kuò)展接口的方式提供功能。找了很久沒(méi)有找到調(diào)試Canvas的擴(kuò)展。另外,F(xiàn)irefox有提供專(zhuān)門(mén)的Canvas調(diào)試面板。試用了下,功能太少,對(duì)定位問(wèn)題并沒(méi)什么軟用。
所以,關(guān)于調(diào)試的問(wèn)題,只能試用傳統(tǒng)的設(shè)斷點(diǎn),并逐步運(yùn)行看效果進(jìn)行調(diào)試。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/79632.html

相關(guān)文章

  • 【連載】前端個(gè)人文章整理-從基礎(chǔ)到入門(mén)

    摘要:個(gè)人前端文章整理從最開(kāi)始萌生寫(xiě)文章的想法,到著手開(kāi)始寫(xiě),再到現(xiàn)在已經(jīng)一年的時(shí)間了,由于工作比較忙,更新緩慢,后面還是會(huì)繼更新,現(xiàn)將已經(jīng)寫(xiě)好的文章整理一個(gè)目錄,方便更多的小伙伴去學(xué)習(xí)。 showImg(https://segmentfault.com/img/remote/1460000017490740?w=1920&h=1080); 個(gè)人前端文章整理 從最開(kāi)始萌生寫(xiě)文章的想法,到著手...

    madthumb 評(píng)論0 收藏0
  • 零碎的知識(shí)(一)

    摘要:同時(shí),由于本身的實(shí)現(xiàn)大部分是純函數(shù),因此在版本中,一些不含副作用的均在中暴露了以為前綴的函數(shù)方法,也可以直接導(dǎo)入使用。在瀏覽器中神秘丟失嘗試檢查被請(qǐng)求的是否存在尾部斜線,具體原因暫時(shí)沒(méi)有找到相關(guān)資料。 寫(xiě)在前面 最近沒(méi)怎么寫(xiě)新的東西,一是因?yàn)橐恢痹跍?zhǔn)備換新的工作,所以一直在準(zhǔn)備面試,二是因?yàn)檫^(guò)年,心靜不下來(lái),所以也無(wú)法輸出或者翻譯一些文章,三是由于手頭還有一些遺留工作需要完成和交接,比...

    ernest.wang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<