1. 程式人生 > >使用 Canvas 繪製背景圖

使用 Canvas 繪製背景圖

提醒:本文最後更新於 1036 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

最近 iCloud Web 的 Beta 版換了 UI,整體風格變得和 iOS7 一致了。首頁圖示下方漂浮著若干大小不一的泡泡,十分夢幻。大家可以訪問 beta.icloud.com 體驗下,如果覺得泡泡不夠多,還可以加上 crazyAwesome 引數讓泡泡變得更加瘋狂。

上面提到的泡泡效果,有許多種實現方案。本文要討論的是 iCloud 使用的 Canvas 繪製背景圖方案。這樣做的好處是,用程式碼繪製背景圖,相比圖片更靈活,也更省流量。另外,不知道大家有沒留意到 iCloud Web 中的日曆圖示是根據當前日期和星期幾動態生成的,下面 Demo 中有這個圖示的實現。

canvas.toDataURL

大家知道,一般我們可以用圖片、SVG 和顏色漸變來做為元素的背景圖(background-image 屬性)。在 Canvas 中,可以通過 toDataURL() 方法,把影象匯出為 data 型別的 URL,這個 URL 可以直接用做背景圖。下面有個簡單的例子:

<div style="width:200px;height:200px;" id="cloud">紅心是我的背景圖!</div>    
<canvas style="display:none;" id="can" width="200" height="200"></canvas
>
<script> (function() { var canvas = document.getElementById('can'), context; if(!canvas.getContext) { alert('你的瀏覽器不支援 canvas!'); return; } context = canvas.getContext('2d'); context.fillStyle = 'red'; context.beginPath(); context.moveTo(75,40);
context.bezierCurveTo(75,37,70,25,50,25); context.bezierCurveTo(20,25,20,62.5,20,62.5); context.bezierCurveTo(20,80,40,102,75,120); context.bezierCurveTo(110,102,130,80,130,62.5); context.bezierCurveTo(130,62.5,130,25,100,25); context.bezierCurveTo(85,25,75,37,75,40); context.fill(); document.getElementById('cloud').style.backgroundImage = 'url("' + context.canvas.toDataURL() + '")'; })
();
</script>

這是使用本方案實現的 iCloud 日曆圖示,支援 Canvas 的瀏覽器都可以正常顯示。

用 Canvas 繪製背景圖,將 Canvas 強大的繪圖能力與靈活的 CSS 背景圖很好的結合起來,強大但不完美。例如多個元素使用同一個 Canvas 背景時,無論是分開設定背景圖,還是建立臨時 Style,都很麻煩。如果想把一個 Canvas 動畫作為元素背景,需要不斷獲取 DataURL 再賦給元素,更加不方便。

有沒有更好的辦法可以把一個或多個 html 元素與 Canvas 繫結起來,在 Canvas 內容改變時自動更新 html 元素呢?答案是肯定的。

-webkit-canvas

注:由於 -webkit-canvas 不是標準的 CSS 屬性,Chrome 已經廢棄了它,Safari 目前還支援。

對於上面的問題,Webkit 提出了一個自己的實現方案:-webkit-canvas。Safari4+、Chrome4+ 的 background-image 都支援這個屬性值(caniuse),可以方便的使用 CSS Canvas 作為元素的背景圖,類似這樣:

#icon1 {
    background-image: -webkit-canvas(identifier);
}

區別於在 Canvas 元素上繪圖,-webkit-canvas 方案需要用下面的方法獲取繪圖的 Context:

var context = document.getCSSCanvasContext("2d", "identifier", width, height);

建立 CSS Canvas 時需要指定一個標識,用它的 html 元素在 CSS 中指定這個標識就可以了。瀏覽器會自動將 CSS Canvas 的改變同步到所有指定了這個標識的元素上,這樣就成功解決了上面提出的問題。

具體效果可以繼續看我寫的 Demo,Webkit Only。這裡還有一個使用 -webkit-canvas 將 Canvas 動畫作為背景圖的例子,請自備梯子檢視

-moz-element

Mozilla 有個類似的方案,叫 -moz-element。可以指定任何元素作為另外元素的背景圖(實際上,一個元素不能指定父元素作為自己的背景,為什麼自己想),Firefox4+ 開始支援它作為 background-image 的屬性值。下面是它的用法:

<button id='elementID'>this is a element.</button>
<div style='background-image:-moz-element(#elementID);width:300px;height:200px;'></div>

於是,上面的 Demo 在 Firefox 下可以改由 -moz-element 來實現了,點選檢視。由於本方案支援任何元素作為背景,所以也可以這麼玩,純 CSS 的有趣效果,Firefox Only。

最後

個人感覺 Mozilla 的方案略微誇張了點,相比之下 Webkit 的 CSS Canvas 更有可能成為標準。另外,iCloud 對於不支援 -webkit-canvas 的瀏覽器使用的是 DataURL 方案,並沒有使用 firefox 的 -moz-element,具體什麼原因就不得而知了。

--EOF--

提醒:本文最後更新於 1036 天前,文中所描述的資訊可能已發生改變,請謹慎使用。

相關推薦

使用 Canvas 繪製背景

提醒:本文最後更新於 1036 天前,文中所描述的資訊可能已發生改變,請謹慎使用。 最近 iCloud Web 的 Beta 版換了 UI,整體風格變得和 iOS7 一致了。首頁圖示下方漂浮著若干大小不一的泡泡,十分夢幻。大家可以訪問 beta.icloud.com 體驗下,如果覺得泡泡不夠多,

微信小程式 用canvas繪製插入到分享中

用canvas繪製圖 createNewImg: function () { var that = this; var ctx = wx.createCanvasContext('mycanvas'); ctx.setFillStyle("#F4F4F4"); // context.set

微信小程式canvas繪製雷達

效果圖展示: 程式碼實現(具體實現): const DEFAULT_COLOR = '#FC9A00'; class Radar { constructor(options) { const { canvasId, width,

JS | canvas 繪製

“處理圖片是我們普通市民的責任,積累跬步是我本身的興趣,所以載入圖片我每次都跑一次,如果遇到多張圖片的話我還會多跑幾次。” ——題記,改自《破壞之王》 正文 canvas一籮筐問題, 之前一文 JS | canvas 圖片模糊 講了合成圖的模糊,本文講講另一個,can

前端------ canvas 繪製折線詳解

canvas時html5新新增的一個畫布標籤。 他有很多屬性,大家可以在下邊網址檢視: 畫布canvas中涉及到座標運算,它是以瀏覽器空白左上角為起點,然後根據畫素進行變化的一個元素,話不多說,下邊是一個折線圖的demo: 效果圖如下: 原始碼: <!

canvas繪製八卦

// 獲取物件 var Canvas = document.querySelector('Canvas'); //獲取繪圖環境 var ctx = Canvas.getContext('2d');

12、用Canvas繪製背景時鐘

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title>

使用canvas繪製扇形

<canvas> 標籤定義圖形,比如圖表和其他影象, 必須使用指令碼來繪製圖形。 效果如圖: html程式碼: <!DOCTYPE html> <head>

Android 使用Canvas繪製

效果: 嗯,一個很簡單的餅圖繪製。 用法 可以在xml檔案中配置,也可以直接new一個例項出來。 <com.paoword.oa.view.SectorGraphView android:id="@+id/s

Canvas畫布繪製折線

<head> <meta charset="utf-8" /> <title></title> <style type="text/css"> canvas { border: 1p

canvas繪製餅狀

話不多說直接上程式碼 <canvas width="600" height="400"></canvas> <script> var PieChart = function (ctx) { /*繪製工具

Android 自定義控制元件 (一) ,柱狀 ,Canvas 繪製 柱狀 ,支援觸控操作

專案中,經常會用到統計圖表,個性化展示資料,增加趣味性,之前也用過百度Echarts來展示,效果很不錯,包括一些互動操作,不得不說,echarts幫我我們實現了絕大多數的需求,體積小不說,實現方式也很簡單,後來想了想,為什麼不用安卓Canvas繪製呢,畢竟是安卓開發攻城獅,下

canvas——餅狀繪製文字

重點:計算文字應放的位置座標。<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>餅狀圖繪製文字</tit

利用 html5 canvas 簡單繪製折線

<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>畫圖</title> <style> #divC

Html5 canvas 繪製彩票走勢

因需要 要實現一個類似彩票走勢圖的功能,初次學Html5 ,很多地方不明白,前段時間也發帖請教過這個問題,也是沒給個明確說話,在網上搜了很多,也沒有實現的例子,今天仔細研究了下,發現其實也不是很難,現將程式碼貼出來,共同學習! 先來一張效果圖: 實現的程式碼: <!

Canvas 繪製像的三種方法、實現幀動畫

繪製圖像的三種方法 /* * 繪製圖像 * ctx.drawImage(); */ //第一種版本 三引數版本context.drawImage(i

canvas繪製的折線 +解析

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &l

html5 canvas 實現簡單繪製折線

<!DOCTYPE html> <html> <head> <meta charset='utf-8'> <title>畫圖</title&g

在Android上用Canvas繪製音訊波形

最近在研究VAD演算法,但調整引數時無法實時看到效果,於是決定將音訊波形實時繪製出來,並且語音部分和噪音部分用不同顏色的線條顯示,這樣就能立即看到VAD演算法對各種噪音型別的魯棒性 為了簡化問題規模,先研究出怎麼在Android下實時繪製隨機生成波形的功能,後面再加入語音獲

canvas繪製像輪廓效果

在2d圖形視覺化開發中,經常要繪製物件的選中效果。 一般來說,表達物件選中可以使用邊框,輪廓或者發光的效果。  發光的效果,可以使用canvas的陰影功能,比較容易實現,此處不在贅述。 # 繪製邊框 繪製邊框是最容易實現的效果,比如下面的圖片 ![](https://p3-juejin.by