以程式輔助方式為背景圖片製作動畫
使用者主要有兩種方式可為背景圖片製作動畫:
- 使用 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)。
這兩種方法效率都不高,無法讓網頁應用程式維持 60 FPS 的流暢度。
使用 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 環境。只要將「2d」換成「experimental-webgl」,即可完成。
var gl = document.getCSSCanvasContext('experimental-webgl', 'animation', 300, 150);
以下是概念驗證,其中包含使用頂點和片段著色器繪製背景的 div:DEMO
其他方法
值得注意的是,Mozilla 已經推出 -moz-element() (MDN) 許久,這是 CSS 圖片值和取代內容模組第 4 級規格的一部分,可讓您從任意 HTML 建立圖片:影片、畫布、DOM 內容等。不過,如果能完整存取 DOM 的快照圖片,可能會造成安全疑慮。這也是其他瀏覽器未採用這項功能的主要原因。