canvas學(xué)習(xí)(一)

簡介:

canvas是html5最重要的元素阔涉,提供了一個(gè)畫布的功能诗祸,有強(qiáng)大的圖形處理能力

思維導(dǎo)圖

canvas標(biāo)簽添加

要使用canvas,首先要在body中添加上canvas標(biāo)簽

canvas標(biāo)簽是一塊默認(rèn)300*150大小的畫布

畫布寬高設(shè)置:

使用canvas標(biāo)簽的屬性,width及height直接在行間設(shè)置

此處注意:不要用css樣式去改畫布大小迂苛,這個(gè)會(huì)導(dǎo)致畫布中的圖像被拉伸

<canvas id="canvas1" width="800" height="500"></canvas>

畫布css樣式

畫布的其他css樣式可以正常設(shè)置

canvas標(biāo)簽中的內(nèi)容
canvas標(biāo)簽中的內(nèi)容是(包括標(biāo)簽)只有在不支持此效果的低版本瀏覽器中才會(huì)顯示的;在高版本瀏覽器中不會(huì)顯示出來

<canvas id="canvas1" width="800" height="500">
    只是一個(gè)canvas標(biāo)簽鼓择,然而你看不到
</canvas>

獲取canvas標(biāo)簽及上下文

canvas標(biāo)簽使用js正常dom節(jié)點(diǎn)的獲取方法獲取

var canvas = document.getElementById('canvas1');

上下文是記錄canvas執(zhí)行命令語句的地方三幻,獲取如下,后面的參數(shù)現(xiàn)在只有2d可選

var context = canvas.getContext('2d');

canvas坐標(biāo)系

左上角是00點(diǎn)呐能,x軸正方向向右念搬,y軸正方向向下

樣式設(shè)置

邊框設(shè)置:context.strokeStyle
填充設(shè)置:context.fillStyle
線寬設(shè)置:context.lineWidth

context.strokeStyle = "red";
context.lineWidth = 2;
context.fillStyle = 'yellow';

繪制圖形

繪制命令
  1. 邊框式繪制:context.stroke();
  2. 填充式繪制:context.fill();
新建路徑beginPath()

這個(gè)方法代表重新開始一段路徑,也可以理解為新建一個(gè)圖層
這個(gè)的方法之后執(zhí)行的繪制動(dòng)作摆出,不會(huì)執(zhí)行到這個(gè)方法之前的命令

context.beginPath();
繪制直線:
  1. 設(shè)置畫筆開始位置:context.moveTo(x,y)
  2. 設(shè)置畫筆結(jié)束位置:context.lineTo(x,y)
  3. 線段兩邊圓角:context.lineCap = "round"

context.strokeStyle = "red";
context.lineWidth = 2;
context.moveTo(100,100);
context.lineTo(500,100);
context.stroke();
繪制三角:方法就是繪制3條直線

繪制多條連續(xù)線段時(shí)朗徊,不必每次重新定義起始點(diǎn)
畫筆會(huì)停在上一段線段的終點(diǎn),并默認(rèn)為下一次繪制的起始點(diǎn)

context.strokeStyle = "red";
context.lineWidth = 2;

context.moveTo(10,10);
context.lineTo(10,110);
context.lineTo(110,110);
context.lineTo(10,10);
context.stroke();

注意偎漫,此處用繪制直線的方法爷恳,進(jìn)行圖形的繪制時(shí);直線封閉處會(huì)出現(xiàn)瑕疵象踊,不會(huì)完全閉合



閉合方法:context.closePath()

加上上面的閉合命令后温亲,閉合處的瑕疵就會(huì)被修復(fù)
這個(gè)方法會(huì)自動(dòng)將起點(diǎn)與末點(diǎn)相連,所以不必再將路徑回到起始點(diǎn)

context.strokeStyle = "red";
context.lineWidth = 2;

context.beginPath();
context.moveTo(10,10);
context.lineTo(10,110);
context.lineTo(110,110);
context.closePath();  //封閉路徑后最后一個(gè)點(diǎn)就不用定義了
context.stroke();

繪制矩形

定義矩形:context.rect(x,y,w,h);

  1. x:起始位置x坐標(biāo)(矩形左上角)
  2. y:起始位置y坐標(biāo)(矩形左上角)
  3. w:矩形寬
  4. h:矩形高

直接繪制:省去了定義矩形的步驟杯矩,按照定義的樣式直接填充或描邊

context.fillRect(x,y,w,h)
context.strokeRect(x,y,w,h)

橡皮擦功能:clearRect(x,y,w,h)

  1. 擦除矩形范圍之內(nèi)的內(nèi)容
  2. 常用來擦除整個(gè)畫布以實(shí)現(xiàn)動(dòng)畫效果
圖形繪制方式

邊框式繪制:

context.strokeStyle = "red";
context.lineWidth = 2;
context.rect(150,150,200,100);
context.stroke();

填充式繪制:

context.fillStyle = 'yellow';
context.rect(150,150,200,100);
context.fill();
填充+描邊同時(shí)使用注意:

這兩個(gè)效果同時(shí)使用時(shí)栈虚,先后順序的不同會(huì)導(dǎo)致效果的差異

一般是在填充后再去描邊,如下效果

context.strokeStyle = "red";
context.lineWidth = 2;
context.rect(150,150,200,100);
context.fill();
context.stroke();

如果是描邊后再填充的話史隆,填充效果會(huì)遮擋一半的邊框

//線寬被遮擋一半
context.strokeStyle = "red";
context.lineWidth = 2;
context.rect(150,150,200,100);
context.stroke();
context.fill();
繪制弧形

常用方法:context.arc(x,y,r,θ1,θ2,boolean)

  1. x:中心點(diǎn)x坐標(biāo)
  2. y:中心點(diǎn)y坐標(biāo)
  3. r:圓半徑
  4. θ1:起始角度
  5. θ2:結(jié)束角度
  6. 布爾值:false逆時(shí)針(默認(rèn))节芥,true順時(shí)針

//畫弧線
context.strokeStyle = "red";
context.lineWidth = 2;
context.arc(300,100,100,0,Math.PI/2,true)
context.stroke();
//畫圓
context.beginPath();
context.arc(300,200,100,0,Math.PI*2,true)
context.stroke();
繪制文字

設(shè)置文字樣式:context.font = 'italic size family'

  1. italic:斜體
  2. size:字體大小
  3. family:字體

設(shè)置文字內(nèi)容:context.strokeText("text",x,y)

  1. "text":中文字內(nèi)容
  2. x:起始x坐標(biāo)
  3. y:起始y坐標(biāo)

context.lineWidth = 1;
context.strokeStyle = "green";
context.font = "italic 150px arial"
context.strokeText("我是文字",50,200);
漸變樣式

線性漸變:createLinearGradient(x1,y1,x2,y2)

  1. x1/y1:漸變起始位置坐標(biāo)
  2. x2/y2:漸變結(jié)束位置坐標(biāo)

徑向漸變:createRadiusGradient(x1,y1,r1,x2,y2,r2)

  1. x1/y1:漸變起始圓的圓心位置坐標(biāo)
  2. r1:漸變起始圓半徑
  3. x2/y2:漸變結(jié)束圓的圓心位置坐標(biāo)
  4. r2:漸變結(jié)束圓半徑

漸變顏色設(shè)置:addColorStop(%,"color");

  1. %:漸變進(jìn)度,用[0,1]之間的數(shù)字表示
  2. "color":每個(gè)漸變階段的顏色

var linearGradient = context.createLinearGradient(100,300,800,500);

linearGradient.addColorStop(0,"red");
linearGradient.addColorStop(0.4,"yellow");
linearGradient.addColorStop(0.8,"green");
linearGradient.addColorStop(1,"blue");

context.fillStyle = linearGradient;

context.font = "italic 150px arial"
context.fillText("我是文字",50,200);
繪制陰影

陰影顏色:shadowColor = "color";
陰影模糊度:shadowblur = number;
陰影偏移X:shadowOffsetX = number;
陰影偏移Y:shadowOffsetY = number;

context.shadowColor = "black";
context.shadowBlur = 20;
context.shadowOffsetX = 10;
context.shadowOffsetY = 5;

context.strokeRect(100,100,100,100);

坐標(biāo)變換

相關(guān)例子可以看我的另一篇博客canvas鐘表效果
坐標(biāo)系平移:translate(x,y)
  1. 即是將坐標(biāo)系的00點(diǎn)變換到(x,y)位置
坐標(biāo)系旋轉(zhuǎn):rotate(θ)
  1. 將坐標(biāo)系旋轉(zhuǎn)θ度
  2. θ > 0時(shí)順時(shí)針旋轉(zhuǎn),θ < 0時(shí)逆時(shí)針旋轉(zhuǎn)
坐標(biāo)系縮放:scale(x,y)
  1. 將坐標(biāo)系x方向放大x倍
  2. 將坐標(biāo)系y方向放大y倍

注意:因?yàn)樽鴺?biāo)系在經(jīng)過變換之后头镊,之后重新繪制的圖形都會(huì)以這個(gè)新的坐標(biāo)系為參考蚣驼;所以在繪制的時(shí)候會(huì)非常的麻煩

解決方案如下:

save():保存當(dāng)前坐標(biāo)系

restore():讀取保存的坐標(biāo)系

  1. 每次在進(jìn)行坐標(biāo)系變換之前,先使用save()將原始坐標(biāo)系保存下來
  2. 在進(jìn)行變換之后相艇,再使用restore()將坐標(biāo)系恢復(fù)為初始坐標(biāo)系
  3. 每個(gè)restore()對(duì)應(yīng)相應(yīng)的一個(gè)save()颖杏,所以在全局中保存一次隨后無限restore()的做法是無效的

繪制貝塞爾曲線/二次曲線

相關(guān)例子可以看我另一篇博客canvas隨拖動(dòng)變化的貝塞爾曲線
先用moveTo(x,y)設(shè)置起始點(diǎn)坐標(biāo)
貝塞爾曲線:bezierCurveTo(cpx1,cpy1,cpx2,cpy2,dx,dy)
  1. cpx1/xpy1:控制點(diǎn)1坐標(biāo)
  2. cpx2/xpy2:控制點(diǎn)2坐標(biāo)
  3. dx/dy:終點(diǎn)坐標(biāo)
二次曲線quadraticCurveTo(cpx,cpy,dx,dy)
  1. cpx/xpy:控制點(diǎn)坐標(biāo)
  2. dx/dy:終點(diǎn)坐標(biāo)

context.beginPath();
context.moveTo(300,100);
//貝塞爾曲線
context.bezierCurveTo(200,100,300,300,200,300);
context.stroke()

//二次曲線
context.moveTo(300,300);
context.quadraticCurveTo(400,150,500,300);
context.stroke();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市坛芽,隨后出現(xiàn)的幾起案子留储,更是在濱河造成了極大的恐慌,老刑警劉巖咙轩,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件获讳,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡活喊,警方通過查閱死者的電腦和手機(jī)丐膝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钾菊,“玉大人帅矗,你說我怎么就攤上這事∩诽蹋” “怎么了浑此?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長滞详。 經(jīng)常有香客問我凛俱,道長,這世上最難降的妖魔是什么料饥? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任蒲犬,我火速辦了婚禮,結(jié)果婚禮上稀火,老公的妹妹穿的比我還像新娘暖哨。我一直安慰自己,他們只是感情好凰狞,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布篇裁。 她就那樣靜靜地躺著,像睡著了一般赡若。 火紅的嫁衣襯著肌膚如雪达布。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天逾冬,我揣著相機(jī)與錄音黍聂,去河邊找鬼躺苦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛产还,可吹牛的內(nèi)容都是我干的匹厘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼脐区,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼愈诚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起牛隅,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤炕柔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后媒佣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匕累,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年默伍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欢嘿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡巡验,死狀恐怖际插,靈堂內(nèi)的尸體忽然破棺而出碘耳,到底是詐尸還是另有隱情显设,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布辛辨,位于F島的核電站捕捂,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏斗搞。R本人自食惡果不足惜指攒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僻焚。 院中可真熱鬧允悦,春花似錦、人聲如沸虑啤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狞山。三九已至全闷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間萍启,已是汗流浹背总珠。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工屏鳍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人局服。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓钓瞭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親淫奔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子降淮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • 一:canvas簡介 1.1什么是canvas? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,667評(píng)論 2 32
  • 一搏讶、canvas簡介 1.1 什么是canvas佳鳖?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,938評(píng)論 3 40
  • 一、canvas簡介 1.1 什么是canvas媒惕?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    J_L_L閱讀 1,499評(píng)論 0 4
  • --繪圖與濾鏡全面解析 概述 在iOS中可以很容易的開發(fā)出絢麗的界面效果系吩,一方面得益于成功系統(tǒng)的設(shè)計(jì),另一方面得益...
    韓七夏閱讀 2,710評(píng)論 2 10
  • 書中代碼示例效果展示:Core HTML5 Canvas Examples 基礎(chǔ)知識(shí) canvas元素 canva...
    szu_bee閱讀 2,803評(píng)論 2 28