canvas基礎(chǔ)學(xué)習(xí)筆記(完)

canvas之旅仍在繼續(xù)——

html5的API一直在持續(xù)進(jìn)化,相應(yīng)的杀糯,Canvas作為html5的一個(gè)重頭戲扫俺,它的標(biāo)準(zhǔn)也一直在更新。
W3C維護(hù)的標(biāo)準(zhǔn):https://www.w3.org/TR/2dcontext/
WHATWG維護(hù)的標(biāo)準(zhǔn):https://html.spec.whatwg.org/

一固翰、在canvas中使用其他html元素

效果圖.jpg

注:其他其他html元素不能放在canvas標(biāo)簽中間
下面的例子可以實(shí)現(xiàn)控件與canvas交互狼纬,點(diǎn)擊綠色按鈕停止或開始運(yùn)動(dòng),點(diǎn)擊白色按鈕canvas畫布為白色骂际,點(diǎn)擊黑色按鈕canvas畫布為黑色畸颅,示例代碼如下:

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="utf-8">
  <title>canvas</title>

  <style type="text/css">
    #canvas-wrapper{
      width:1200px;
      height:800px;
      position:relative;
      margin: 50px auto;
    }
    #canvas{
      border: 1px solid #aaa;
    }
    #controller{
      position:absolute;
      top:30px;
      left:30px;
      background-color: rgba(0,85,116,0.7);
      padding:5px 20px 25px 20px;
      border-radius:10px 10px;
    }
    #controller h1{
      color:white;
      font-weight: bold;
      font-family: Microsoft Yahei;
    }
    #controller #canvas-btn{
      display: inline-block;
      background-color: #8b0;
      color:white;
      font-size: 14px;
      padding: 5px 15px;
      border-radius:6px 6px;
      text-decoration: none;
      margin-top: 10px;
      margin-right: 20px;
    }
    #controller #canvas-btn:hover{
      text-decoration: none;
      background-color: #7a0;
    }
    #controller .color-btn{
      display: inline-block;
      padding: 5px 15px;
      border-radius:6px 6px;
      font-size: 14px;
      text-decoration: none;
      margin-top: 10px;
      margin-right: 5px;
    }
    #controller .color-btn:hover{
      text-decoration: none;
    }
    #controller #white-color-btn{
      background-color: white;
    }
    #controller #black-color-btn{
      background-color: black;
    }
  </style>
</head>

<body >
<div id="canvas-wrapper">
 <canvas id="canvas"><!--1.其他html的控件不能放置在canvas標(biāo)簽中間 2.canvas本身不是透明的,它默認(rèn)的背景色是白色的-->
   當(dāng)前瀏覽器不支持canvas方援,請(qǐng)更換瀏覽器后再試
 </canvas>
 <div id="controller">
   <h1>canvas繪圖之旅</h1>
   <a href="#" id="canvas-btn">停止運(yùn)動(dòng)</a>
   <a href="#" class="color-btn" id="white-color-btn"></a>
   <a href="#" class="color-btn" id="black-color-btn"></a>
 </div>
</div>


<script type="text/javascript">
  var balls=[];

  var isMoving=true;//設(shè)置小球是否運(yùn)動(dòng)
  var themeColor="white";//控制畫面背景色

    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=1200;
       canvas.height=800;
    
       var context=canvas.getContext('2d');

 
       //畫出100個(gè)圓
     
       for(var i=0;i<100;i++){
        var R=Math.floor(Math.random()*255);
        var G=Math.floor(Math.random()*255);
        var B=Math.floor(Math.random()*255);
        var radius=Math.random()*50+20;
        aBall={
          color:"rgb("+R+","+G+","+B+")",
          radius:radius,
          x:Math.random()*(canvas.width-2*radius)+radius,
          y:Math.random()*(canvas.height-2*radius)+radius,
          vx:(Math.random()*5+5)*Math.pow(-1,Math.floor(Math.random()*100)),
          vy:(Math.random()*5+5)*Math.pow(-1,Math.floor(Math.random()*100))
        }
        balls[i]=aBall;
       }
       //實(shí)現(xiàn)動(dòng)畫
       setInterval(function(){
         draw(context);
         if(isMoving){
           update(canvas.width,canvas.height);
         }
       },50);
       //事件加載
       document.getElementById("canvas-btn").onclick=function(event){
        if(isMoving){
          isMoving=false;
          this.text="開始運(yùn)動(dòng)";
        }
        else{
          isMoving=true;
          this.text="停止運(yùn)動(dòng)";
        }
        return false;
       }

       document.getElementById("white-color-btn").onclick=function(event){
         themeColor="white";
         return false;
       }
       document.getElementById("black-color-btn").onclick=function(event){
         themeColor="black";
         return false;
       }
  }

  function draw(cxt){
    var canvas=cxt.canvas;
    cxt.clearRect(0,0,canvas.width,canvas.height);

    if(themeColor=="black")
    {
      cxt.fillStyle="black";
      cxt.fillRect(0,0,canvas.width,canvas.height);
    }

    for(var i=0;i<balls.length;i++){
      //cxt.globalCompositeOperation="lighter";//設(shè)置遮擋效果

      cxt.fillStyle=balls[i].color;
      cxt.beginPath();
      cxt.arc(balls[i].x,balls[i].y,balls[i].radius,0,Math.PI*2);
      cxt.closePath();
      cxt.fill();
    }
  }

  function update(canvasWidth,canvasHeight){
    for(var i=0;i<balls.length;i++){
      balls[i].x+=balls[i].vx;
      balls[i].y+=balls[i].vy;

      if(balls[i].x-balls[i].radius<=0){
        balls[i].vx=-balls[i].vx;
        balls[i].x=balls[i].radius;
      }
       if(balls[i].x+balls[i].radius>=canvasWidth){
        balls[i].vx=-balls[i].vx;
        balls[i].x=canvasWidth-balls[i].radius;
      }
       if(balls[i].y-balls[i].radius<=0){
        balls[i].vy=-balls[i].vy;
        balls[i].y=balls[i].radius;
      }
       if(balls[i].y+balls[i].radius>=canvasHeight){
        balls[i].vy=-balls[i].vy;
        balls[i].y=canvasHeight-balls[i].radius;
      }
    }
  }
</script>
</body>
</html>

二没炒、繪制橢圓

context.ellipse(x,y,radiusx,radiusy,rotation,startingAngle,endingAngle);
如何解決瀏覽器是否支持ellipse?代碼示例如下:

<script type="text/javascript">
 
    window.onload=function(){
       var canvas=document.getElementById('canvas');
      
       canvas.width=800;
       canvas.height=800;
    
       var context=canvas.getContext('2d');
       //瀏覽器支持ellipse時(shí)繪制橢圓
       if(context.ellipse){
        context.beginPath();
        context.ellipse(400,400,300,200,0,0,Math.PI*2);
        context.stroke();
       }
       else{
        alert("no ellipse");
       }   
  }
</script>

三犯戏、擴(kuò)展canvas的context

示例代碼如下:

<script type="text/javascript">
      var canvas=document.getElementById('canvas');
      var context=canvas.getContext('2d');
      //********************************************設(shè)計(jì)屬于自己的API
      //在context中加入新的方法送火,方法名為fillStar
      //調(diào)用對(duì)象的原型,對(duì)這個(gè)原型進(jìn)行修改(函數(shù)當(dāng)做對(duì)象來處理)
      CanvasRenderingContext2D.prototype.fillStar=function(r,R,x,y,rot){
       this.beginPath();
       for(var i=0;i<5;i++){
            this.lineTo(Math.cos((18+i*72-rot)/180*Math.PI)*R+x,-Math.sin((18+i*72-rot)/180*Math.PI)*R+y);
            this.lineTo(Math.cos((54+i*72-rot)/180*Math.PI)*r+x,-Math.sin((54+i*72-rot)/180*Math.PI)*r+y);
       }
       this.closePath();
       this.fill();
      }

       window.onload=function(){
       
       canvas.width=800;
       canvas.height=800;
    
       context.fillStyle="#058";
       context.fillStar(150,300,400,400,0);
      }
</script>

canvas的基礎(chǔ)學(xué)習(xí)到此為止先匪,今后還會(huì)有更加豐富的canvas知識(shí)學(xué)習(xí)种吸,敬請(qǐng)期待!Q椒恰坚俗!5月,認(rèn)真渡過~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末岸裙,一起剝皮案震驚了整個(gè)濱河市猖败,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌降允,老刑警劉巖恩闻,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異剧董,居然都是意外死亡幢尚,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門翅楼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來尉剩,“玉大人,你說我怎么就攤上這事毅臊±砭ィ” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)功蜓。 經(jīng)常有香客問我园爷,道長(zhǎng),這世上最難降的妖魔是什么式撼? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任童社,我火速辦了婚禮,結(jié)果婚禮上著隆,老公的妹妹穿的比我還像新娘扰楼。我一直安慰自己,他們只是感情好美浦,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布弦赖。 她就那樣靜靜地躺著,像睡著了一般浦辨。 火紅的嫁衣襯著肌膚如雪蹬竖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天流酬,我揣著相機(jī)與錄音币厕,去河邊找鬼。 笑死芽腾,一個(gè)胖子當(dāng)著我的面吹牛旦装,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播摊滔,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼阴绢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了艰躺?” 一聲冷哼從身側(cè)響起呻袭,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎描滔,沒想到半個(gè)月后棒妨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡含长,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伏穆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拘泞。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖枕扫,靈堂內(nèi)的尸體忽然破棺而出陪腌,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布诗鸭,位于F島的核電站染簇,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏强岸。R本人自食惡果不足惜锻弓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝌箍。 院中可真熱鬧青灼,春花似錦、人聲如沸妓盲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悯衬。三九已至弹沽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間筋粗,已是汗流浹背贷币。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亏狰,地道東北人役纹。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暇唾,于是被迫代替她去往敵國(guó)和親促脉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • ¥開啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開一個(gè)線程策州,因...
    小菜c閱讀 6,426評(píng)論 0 17
  • 一瘸味、canvas簡(jiǎn)介 1.1 什么是canvas?(了解) 是HTML5提供的一種新標(biāo)簽 Canvas是一個(gè)矩形區(qū)...
    Looog閱讀 3,942評(píng)論 3 40
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,178評(píng)論 25 707
  • 本文主要介紹Html5和Html4的區(qū)別够挂。 語法的改變 內(nèi)容類型HTML5 的文件擴(kuò)展符與內(nèi)容類型保持不變旁仿。擴(kuò)展符...
    layjoy閱讀 1,844評(píng)論 0 23
  • 對(duì)啊,是該睡覺了孽糖。 每天都默默對(duì)自己這樣說枯冈,卻又拿起手機(jī)一翻再翻,就這樣漫無目的沒有收獲的熬成了黑眼圈办悟。 ...
    蘇何7閱讀 197評(píng)論 0 3