HTML5之Canvas

Canvas

Canvas是HTML5新增的組件故黑,它就是一塊畫布,可以用JavaScript在上畫繪制各種圖標(biāo)、動畫等碍遍。

Web頁面增加畫布

Canvas元素是一個標(biāo)準(zhǔn)的HTML5元素,可以直接在HTML5頁面中添加<canvas>標(biāo)簽阳液,如

<!DOCTYPE HTML>
<html>
<head>
    <title>Look what I Drew</title>
    <meta charset="utf-8">
</head>

<body>
    <canvas id="draw" width="600" height="200"></canvas>
</body>
</html>

width屬性定義它在web頁面中水平方向所占的像素怕敬,height定義了它在web頁面中垂直方向所占的像素。

注意:上面的web頁面無法顯示畫布的帘皿,除非你在畫布上繪制了內(nèi)容东跪。

顯示畫布

現(xiàn)在找到一個證據(jù),證明畫布在我們的頁面中確實存在鹰溜。我們可以通過位canvas指定CSS樣式虽填,下面來增加一個簡單的樣式,為畫布增加一個1像素寬的黑色邊框曹动。

<!DOCTYPE HTML>
<html>
<head>
    <title>Look what I Drew</title>
    <meta charset="utf-8">
    <!--指定樣式-->
    <style>
        canvas{
            border: 1px solid black;
        }
    </style>
</head>

<body>
    <canvas id="draw" width="600" height="200"></canvas>
</body>
</html>

效果:

  • 一個頁面可以有多個畫布斋日,但是要為每個Canvas指定唯一的id
  • 默認(rèn)情況下,畫布是透明的

在畫布上繪圖

接下來我們開始在畫布上繪制一個矩形墓陈。要畫這個矩形恶守,首先要確定矩形的位置,其次是矩形的大小贡必。這里把矩形畫在x=10像素兔港、y=10像素的位置,讓它的高度和寬度都等于100像素仔拟。

  • 1.首先獲得Canvas元素的引用
  • 2.獲取畫布的一個“2d"上下文
  • 3.使用這個上下文萊繪制圖像
<!DOCTYPE HTML>
<html>
<head>
    <title>Look what I Drew</title>
    <meta charset="utf-8">
    <style>
        canvas{
            border: 1px solid black;
        }
    </style>

    <script>
        window.onload = function () {
            //在畫布上畫個矩形
            var canvas = document.getElementById('draw');
            var context = canvas.getContext("2d");
            context.fillRect(10,10,100,100);
        };
    </script>
</head>

<body>
    <canvas id="draw" width="600" height="200"></canvas>
</body>
</html>

失敗處理

因為Canvas是HTML5中新增的特性衫樊,所以會遇到有些瀏覽器不支持的情況,這是我們就需要查看canvas對象中是否存在getContext方法:

<script>
    window.onload = function () {
        //在畫布上畫個矩形
        var canvas = document.getElementById('draw');
        //判斷瀏覽器是否支持Canvas
        if (canvas.getContext) {
            console.info("you hava canvas");
            var context = canvas.getContext("2d");
            context.fillRect(10,10,100,100);
        } else {
            console.info("soory, no canvas support ApI");
        }


    };
</script>

此外我們還可以這樣做:

<canvas id="draw" width="600" height="200">Please upgrade your browser!</canvas>

只要瀏覽器看到不認(rèn)識的元素利花,默認(rèn)行為就顯示其中包含的文本橡伞。所以盒揉,不支持Canvas的瀏覽器看到<canvas>元素時,它們就會顯示Please upgrade your browser!兑徘。另一方面刚盈,支持畫布的瀏覽器會直接忽略畫布標(biāo)記之間的所有文本,所以不會顯示這個文本挂脑。

實例演示

現(xiàn)在藕漱,我們開始通過一個實例來學(xué)習(xí)使用Canvas繪制矩形、圓崭闲、文本肋联、圖片等功能。先看看效果:

建立HTML刁俭,并增加form表單

先新建一個HTML的頁面橄仍,并增加form表單控件

<!DOCTYPE HTML>
<html>
<head>
    <title>TweetShirt</title>
    <meta charset="utf-8">
    <style>
        canvas{
            border: 1px solid black;
        }
    </style>

    <script src = "tweetshirt.js">
    </script>
</head>

<body>
    <h1>TweetShirt</h1>
    <canvas id="tshirtCanvas" width="600" height="200">Please upgrade your browser to use TweetShirt!</canvas>

    <form>
        <p>
            <label for="backgroudColor">選擇背景顏色: </label>
            <select id = "backgroundColor">
                <option value="white" selected="selected">白色</option>
                <option value="black">黑色</option>
            </select>
        </p>

        <p>
            <label for="shape">選擇圖形: </label>
            <select id = "shape">
                <option value="none" selected="selected">無</option>
                <option value="circles">圓形</option>
                <option value="squares">正方形</option>
            </select>
        </p>

        <p>
            <label for="foregroundColor">選擇前景顏色: </label>
            <select id = "foregroundColor">
                <option value="black" selected="selected">黑色</option>
                <option value="white">白色</option>
            </select>
        </p>

        <p>
            <input type="button" id="previewButton" value="預(yù)覽">
        </p>

    </form>
</body>
</html>

JavaScript處理表單控件

新建一個JavaScript文件tweetshirt.js,首先啟動預(yù)覽按鈕牍戚,這樣點擊這個按鈕時它就會調(diào)用一個JavaScript函數(shù)來處理Canvas繪制侮繁。

window.onload = function () {
    var button = document.getElementById("previewButton");
    button.onclick = previewHandler;
}

<!--預(yù)覽點擊事件-->
function previewHandler() {
    var canvas = document.getElementById("tshirtCanvas");
    var context = canvas.getContext("2d");

    //繪制圖像之前,重置之前繪制的內(nèi)容
    fillBackgroudColor(canvas,context);

    //查看界面選擇了哪種顏色
    var selectObj = document.getElementById("shape");
    var index = selectObj.selectedIndex; //得到表單控件選項的編號的數(shù)組
    var shape = selectObj[index].value; //得到選項的值

    if (shape == "squares") {
        for(var squares = 0 ; squares < 20; squares++) {
            //繪制正方形
            drawSquare(canvas,context);
        }
    }

    if (shape == "circles") {
        for(var circles = 0 ; circles < 20; circles++) {
            //繪制圓
            drawCircle(canvas,context);
        }
    }
    //繪制文本
    drawText(canvas,context);
    //繪制圖片
    drawImage(canvas,context);
}

function fillBackgroudColor(canvas,context) {
    var selectObj = document.getElementById("backgroundColor");
    var index = selectObj.selectedIndex;
    var bgColor = selectObj[index].value;

    //fillStyle保存畫布上完成繪制時所用的顏色,它是一個屬性而不是方法如孝,所以需要設(shè)置而不是調(diào)用
    context.fillStyle = bgColor;
    context.fillRect(0,0,600,200);
}

繪制矩形

  • 指定正方形的邊長
  • 指定正方形的位置x和y
  • 設(shè)置正方形的屬性
  • 繪制正方形
//畫正方形
function drawSquare(canvas,context) {
    var w = Math.floor(Math.random() * 40);

    var x = Math.floor(Math.random() * canvas.width);
    var y = Math.floor(Math.random() * canvas.height);

    context.fillStyle = "lightblue";
    context.fillRect(x,y,w,w);
}

繪制線

  • beginPath方法告訴畫布開始一個新路徑
  • moveTo方法把畫筆移到畫布上的指定點
  • lineTo方法描繪路徑宪哩,從畫筆的當(dāng)前位置描繪到畫布上的另一個點
  • closePath方法將路徑的起始點連接到當(dāng)前路徑的最后一個點
//繪制線
function drawLine(canvas, context) {
    context.beginPath();
    context.moveTo(100, 150);
    context.lineTo(250, 75);
    context.lineTo(125, 30);
    context.closePath();
    context.lineWidth = 5;
    context.stroke();
    context.fillStyle = "red";
    context.fill();
}

繪制圓形

  • 創(chuàng)建一個路徑
  • 填充arc方法參數(shù)
  • 設(shè)置圓的屬性
  • 填充圓

先來分析arc方法

context.arc(x,y,radius,startAngle,endAngle.direction);
  • x和y:確定圓心在畫布上的位置
  • radius:圓的半徑
  • startAngle:圓弧的起始角,確定路徑的起點第晰,可以為負(fù)值(表示按負(fù)方向度量)锁孟,單位為弧度
  • endAngle:圓弧的終止角,確定路徑的終點茁瘦,可以為負(fù)值(表示按負(fù)方向度量)品抽,單位為弧度
  • direction: true表示逆時針畫弧,false表示順時針畫弧
//畫圓形
function drawCircle(canvas,context) {

    var radius = Math.floor(Math.random() * 40);

    var x = Math.floor(Math.random() * canvas.width);
    var y = Math.floor(Math.random() * canvas.height);

    context.beginPath();
    context.arc(x,y,radius,0,degreeToRadians(360),true);
    context.fillStyle = "red";
    context.fill();
}

//度數(shù)轉(zhuǎn)弧度
function degreeToRadians(degree) {
    return (degree * Math.PI) / 180;
}

繪制文本

  • 設(shè)置文本的屬性
  • 填充文本
//畫文本
function drawText(canvas,context) {

    var selectObj = document.getElementById("foregroundColor");
    var index = selectObj.selectedIndex;
    var fgColor = selectObj[index].value;

    context.fillStyle = fgColor; //設(shè)置字體顏色
    context.font = "bold 1em sans-serif"; //設(shè)置字體
    context.textAlign = "left"; //設(shè)置對齊方式
    context.fillText("I saw this tweet",20,40); //填充文本

    context.font = "bold 1em sans-serif";
    context.textAlign = "right";
    context.fillText("and I got was this lousy t-shirt!",canvas.width-20,canvas.height-40);
}

繪制圖片

  • 首先甜熔,創(chuàng)建一個JavaScript Image對象
  • 設(shè)置這個Image對象的圖片來源地址
  • 調(diào)用drawImage方法繪制圖片
function drawImage(canvas,context) {
    var image = new Image();
    image.src = "twitterBird.png";

    //表示圖片加載完成桑包,就執(zhí)行這個函數(shù)
    image.onload = function () {
        context.drawImage(image,20,120,70,70);
    }
}

效果:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市纺非,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌赘方,老刑警劉巖烧颖,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窄陡,居然都是意外死亡炕淮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門跳夭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涂圆,“玉大人们镜,你說我怎么就攤上這事∪笄福” “怎么了模狭?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長踩衩。 經(jīng)常有香客問我嚼鹉,道長,這世上最難降的妖魔是什么驱富? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任锚赤,我火速辦了婚禮,結(jié)果婚禮上褐鸥,老公的妹妹穿的比我還像新娘线脚。我一直安慰自己,他們只是感情好叫榕,可當(dāng)我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布浑侥。 她就那樣靜靜地躺著,像睡著了一般翠霍。 火紅的嫁衣襯著肌膚如雪锭吨。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天寒匙,我揣著相機(jī)與錄音零如,去河邊找鬼。 笑死锄弱,一個胖子當(dāng)著我的面吹牛考蕾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播会宪,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼肖卧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了掸鹅?” 一聲冷哼從身側(cè)響起塞帐,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巍沙,沒想到半個月后葵姥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡句携,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年榔幸,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡削咆,死狀恐怖牍疏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拨齐,我是刑警寧澤鳞陨,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站奏黑,受9級特大地震影響炊邦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜熟史,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一馁害、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹂匹,春花似錦碘菜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至履植,卻和暖如春计雌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背玫霎。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工凿滤, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人庶近。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓翁脆,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鼻种。 傳聞我的和親對象是個殘疾皇子反番,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,901評論 2 355

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

  • Canvas API 在網(wǎng)頁上使用cnavas元素時,會創(chuàng)建一塊矩形區(qū)域叉钥,默認(rèn)大小是300*150px 坐標(biāo)從左上...
    Iris_mao閱讀 701評論 0 6
  • 一:canvas簡介 1.1什么是canvas罢缸? ①:canvas是HTML5提供的一種新標(biāo)簽 ②:HTML5 ...
    GreenHand1閱讀 4,683評論 2 32
  • 一、canvas簡介 1.1 什么是canvas投队?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個矩形區(qū)...
    Looog閱讀 3,942評論 3 40
  • 一枫疆、簡介 HTML5 中的定義:“它是依賴分辨率的位圖畫布,你可以在 canvas 上面繪制任何圖形蛾洛,甚至加載照片...
    destiny0904閱讀 10,541評論 1 4
  • 一、canvas簡介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個矩形區(qū)...
    J_L_L閱讀 1,516評論 0 4