canvas探照灯效果的示例代码


Posted in HTML / CSS onNovember 30, 2018

canvas中的clip()方法用于从原始画布中剪切任意形状和尺寸。一旦剪切了某个区域,则所有之后的绘图都会被限制在被剪切的区域内(不能访问画布上的其他区域)

也可以在使用clip()方法前通过使用save()方法对当前画布区域进行保存,并在以后的任意时间通过restore()方法对其进行恢复

canvas探照灯效果的示例代码

接下来使用clip()方法实现一个探照灯效果

</iframe>
<button id="btn">变换</button>
<button id="con">暂停</button>
<canvas id="canvas" width="400" height="290" style="border:1px solid black">当前浏览器不支持canvas,请更换浏览器后再试</canvas>
<script> btn.onclick = function(){history.go();}
con.onclick = function(){ if(this.innerHTML == '暂停'){ this.innerHTML = '恢复';
        clearInterval(oTimer);
    }else{ this.innerHTML = '暂停'; 
        oTimer = setInterval(fnInterval,50);
    }
} var canvas = document.getElementById('canvas'); //存储画布宽高
var H=290,W=400; //存储探照灯
var ball = {}; //存储照片
var IMG; //存储照片地址
var URL = 'http://sandbox.runjs.cn/uploads/rs/26/ddzmgynp/chunfen.jpg'; function initial(){ if(canvas.getContext){ var cxt = canvas.getContext('2d'); var tempR = Math.floor(Math.random()*30+20); var tempX = Math.floor(Math.random()*(W-tempR) + tempR); var tempY = Math.floor(Math.random()*(H-tempR) + tempR)        
        ball = {
            x:tempX,
            y:tempY,
            r:tempR,
            stepX:Math.floor(Math.random() * 21 -10),
            stepY:Math.floor(Math.random() * 21 -10)
        };
        IMG = document.createElement('img');
        IMG.src=URL;
        IMG.onload = function(){
            cxt.drawImage(IMG,0,0);
    }//欢迎加入全栈开发交流圈一起学习交流:582735936
  
]//面向1-3年前端人员

}   //帮助突破技术瓶颈,提升思维能力
        }   
    }    
} function update(){
    ball.x += ball.stepX;
    ball.y += ball.stepY; 
    bumpTest(ball);
} function bumpTest(ele){ //左侧
    if(ele.x <= ele.r){
        ele.x = ele.r;
        ele.stepX = -ele.stepX;
    } //右侧
    if(ele.x >= W - ele.r){
        ele.x = W - ele.r;
        ele.stepX = -ele.stepX;
    } //上侧
    if(ele.y <= ele.r){
        ele.y = ele.r;
        ele.stepY = -ele.stepY;
    } //下侧
    if(ele.y >= H - ele.r){
        ele.y = H - ele.r;
        ele.stepY = -ele.stepY;
    }
} function render(){ //重置画布高度,达到清空画布的效果
 canvas.height = H; if(canvas.getContext){ var cxt = canvas.getContext('2d');
        cxt.save(); //将画布背景涂黑
 cxt.beginPath();
        cxt.fillStyle = '#000';
        cxt.fillRect(0,0,W,H); //渲染探照灯
 cxt.beginPath();
        cxt.arc(ball.x,ball.y,ball.r,0,2*Math.PI);
        cxt.fillStyle = '#000';
        cxt.fill(); 
        cxt.clip(); //由于使用了clip(),画布背景图片会出现在clip()区域内
 cxt.drawImage(IMG,0,0);
        cxt.restore();
    
}//欢迎加入全栈开发交流圈一起学习交流:582735936
  
]//面向1-3年前端人员

}   //帮助突破技术瓶颈,提升思维能力
    }

}
initial();
clearInterval(oTimer); function fnInterval(){ //更新运动状态
 update(); //渲染
 render();    
} var oTimer = setInterval(fnInterval,50); 
</script>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

HTML / CSS 相关文章推荐
使用Filters滤镜弥补CSS3的跨浏览器问题以及兼容低版本IE
Jan 23 HTML / CSS
使用CSS3实现多列布局与多背景的技巧
Feb 29 HTML / CSS
详解CSS3阴影 box-shadow的使用和技巧总结
Dec 03 HTML / CSS
CSS3 Calc实现滚动条出现页面不跳动问题
Sep 14 HTML / CSS
HTML5 中新的全局属性(整理)
Jul 31 HTML / CSS
html5 viewport使用方法示例详解
Dec 02 HTML / CSS
HTML5 video播放器全屏(fullScreen)方法实例
Apr 24 HTML / CSS
10个最常见的HTML5面试题 附答案
Jun 06 HTML / CSS
详解Html5页面实现下载文件(apk、txt等)的三种方式
Oct 22 HTML / CSS
详解h5页面在不同ios设备上的问题总结
Mar 01 HTML / CSS
Canvas环形饼图与手势控制的实现代码
Nov 08 HTML / CSS
HTML CSS 一个标签实现带动画的抖音LOGO
Apr 26 HTML / CSS
localStorage的过期时间设置的方法详解
Nov 26 #HTML / CSS
canvas拼图功能实现代码示例
Nov 21 #HTML / CSS
详解Canvas 跨域脱坑实践
Nov 07 #HTML / CSS
浅谈移动端网页图片预加载方案
Nov 05 #HTML / CSS
Canvas中设置width与height的问题浅析
Nov 01 #HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
Nov 01 #HTML / CSS
HTML5之消息通知的使用(Web Notification)
Oct 30 #HTML / CSS
You might like
PHP register_shutdown_function()函数的使用示例
2015/06/23 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
clientX,pageX,offsetX,x,layerX,screenX,offsetLeft区别分析
2010/03/12 Javascript
JQuery实现简单验证码提示解决方案
2012/12/20 Javascript
关于js中for in的缺陷浅析
2013/12/02 Javascript
javascript中的循环语句for语句深入理解
2014/04/04 Javascript
javascript数字时钟示例分享
2014/04/23 Javascript
jQuery 1.9使用$.support替代$.browser的使用方法
2014/05/27 Javascript
第六篇Bootstrap表格样式介绍
2016/06/21 Javascript
学习Angular中作用域需要注意的坑
2016/08/17 Javascript
ECMAScript6轮播图实践知识总结
2016/08/17 Javascript
Vuex之理解Store的用法
2017/04/19 Javascript
前端页面文件拖拽上传模块js代码示例
2017/05/19 Javascript
详解node.js 事件循环
2020/07/22 Javascript
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Django框架验证码用法实例分析
2019/05/10 Python
python+numpy按行求一个二维数组的最大值方法
2019/07/09 Python
python 修改本地网络配置的方法
2019/08/14 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
PyCharm永久激活方式(推荐)
2020/09/22 Python
解决安装新版PyQt5、PyQT5-tool后打不开并Designer.exe提示no Qt platform plugin的问题
2020/04/24 Python
Html5 canvas画图白板踩坑
2020/06/01 HTML / CSS
世界最大域名注册商:GoDaddy
2016/07/24 全球购物
介绍一下SQL中union,intersect和minus
2012/04/05 面试题
类的返射机制中的包及核心类
2016/09/12 面试题
总经理人事任命书
2014/06/05 职场文书
纪念一二九运动演讲稿
2014/09/16 职场文书
党的群众路线教育实践活动个人对照检查材料(医生)
2014/11/05 职场文书
2014幼儿园家长工作总结
2014/11/10 职场文书
小学班主任工作总结2015
2015/04/07 职场文书
微信搭讪开场白
2015/05/28 职场文书
教学副校长工作总结
2015/08/13 职场文书
vue中三级导航的菜单权限控制
2021/03/31 Vue.js
JavaScript 去重和重复次数统计
2021/03/31 Javascript
为什么不建议在go项目中使用init()
2021/04/12 Golang
mybatis-plus模糊查询指定字段
2022/04/28 Java/Android