淺析HTML5的Canvas——案例繪制

1. Canvas繪制五環(huán)

<script>
    //1.獲取canvas和上下文
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');

    //2.繪制奧運五環(huán)
    //第一個五環(huán)
    //遍歷
    //顏色數(shù)組
    var colorArr = ['red','green','yellow','blue','black'];
    for(var i = 0;i<5;i++){
        ctx.beginPath();
        ctx.arc(100 *(i+1),150,80,0,2 * Math.PI);
        ctx.strokeStyle = colorArr[i];
        ctx.lineWidth = 5;
        ctx.stroke();
    };
    //繪制第二個五環(huán)
    var colorArr = ['red','green','yellow','blue','black'];
    for(var i = 0;i<5;i++){//0,1,2
        ctx.beginPath();
        if(i<3){
            ctx.arc(100 *(i+1),350,80,0,2 * Math.PI);
        }else{//3,4
            ctx.arc(100 *(i-2) + 40,350 + 80,80,0,2 * Math.PI);
        }
        ctx.strokeStyle = colorArr[i];
        ctx.lineWidth = 5;
        ctx.stroke();
    };
</script>
canvas繪制五環(huán)渲染效果

2.Canvas繪制餅狀圖以及繪制文字

<script>
    var canvas = document.getElementById('canvas');
    var ctx = canvas.getContext('2d');

    //2.繪制餅狀圖
    //常量
    var canW = canvas.width * 0.5;//圓心
    var canH = canvas.height * 0.5;//圓心
    var radius = 150;
    //數(shù)據(jù)
    var dataArr = [
        {name:'北京',color:'yellow',value:'0.3'},
        {name:'上海',color:'red',value:'0.2'},
        {name:'廣州',color:'green',value:'0.1'},
        {name:'深圳',color:'blue',value:'0.15'},
        {name:'杭州',color:'purple',value:'0.25'}
    ];
    //3.遍歷并繪制扇形
    var beginAngle = -90 * Math.PI/180;
    for(var i= 0;i<dataArr.length;i++){
        //3.1獲取每一個扇形的角度
        var temAngle = dataArr[i].value *360 *Math.PI/180;
        //3.2獲取終點
        var endAngle = beginAngle + temAngle;
        //開啟新路徑
        ctx.beginPath();
        ctx.moveTo(canW,canH);
        ctx.arc(canW,canH,radius,beginAngle,endAngle);
        ctx.fillStyle = dataArr[i].color;
        ctx.fill();

        //3.3繪制文字
        //獲取每一個文字的角度
        var textAngle = beginAngle + temAngle * 0.5;
        //文字坐標(biāo)
        var textX = canW + (radius+30)* Math.cos(textAngle);
        var textY = canH + (radius+30)* Math.sin(textAngle);
        //獲取文字內(nèi)容
        var text = dataArr[i].name + dataArr[i].value *100 + '%';
        //設(shè)置文字字號
        ctx.font = "20px '微弱雅黑'";
        ctx.strokeStyle = dataArr[i].color;
        //設(shè)置左邊文字的對齊方式
        if(textAngle>90 * Math.PI/180 && textAngle<270 *Math.PI/180){
            ctx.textAlign = 'end';
        }
        ctx.strokeText(text,textX,textY);
        //更新起點,讓當(dāng)前的終點角度成為下一個圖形的起點的角度
        beginAngle = endAngle;
    }
</script>
Canvas繪制餅狀圖以及文字渲染效果

3. Canvas繪制一堆不斷變大變小的隨機(jī)移動的氣泡

  • html文件
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>氣泡變化</title>
</head>
<body>
<canvas id="canvas" width="1200px" height="800px">
</canvas>
</body>
<script src="main.js">

</script>
</html>
  • js文件
<script >
    //獲取context
    var canvas=document.querySelector('canvas'),
    context=canvas.getContext('2d');
    // 這個數(shù)組用于保存畫布上出現(xiàn)的所有球
    var balls = [];
    // 用于表示球的所有細(xì)節(jié)的Ball函數(shù)
    // x能犯、y分別是氣泡初始化的位置
    //radius是氣泡的半徑-隨機(jī)
    //strokeColor 繪制顏色 -隨機(jī)
    //填充顏色-隨機(jī)
    //flag半徑變大還是變小
    //flagx x增大還是減小
    //flagy y增加還是減少
    // 構(gòu)建一個氣泡對象
    function Ball(x, y) {
        this.x = x;
        this.y = y;
        this.radius = Math.round(Math.random()*10)*10;
        this.strokeColor = 'rgba('+Math.round(Math.random()*10)*25+','+Math.round(Math.random()*10)*25+','+Math.round(Math.random()*10)*25+',0)';
        this.fillColor = 'rgba('+Math.round(Math.random()*10)*25+','+Math.round(Math.random()*10)*25+','+Math.round(Math.random()*10)*25+','+Math.round(Math.random()*10)/10+')';
        this.flag=1;
        this.flagx=1;
        this.flagy=1;
    }
    // 向數(shù)組添加小球
    function addBall() {
        // 小球半徑
        var radius = Math.round(Math.random()*10)*10;
        var x=0,y=0;

        if (x<200||x>1000){
            x=Math.round(Math.random()*10)*100;
        }
        if (y<200||x>600){
            y=Math.round(Math.random()*10)*60;
        }
        // 創(chuàng)建新的ball對象
        var ball = new Ball(x,y);
        // 將其保存在balls數(shù)組中
        balls.push(ball);
    }
    //繪制圖像并且在20ms后再次繪制
      function drawFrame() {
        // 清除畫布
        context.clearRect(0, 0, canvas.width, canvas.height);
        context.beginPath();
        // 循環(huán)所有的球,并重新定義他們的位置和大小

        for(var i=0; i<balls.length; i++) {
            if (balls[i].flagx==1){
                balls[i].x++;
                if (balls[i].x>=800){
                    balls[i].flagx=0;
                }
            }else if(balls[i].flagx==0){
                balls[i].x--;
                if (balls[i].x<=0){
                    balls[i].flagx=1;
                }
            }
            if (balls[i].flagy==1){
                balls[i].y++;
                if (balls[i].y>=600){
                    balls[i].flagy=0;
                }
            }else if(balls[i].flagy==0){
                balls[i].y--;
                if (balls[i].y<=0){
                    balls[i].flagy=1;
                }
            }
            if (balls[i].flag==1){
                balls[i].radius++;

                balls[i].y++;
                if (balls[i].radius>=100){
                    balls[i].flag=0;
                }
            }else if (balls[i].flag==0){
                balls[i].radius--;
                balls[i].x--;
                balls[i].y--;
                if (balls[i].radius<=0){
                    balls[i].flag=1;
                }
            }
            var ball = balls[i];
            context.beginPath();
            context.fillStyle = balls[i].fillColor;
            context.strokeStyle=balls[i].strokeColor;
            // 繪制球
            context.arc(balls[i].x, balls[i].y, balls[i].radius, 0, Math.PI*2);
            context.lineWidth = 0;
            context.fill();
            context.stroke();
        }
        // 20毫秒后繪制下一幀
        setTimeout(drawFrame, 20);
    }
    //調(diào)用并且初始化小球
      for(var i=0;i<50;i++){
          addBall();
      }
      drawFrame();
</script>
效果渲染示例

4.Canvas繪制簡單的時鐘

  • html文件
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Clock</title>
    <style>
        body {
            background: #dddddd;
        }

        #canvas {
            position: absolute;
            left: 0px;
            top: 0px;
            margin: 20px;
            background: #ffffff;
            border: thin solid #aaaaaa;
        }
    </style>
</head>
<body>
    <canvas id='canvas' width='400' height='400'>
      Canvas not supported
    </canvas>

    <script src='example.js'></script>
</body>
</html>
  • js文件
const canvas = document.getElementById('canvas'),
    context = canvas.getContext('2d'),
    FONT_HEIGHT = 15,
    MARGIN = 35,
    HAND_TRUNCATION = canvas.width / 25,
    HOUR_HAND_TRUNCATION = canvas.width / 10,
    NUMERAL_SPACING = 20,
    RADIUS = canvas.width / 2 - MARGIN,
    HAND_RADIUS = RADIUS + NUMERAL_SPACING;
// Functions.....................................................
function drawCircle() {
    context.beginPath();
    context.arc(canvas.width / 2, canvas.height / 2,
        RADIUS, 0, Math.PI * 2, true);
    context.stroke();
}
function drawNumerals() {
    let numerals = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
        angle = 0,
        numeralWidth = 0;
    numerals.forEach(function(numeral) {
        angle = Math.PI / 6 * (numeral - 3);
        numeralWidth = context.measureText(numeral).width;
        context.fillText(numeral,
            canvas.width / 2 + Math.cos(angle) * (HAND_RADIUS) -
            numeralWidth / 2,
            canvas.height / 2 + Math.sin(angle) * (HAND_RADIUS) +
            FONT_HEIGHT / 3);
    });
}
function drawCenter() {
    context.beginPath();
    context.arc(canvas.width / 2, canvas.height / 2, 5, 0, Math.PI * 2, true);
    context.fill();
}
function drawHand(loc, isHour) {
    let angle = (Math.PI * 2) * (loc / 60) - Math.PI / 2,
        handRadius = isHour ? 
                     RADIUS - HAND_TRUNCATION - HOUR_HAND_TRUNCATION :
                     RADIUS - HAND_TRUNCATION;
    context.moveTo(canvas.width / 2, canvas.height / 2);
    context.lineTo(canvas.width / 2 + Math.cos(angle) * handRadius,
        canvas.height / 2 + Math.sin(angle) * handRadius);
    context.stroke();
}
function drawHands() {
    let date = new Date,
        hour = date.getHours();
    hour = hour > 12 ? hour - 12 : hour;
    drawHand(hour * 5 + (date.getMinutes() / 60) * 5, true, 0.5);
    drawHand(date.getMinutes(), false, 0.5);
    drawHand(date.getSeconds(), false, 0.2);
}
function drawClock() {
    context.clearRect(0, 0, canvas.width, canvas.height);
    drawCircle();
    drawCenter();
    drawHands();
    drawNumerals();
}
// Initialization................................................
context.font = FONT_HEIGHT + 'px Arial';
loop = setInterval(drawClock, 1000);
canvas時鐘渲染圖

Canvas的基本介紹先介紹到這里坦康;如果對您有所幫助的話卷仑,請點贊并關(guān)注哦姐浮,我會不定時的更新一下自己學(xué)習(xí)的經(jīng)驗以及見解浩嫌,和大家進(jìn)行交流杂拨。

您贊就是是我最大的動力Wㄆ铡!弹沽!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末檀夹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子策橘,更是在濱河造成了極大的恐慌炸渡,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丽已,死亡現(xiàn)場離奇詭異蚌堵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)沛婴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進(jìn)店門吼畏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人嘁灯,你說我怎么就攤上這事泻蚊。” “怎么了旁仿?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵藕夫,是天一觀的道長。 經(jīng)常有香客問我枯冈,道長毅贮,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任尘奏,我火速辦了婚禮滩褥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘炫加。我一直安慰自己瑰煎,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布俗孝。 她就那樣靜靜地躺著酒甸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赋铝。 梳的紋絲不亂的頭發(fā)上插勤,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼农尖。 笑死析恋,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盛卡。 我是一名探鬼主播助隧,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼滑沧!你這毒婦竟也來了并村?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嚎货,失蹤者是張志新(化名)和其女友劉穎橘霎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體殖属,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡姐叁,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了洗显。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外潜。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖挠唆,靈堂內(nèi)的尸體忽然破棺而出处窥,到底是詐尸還是另有隱情,我是刑警寧澤玄组,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布滔驾,位于F島的核電站,受9級特大地震影響俄讹,放射性物質(zhì)發(fā)生泄漏哆致。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一患膛、第九天 我趴在偏房一處隱蔽的房頂上張望摊阀。 院中可真熱鬧,春花似錦踪蹬、人聲如沸胞此。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽漱牵。三九已至,卻和暖如春疚漆,著一層夾襖步出監(jiān)牢的瞬間布疙,已是汗流浹背蚊惯。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工愿卸, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留灵临,地道東北人。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓趴荸,卻偏偏與公主長得像儒溉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子发钝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,652評論 2 354

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