canvas基础学习笔记(完)

canvas之旅仍在继续——

html5的API一直在持续进化,相应的,Canvas作为html5的一个重头戏,它的标准也一直在更新。
W3C维护的标准:https://www.w3.org/TR/2dcontext/
WHATWG维护的标准:https://html.spec.whatwg.org/

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

效果图.jpg

注:其他其他html元素不能放在canvas标签中间
下面的例子可以实现控件与canvas交互,点击绿色按钮停止或开始运动,点击白色按钮canvas画布为白色,点击黑色按钮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标签中间 2.canvas本身不是透明的,它默认的背景色是白色的-->
   当前浏览器不支持canvas,请更换浏览器后再试
 </canvas>
 <div id="controller">
   <h1>canvas绘图之旅</h1>
   <a href="#" id="canvas-btn">停止运动</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;//设置小球是否运动
  var themeColor="white";//控制画面背景色

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

 
       //画出100个圆
     
       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;
       }
       //实现动画
       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="开始运动";
        }
        else{
          isMoving=true;
          this.text="停止运动";
        }
        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";//设置遮挡效果

      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时绘制椭圆
       if(context.ellipse){
        context.beginPath();
        context.ellipse(400,400,300,200,0,0,Math.PI*2);
        context.stroke();
       }
       else{
        alert("no ellipse");
       }   
  }
</script>

三、扩展canvas的context

示例代码如下:

<script type="text/javascript">
      var canvas=document.getElementById('canvas');
      var context=canvas.getContext('2d');
      //********************************************设计属于自己的API
      //在context中加入新的方法,方法名为fillStar
      //调用对象的原型,对这个原型进行修改(函数当做对象来处理)
      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的基础学习到此为止,今后还会有更加丰富的canvas知识学习,敬请期待!!!5月,认真渡过~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容

  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,225评论 0 17
  • 一、canvas简介 1.1 什么是canvas?(了解) 是HTML5提供的一种新标签 Canvas是一个矩形区...
    Looog阅读 3,863评论 3 40
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,598评论 25 707
  • 本文主要介绍Html5和Html4的区别。 语法的改变 内容类型HTML5 的文件扩展符与内容类型保持不变。扩展符...
    layjoy阅读 1,784评论 0 23
  • 对啊,是该睡觉了。 每天都默默对自己这样说,却又拿起手机一翻再翻,就这样漫无目的没有收获的熬成了黑眼圈。 ...
    苏何7阅读 189评论 0 3