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


視頻地址:慕課·canvas小球倒計(jì)時(shí)
代碼下載請移步: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的寬高時(shí)不建議添加單位蔗彤,因?yàn)榭梢园裞anvas看作一張畫布川梅,設(shè)定寬、高時(shí)除了設(shè)定畫布大小之外也需要設(shè)置畫布的點(diǎn)密度然遏,如果帶單位時(shí)只能設(shè)置畫布的大小贫途,而如果不帶單位除了設(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ù)繪制多條路徑時(shí)會發(fā)現(xiàn)繪制的多條路徑格式設(shè)置是相同的。因此為了避免繪制不同樣式路徑造成的不便可以在繪制路徑前用beginPath()函數(shù)和closePath()函數(shù)把路徑包裹起來揖闸,這樣在重新繪制時(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ù)繪制實(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();

漸變的色條其實(shí)也是一個(gè)矩形塊贮泞,可以使用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è)定的樣式填充一個(gè)矩形说贝。

/*-------- 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);

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

/* ------ 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表示弧線繪制是順時(shí)針(false)還是逆時(shí)針(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即可

* ----------- 實(shí)心圓 ---------------*/
        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è)置血筑,然后繪制了一個(gè)有陰影的矩形。接著煎楣,使用restore方法豺总,恢復(fù)了保存前的設(shè)置,繪制了一個(gè)沒有陰影的矩形择懂。

四园欣、像素處理

Paste_Image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市休蟹,隨后出現(xiàn)的幾起案子沸枯,更是在濱河造成了極大的恐慌,老刑警劉巖赂弓,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绑榴,死亡現(xiàn)場離奇詭異,居然都是意外死亡盈魁,警方通過查閱死者的電腦和手機(jī)翔怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赤套,你說我怎么就攤上這事飘痛。” “怎么了容握?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵宣脉,是天一觀的道長。 經(jīng)常有香客問我剔氏,道長塑猖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任谈跛,我火速辦了婚禮羊苟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘感憾。我一直安慰自己蜡励,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布阻桅。 她就那樣靜靜地躺著凉倚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鳍刷。 梳的紋絲不亂的頭發(fā)上占遥,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天俯抖,我揣著相機(jī)與錄音输瓜,去河邊找鬼。 笑死芬萍,一個(gè)胖子當(dāng)著我的面吹牛尤揣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播柬祠,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼北戏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了漫蛔?” 一聲冷哼從身側(cè)響起嗜愈,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎莽龟,沒想到半個(gè)月后蠕嫁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毯盈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年剃毒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赘阀,死狀恐怖益缠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情基公,我是刑警寧澤幅慌,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站酌媒,受9級特大地震影響欠痴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秒咨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一喇辽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧雨席,春花似錦菩咨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至糙置,卻和暖如春云茸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背谤饭。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工标捺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揉抵。 一個(gè)月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓亡容,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冤今。 傳聞我的和親對象是個(gè)殘疾皇子闺兢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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