以程式輔助方式為背景圖片製作動畫
使用者為背景圖片製作動畫時,主要有兩種方法:
- 使用 CSS 圖像集更新 JS 中的
background-position
。 - 使用
.toDataURL()
進行駭客攻擊。
如果您事先有圖片,第一個方法就很實用,但如果來源需要透過程式輔助方式產生 (例如透過 <canvas>
),該怎麼辦?解決方法 1:在畫布上使用 .toDataURL()
,並將背景設為產生的網址:
while(1) {
var url = canvas.toDataURL('image/jpeg');
el.style.background = 'url(' + url + ')';
}
這有兩個問題:
data:
網址會為產生的圖片增加約 33% 的大小開銷。- 大量的 DOM 觸碰 (
el.style
)。
這兩種方法都效率不彰,無法讓網頁應用程式一律以 60fps 的流暢速度運作。
使用 2D 畫布做為背景

原來 WebKit 多年以來都有一個非標準 API,可將畫布做為背景來源。但很遺憾,這項功能並未發布規格說明。
首先,請不要為返回按鈕指定網址:
.bg {
background: url(bg.png) no-repeat 50% 50%;
}
使用 -webkit-canvas()
,將字串 ID 參照至畫布內容:
.canvas-bg {
background: -webkit-canvas(animation) no-repeat 50% 50%;
}
接下來,我們需要使用 .getContext()
的特殊版本建立 2D 內容:
var ctx = document.getCSSCanvasContext('2d', 'animation', 300, 300);
Dave Hyatt 提供的更多資訊:
動畫
如示範所示,我們可以重複使用 requestAnimationFrame()
來驅動動畫。這很棒,因為一旦連結,CSS 和畫布元素之間的關聯就會保留。您不必費心處理 DOM。
在 Chrome 中沒有動畫示範?
目前的 Chrome 穩定版 (23 版) 有 crbug.com/161699,這會導致 requestAnimationFrame()
動畫無法正確更新背景。這個問題已在 Chrome 25 版 (目前為 Canary 版) 修正。示範也應能在目前的 Safari 中正常運作。
成效優勢
我們正在討論畫布。硬體加速動畫現在已全面上線 (至少適用於支援這項功能的瀏覽器)。在此重申,您不需要從 JS 騷擾 DOM。
使用 WebGL 做為背景
請等一下。這是否表示我們可以使用 WebGL 強化 CSS 背景?當然有!WebGL 只是無框畫的 3D 內容。只要將「experimental-webgl」換成「2d」,即可完成。
var gl = document.getCSSCanvasContext('experimental-webgl', 'animation', 300, 150);
以下是概念驗證,其中包含使用頂點和片段著色器繪製背景的 div:DEMO
其他方法
值得一提的是,Mozilla 已推出 -moz-element()
(MDN) 一段時間了。這是 CSS 圖片值和替換內容模組第 4 級規格的一部分,可讓您建立從任意 HTML 產生的圖片,包括影片、畫布、DOM 內容等。不過,如果要完全存取 DOM 的快照圖片,就會出現安全性問題。這也是其他瀏覽器尚未採用這項功能的主要原因。