HTML5_Canvas

1. 創(chuàng)建Canvas

//HTML
<canvas id="myCanvas" width="400" height="200">
  您的瀏覽器不支持canvas辫塌!
</canvas>
//JavaScript
var canvas = document.getElementById('myCanvas');

if (canvas.getContext) {
  var ctx = canvas.getContext('2d');
}

2. API

顏色、樣式和陰影

fillStyle:設置或返回用于填充繪畫的顏色典勇、漸變或模式
strokeStyle:設置或返回用于筆觸的顏色塘慕、漸變或模式
shadowColor:設置或返回用于陰影的顏色
shadowBlur: 設置或返回用于陰影的模糊級別
shadowOffsetX:設置或返回陰影距形狀的水平距離
shadowOffsetY:設置或返回陰影距形狀的垂直距離
createLinearGradient():創(chuàng)建線性漸變(用在畫布內容上)
createPattern(): 在指定的方向上重復指定的元素
createRadialGradient():創(chuàng)建放射狀/環(huán)形的漸變(用在畫布內容上)
addColorStop(): 規(guī)定漸變對象中的顏色和停止位置

線條樣式

lineCap:設置或返回線條的結束端點樣式
lineJoin:設置或返回兩條線相交時益缠,所創(chuàng)建的拐角類型
lineWidth:設置或返回當前的線條寬度
miterLimit:設置或返回最大斜接長度

矩形

rect(x, y, width, height): 創(chuàng)建矩形
fillRect(x, y, width, height): 繪制“被填充”的矩形
strokeRect(x, y, width, height): 繪制矩形(無填充)
clearRect(x, y, width, height): 在給定的矩形內清除指定的像素

路徑

fill():填充當前繪圖(路徑)
stroke():繪制已定義的路徑
beginPath():起始一條路徑,或重置當前路徑
moveTo(x,y):把路徑移動到畫布中的指定點纸泄,不創(chuàng)建線條
closePath():創(chuàng)建從當前點回到起始點的路徑
lineTo():添加一個新點赖钞,然后在畫布中創(chuàng)建從該點到最后指定點的線條
clip():從原始畫布剪切任意形狀和尺寸的區(qū)域

var c=document.getElementById("myCanvas");
var ctx=c.getContext("2d");
// 剪切矩形區(qū)域
ctx.rect(50,20,200,120);
ctx.stroke();
ctx.clip();
// 在 clip() 之后繪制綠色矩形,只能顯示出部分
ctx.fillStyle="green";
ctx.fillRect(0,0,150,100);

quadraticCurveTo(控制點的 x ,控制點的 y ,結束點的 x ,結束點的 y ): 創(chuàng)建二次貝塞爾曲線
bezierCurveTo(cp1x,cp1y,cp2x,cp2y,x,y): 創(chuàng)建三次方貝塞爾曲線
arc(x, y, radius, startAngle, endAngle, anticlockwise): 創(chuàng)建弧/曲線(用于創(chuàng)建圓形或部分圓)
arcTo(): 創(chuàng)建兩切線之間的弧/曲線
isPointInPath(): 如果指定的點位于當前路徑中,則返回 true聘裁,否則返回 false

轉換

scale(): 縮放當前繪圖至更大或更小
rotate(): 旋轉當前繪圖
translate(): 重新映射畫布上的 (0,0) 位置
transform(): 替換繪圖的當前轉換矩陣
setTransform(): 將當前轉換重置為單位矩陣仁烹。然后運行 transform()

文本

fontctx.font = "Bold 20px Arial"
textAlign: 對齊方式
textBaseline
fillText(string, x, y): 在畫布上繪制“被填充的”文本 ,fillText方法不支持文本斷行,即所有文本出現(xiàn)在一行內
strokeText(): 在畫布上繪制文本(無填充)
measureText(): 返回包含指定文本寬度的對象

圖像繪制

drawImage(): 向畫布上繪制圖像咧虎、畫布或視頻

像素操作

width: ImageData 對象的寬度
height: ImageData 對象的高度
data: ImageData 對象的圖像數(shù)據(jù)
createImageData(): 創(chuàng)建新的卓缰、空白的 ImageData 對象
getImageData(): 返回 ImageData 對象,該對象為畫布上指定的矩形復制像素數(shù)據(jù)
putImageData(): 把圖像數(shù)據(jù)(從指定的 ImageData 對象)放回畫布上

合成

globalAlpha: alpha 或透明值
globalCompositeOperation

其他

save():保存當前環(huán)境的狀態(tài)
restore():返回之前保存過的路徑狀態(tài)和屬性
createEvent()
getContext()
toDataURL()

3. 離屏canvas進行預渲染

用離屏canvas進行預渲染了砰诵,原理很簡單征唬,就是先繪制到一個離屏canvas中,然后再通過drawImage把離屏canvas畫到主canvas中

一般例子

ctx.save();
    var j = 0;
    ctx.lineWidth = borderWidth;
    for (var i = 1; i < this.r; i += borderWidth) {
        ctx.beginPath();
        ctx.strokeStyle = this.color[j];
        ctx.arc(this.x, this.y, i, 0, 2 * Math.PI);
        ctx.stroke();
        j++;
    }
    ctx.restore();

4. 示例

畫尺子

//canvas寬高為900
    let canvas = document.getElementById('c')
    let ctx = canvas.getContext('2d');
    //畫尺子主體
    ctx.lineWidth = 3;
    ctx.beginPath();
    ctx.moveTo(48, 400);
    ctx.lineTo(652, 400);
    ctx.strokeStyle = "#666";
    ctx.stroke();
    //每厘米間隔像素
    var rate = 10;
    //循環(huán)畫出刻度線
    for (var i = 0; i < 61; i++) {
        ctx.beginPath();
        ctx.moveTo(50 + rate * i, 400);

        if (i % 5 == 0 && i % 10 != 0 && i != 0) {
            //中間5刻度
            ctx.lineWidth = 2;
            ctx.fillText(i, 45 + rate * i, 420);
            ctx.lineTo(50 + rate * i, 380);
        } else if (i % 10 == 0) {
            //中間10刻度
            ctx.lineWidth = 4;
            ctx.fillText(i, 45 + rate * i, 420);
            ctx.lineTo(50 + rate * i, 375);
        } else {
            ctx.lineWidth = 1;
            ctx.lineTo(50 + rate * i, 385);
        }
        ctx.stroke();
    }

畫時鐘

 let canvas = document.getElementById('c')
    let ctx = canvas.getContext('2d');
    ctx.translate(400, 400)
    ctx.lineWidth = 1;
    ctx.strokeStyle = "#666";
    //圓圈
    ctx.beginPath();
    ctx.arc(0, 0, 110, 0, 2 * Math.PI);
    ctx.stroke();
    ctx.closePath()

    //刻度盤
    ctx.save()
    for (var i = 0; i < 60; i++) {
        ctx.lineWidth = 1;
        ctx.beginPath();
        if (i % 5 == 0) {
            ctx.lineWidth = 3;
            ctx.moveTo(0, 95);
        } else {
            ctx.moveTo(0, 100);
        }
        ctx.lineTo(0, 110);
        ctx.stroke();
        ctx.rotate(6 * Math.PI / 180);
    }
    ctx.restore()

    /** 
     * @Author: xujianwei 
     * @Date: 2018-04-14 09:45:08 
     * @Desc:  畫指針的函數(shù)
     * @params:  ctx--canvas對象
     * @params:  rotate--旋轉角度系數(shù)
     * @params:  length--指針長度
     * @params:  color--指針顏色
     */
    function pointer(ctx, rotate, length, color) {
        ctx.save()
        ctx.beginPath();
        ctx.rotate(rotate * Math.PI / 30);
        ctx.moveTo(0, -10);
        ctx.lineTo(0, length);
        ctx.strokeStyle = color
        ctx.lineWidth = 3;
        ctx.stroke();
        ctx.closePath()
        ctx.restore()
    }
    //使畫布的起始點旋轉到鐘表的12點刻度
    ctx.rotate(Math.PI);
    setInterval(function () {
        //清理現(xiàn)場
        ctx.beginPath();
        ctx.arc(0, 0, 85, 0, 2 * Math.PI);
        ctx.fillStyle = '#fff'
        ctx.fill()
        ctx.closePath()
        //清理完畢
        var date = new Date()
        pointer(ctx, date.getSeconds(), 80, '#ff4d4d')
        pointer(ctx, date.getSeconds() / 60 + date.getMinutes(), 80, '#333')
        pointer(ctx, date.getSeconds() / 720 + date.getMinutes() / 12 + date.getHours() * 5, 30, '#333')

        //添加中間原點
        ctx.beginPath();
        ctx.arc(0, 0, 4, 0, 2 * Math.PI);
        ctx.fillStyle = '#ff4d4d'
        ctx.fill()
        ctx.closePath()
    }, 1000)
 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末茁彭,一起剝皮案震驚了整個濱河市总寒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌理肺,老刑警劉巖摄闸,帶你破解...
    沈念sama閱讀 211,290評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異妹萨,居然都是意外死亡年枕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評論 2 385
  • 文/潘曉璐 我一進店門乎完,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熏兄,“玉大人,你說我怎么就攤上這事∧ν埃” “怎么了桥状?”我有些...
    開封第一講書人閱讀 156,872評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長硝清。 經(jīng)常有香客問我辅斟,道長,這世上最難降的妖魔是什么芦拿? 我笑而不...
    開封第一講書人閱讀 56,415評論 1 283
  • 正文 為了忘掉前任士飒,我火速辦了婚禮,結果婚禮上防嗡,老公的妹妹穿的比我還像新娘变汪。我一直安慰自己侠坎,他們只是感情好蚁趁,可當我...
    茶點故事閱讀 65,453評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著实胸,像睡著了一般他嫡。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庐完,一...
    開封第一講書人閱讀 49,784評論 1 290
  • 那天钢属,我揣著相機與錄音,去河邊找鬼门躯。 笑死淆党,一個胖子當著我的面吹牛,可吹牛的內容都是我干的讶凉。 我是一名探鬼主播染乌,決...
    沈念sama閱讀 38,927評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼懂讯!你這毒婦竟也來了荷憋?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,691評論 0 266
  • 序言:老撾萬榮一對情侶失蹤褐望,失蹤者是張志新(化名)和其女友劉穎勒庄,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體瘫里,經(jīng)...
    沈念sama閱讀 44,137評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡实蔽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,472評論 2 326
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了谨读。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盐须。...
    茶點故事閱讀 38,622評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出贼邓,到底是詐尸還是另有隱情阶冈,我是刑警寧澤,帶...
    沈念sama閱讀 34,289評論 4 329
  • 正文 年R本政府宣布塑径,位于F島的核電站女坑,受9級特大地震影響,放射性物質發(fā)生泄漏统舀。R本人自食惡果不足惜匆骗,卻給世界環(huán)境...
    茶點故事閱讀 39,887評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望誉简。 院中可真熱鬧碉就,春花似錦、人聲如沸闷串。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烹吵。三九已至碉熄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間肋拔,已是汗流浹背锈津。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留凉蜂,地道東北人琼梆。 一個月前我還...
    沈念sama閱讀 46,316評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像窿吩,于是被迫代替她去往敵國和親茎杂。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,490評論 2 348

推薦閱讀更多精彩內容

  • 一:canvas簡介 1.1什么是canvas爆存? ①:canvas是HTML5提供的一種新標簽 ②:HTML5 ...
    GreenHand1閱讀 4,674評論 2 32
  • 一蛉顽、簡介 HTML5 中的定義:“它是依賴分辨率的位圖畫布,你可以在 canvas 上面繪制任何圖形先较,甚至加載照片...
    destiny0904閱讀 10,521評論 1 4
  • ??HTML5 添加的最受歡迎的功能就是 元素闲勺。這個元素負責在頁面中設定一個區(qū)域曾棕,然后就可以通過 JavaScri...
    霜天曉閱讀 3,000評論 0 2
  • 線條樣式 繪制直線,第五章知識簡單回顧 lineWidth 設置或返回當前的線條寬度菜循,單位為像素 lineCap ...
    Zd_silent閱讀 471評論 0 0
  • 一衙耕、canvas簡介 1.1 什么是canvas橙喘?(了解) 是HTML5提供的一種新標簽 Canvas是一個矩形區(qū)...
    Looog閱讀 3,939評論 3 40