學(xué)習(xí)慕課網(wǎng)canvas倒計時實例筆記


視頻地址:慕課·canvas小球倒計時
代碼下載請移步:github
演示地址:在線演示

一、canvas簡介

canvas是HTML5中新加入的標(biāo)簽,但是其真正的控制卻大多需要javascript來控制。在標(biāo)簽內(nèi)可以寫一些不支持HTML5的瀏覽器的提示文字,不用擔(dān)心如果瀏覽器支持HTML5則標(biāo)簽內(nèi)的文本不會顯示。
示例:

<canvas id="canvas" >
      您的瀏覽器不支持html5請使用現(xiàn)代瀏覽器。
</canvas>

提示:由于需要在javascript中獲取該元素,所以需要給canvas設(shè)置id屬性

二、canvas基礎(chǔ)

在頁面中聲明canvas標(biāo)簽后就可以在javascript中獲取并操作canvas畫布啦。

<script type="text/javascript">
//頁面默認(rèn)調(diào)用函數(shù)      
window.onload=function(){
         //獲取canvas標(biāo)簽元素
         var canvas=document.getElementById('canvas');

         //設(shè)置canvas寬、高
         canvas.width=500;
         canvas.height=500;    

        //獲取2d上下文
        var context=canvas.getContext('2d');
 }
</script>

以上代碼就是獲取和初步設(shè)置cnavas屬性的代碼。在設(shè)置canvas的寬高時不建議添加單位,因為可以把canvas看作一張畫布,設(shè)定寬、高時除了設(shè)定畫布大小之外也需要設(shè)置畫布的點(diǎn)密度,如果帶單位時只能設(shè)置畫布的大小,而如果不帶單位除了設(shè)置畫布大小外也同時設(shè)置了畫布的點(diǎn)密度。
在獲取到標(biāo)簽元素后如果要在畫布中進(jìn)行繪制還需要獲取文件的上下文,可以獲取2d、3d上下文,但是html5中推薦支持的是2d上下文,所以用2d上下文瀏覽器支持更好,而且大多數(shù)圖形使用2d上下文已經(jīng)夠用。

三、canvas API簡介

有了一張畫布后我們就可以在畫布上進(jìn)行繪制啦。

  • 繪制路徑
    可以使用moveTo(x,y)方法設(shè)置路徑的起點(diǎn),使用方法lineTo(x,y)設(shè)置繪制路徑的終點(diǎn),使用stroke()方法渲染路徑。但是在我們連續(xù)繪制多條路徑時會發(fā)現(xiàn)繪制的多條路徑格式設(shè)置是相同的。因此為了避免繪制不同樣式路徑造成的不便可以在繪制路徑前用beginPath()函數(shù)和closePath()函數(shù)把路徑包裹起來,這樣在重新繪制時就可以使用新的樣式啦。
/*----------- draw line 1 --------------*/
        context.beginPath();

        context.moveTo(100,100);
        context.lineTo(700,700);
        context.lineTo(100,700);
        context.lineTo(100,100);
        context.lineTo(700,700);

        context.lineWidth=5;
        context.strokeStyle="red";
        context.stroke();
        //context.fill();

        context.closePath();

API:

|函數(shù)|性質(zhì)|意義|
| :---: | : ---: | :---: |
|beginPath()| 方法| 開始一段路徑 |
|moveTo() | 方法 | 路徑起始點(diǎn) |
|lineTo() | 方法 | 路徑終點(diǎn) |
|lineWidth |屬性 | 路徑寬度 |
|strokeStyle|屬性 | 路徑顏色 |
|stroke() |方法 | 渲染路徑 |
|fill() |方法 | 填充封閉路徑 |
|closePath()|方法 | 結(jié)束一段路徑 |

  • 繪制矩形
    繪制矩形也可以分為填充和繪制邊框兩種形式,使用fillRect(x,y,width,height)函數(shù)繪制實心矩形,使用strokeRect(x,y,width,height)函數(shù)繪制空心矩形。clearRect(x,y,width,height)函數(shù)來清除矩形區(qū)域。
/*--------- draw rect-------------------*/
        context.beginPath();

        context.fillStyle='yellow';
        context.fillRect(10,10,10,10);
        
        context.strokeStyle="black";
        context.strokeRect(30,30,30,30);


        context.closePath();

漸變的色條其實也是一個矩形塊,可以使用createLinearGradient(x1,y1,x2,y2)函數(shù)來設(shè)置漸變色帶的漸變方向,x1,y1代表起點(diǎn),x2,y2代表終點(diǎn)。可以使用addColorStop(0,'顏色值'),addColorStop(1,'顏色值')來設(shè)置起點(diǎn)顏色和終點(diǎn)顏色。然后用設(shè)定的樣式填充一個矩形。

/*-------- draw linearGradient ---------*/
        var linear=context.createLinearGradient(0,0,50,300);

        linear.addColorStop(0,'red');
        linear.addColorStop(1,'green');

        context.fillStyle=linear;
        context.fillRect(10,10,200,200);

同樣的繪制陰影也可以看作是在圖形后面繪制一個其它矩形色塊,代碼如下。

/* ------ draw shandow -----------------*/
        context.beginPath();

        context.shadowOffsetX = 20; // 設(shè)置水平位移
        context.shadowOffsetY = -20; // 設(shè)置垂直位移
        context.shadowBlur = 6; // 設(shè)置模糊度
        context.shadowColor = "rgba(0,0,0,0.5)"; // 設(shè)置陰影顏色

        context.fillStyle = "#CC0000"; 
        context.fillRect(150,200,200,400);

        context.closePath();
  • 繪制圓形、弧線
    弧線的繪制函數(shù)arc(x,y,r,startAngle, endAngle, anticlockwise)
    x,y表示圓心的坐標(biāo),r表示半徑,startAngle、endAngle代表開始弧度與結(jié)束弧度,anticloclwise表示弧線繪制是順時針(false)還是逆時針(true)。
/*----------- draw circly  -----------*/
        context.beginPath();

        context.lineWidth=5;
        context.strokeStyle="blue";

        context.arc(300,300,200,0,1.5*Math.PI,true);
        context.stroke();

        context.closePath();

如果要繪制原型將開始弧度、結(jié)束弧度分別設(shè)為0,2PI即可

* ----------- 實心圓 ---------------*/
        context.beginPath();

        context.fillStyle='red';
        context.arc(50,50,50,0,2*Math.PI,true);
        context.fill();

        context.closePath();
/*----------- 空心圓 ---------------*/
        context.beginPath();

        context.lineWidth=5;
        context.strokeStyle='red';
        context.arc(200,200,50,0,2*Math.PI,true);
        context.stroke();

        context.closePath();
  • 繪制文字
    使用fillText(string,x,y)函數(shù)來繪制一段文字,string代表要繪制的問題,x、y代表起點(diǎn)坐標(biāo)。strokeText(string,x,y)函數(shù)繪制空心文字。
/* -------  繪制文字 --------------*/
        context.beginPath();
        //設(shè)置字體
        context.font="Bold 20px Arial";
        //設(shè)置對齊方式
        context.textAlign="left";
        context.lineWidth=2;
        context.fillStyle="slive";
        context.fillText("Hello ",300,300);
        context.strokeText("world!",400,400);

        context.closePath();
  • 繪制圖片
    繪制圖片之前必須首先加載圖像。
        var img=new Image();//創(chuàng)建對象
        img.src="img/login2.jpg";//加載圖片

        img.onload=function(){
        //加載圖像
            if(img.width!=canvas.width){
                canvas.width=img.width;
            }
            if(img.height!=canvas.height){
                canvas.height=img.height;
            }
            context.drawImage(img,0,0);
        }
  • 保存、加載上下文設(shè)置
context.save(); 

context.shadowOffsetX = 10;
context.shadowOffsetY = 10;
context.shadowBlur = 5;
context.shadowColor = "rgba(0,0,0,0.5)";

context.fillStyle = "#CC0000";
context.fillRect(10,10,150,100);

context.restore(); 
context
context.fillStyle = "#000000";
context.fillRect(180,10,150,100);

上面代碼先用save方法,保存了當(dāng)前設(shè)置,然后繪制了一個有陰影的矩形。接著,使用restore方法,恢復(fù)了保存前的設(shè)置,繪制了一個沒有陰影的矩形。

四、像素處理

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,755評論 2 371

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