js canvas实现红包照片效果


Posted in Javascript onAugust 21, 2018

今天跟着学习了一个制作红包照片类似功能的demo,很有意思,所以在这里分享代码给大家,可以直接使用。

先贴出效果图大家看一下:

js canvas实现红包照片效果

点击重置后会以随机一个点为圆心生成半径为50px的圆,然后显示清晰的图像;

点击显示后会全部显示清晰的图像;

功能虽然很少,但是很有意思不是吗,而且做好了适配可以在不同分辨率大小的设备上都可以玩。

只需要js+css+html就可以实现,不过需要引入jquery

下面po出完整代码:

demo.html:

<!DOCTYPE HTML>
<html>
<head lang="en">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Canvas玩儿转红包照片</title>
<script src="http://cdn.bootcss.com/jquery/2.2.0/jquery.min.js" type="text/javascript"></script>
<link href="img.css" rel="external nofollow" rel="stylesheet" type="text/css" />
<meta name="viewport"
 content=" height = device-height,
   width = device-width,
   initial-scale = 1.0,
   minimum-scale = 1.0,
   maximum-scale = 1.0,
   user-scalable = no"/>
 
</head>
 
<body>
 
<div id="blur-div">
 <img src="images/1.jpg" id="blur-image">
 <canvas id="canvas">
 </canvas>
 <a href="javascript:reset()" rel="external nofollow" class="button" id="reset-button"> 重置 </a>
 <a href="javascript:show()" rel="external nofollow" class="button" id="show-button"> 显示 </a>
</div>
 
 
 
<script type="text/javascript" src="img.js"></script>
</body>
</html>

img.css:

*{
 margin: 0 0;
 padding: 0 0;
}
 
#blur-div{
/* width: 800px;
 height: 500px;*/
 margin: 0 auto;
 position: relative;
 /*超过部分隐藏*/
 overflow: hidden;
}
 
#blur-image {
 display: block;
 /*width: 800px;
 height: 500px;*/
 margin: 0 auto;
 
 /*滤镜 模糊 括号内值越大,就越模糊*/
 filter: blur(20px);
 -webkit-filter:blur(20px);
 -moz-filter:blur(20px);
 -ms-filter:blur(20px);
 -o-filter:blur(20px);
 
 position: absolute;
 left: 0px;
 top: 0px;
 
 /*表示在z轴上的值*/
 z-index: 0;
}
 
#canvas{
 display: block;
 margin: 0 auto;
 
 position: absolute;
 left: 0px;
 top: 0px;
 
 z-index: 100;
 
} 
 
.button{
 display: block;
 position: absolute;
 z-index: 200;
 
 width: 100px;
 height: 30px;
 
 color: white;
 text-decoration: none;
 text-align: center;
 line-height: 30px;
 
 border-radius: 5px;
 
}
 
#reset-button{
 left: 50px;
 bottom: 20px;
 background-color: #058;
}
 
#reset-button:hover{
 background-color: #047;
}
 
#show-button{
 right: 50px;
 bottom: 20px;
 background-color: #085;
}
 
#show-button:hover{
 background-color: #074;
}

img.js:

var canvasWidth = window.innerWidth
var canvasHeight = window.innerHeight
 
var canvas = document.getElementById("canvas")
var context = canvas.getContext("2d")
 
canvas.width=canvasWidth
canvas.height=canvasHeight
var radius = 50
 
var image = new Image()
var clippingRegion = {x:-1,y:-1,r:radius}
 
var leftMargin = 0, topMargin=0
 
var a;
 
image.src = "images/1.jpg"
image.onload = function(e){
 
 $("#blur-div").css("width", canvasWidth + "px")
 $("#blur-div").css("height", canvasHeight + "px")
 
 $("#blur-image").css("width", image.width + "px")
 $("#blur-image").css("height", image.height + "px")
 
 leftMargin = (image.width - canvas.width) / 2
 topMargin = (image.height - canvas.height) / 2
 
 $("#blur-image").css("top", "-" + topMargin + "px")
 $("#blur-image").css("left", "-" + leftMargin + "px")
 
 initCanvas()
}
 
function initCanvas(){
 
 clearInterval(a)
 clippingRegion = {x:Math.random()*(canvas.width-2*radius)+radius,y:Math.random()*(canvas.height-2*radius)+radius,r:radius}
 console.log(canvas.width);
 console.log(canvas.height);
 clippingRegion.r = 0;
 var id = setInterval(
 function(){
  clippingRegion.r += 2;
  if(clippingRegion.r > 50){
  clearInterval(id)
  }
  draw(image,clippingRegion)
 },
 30
 )
 
}
 
function setClippingRegion(clippingRegion){
 /*创建剪辑区域的路径*/
 context.beginPath()
 /*第六个参数表示是顺时针还是逆时针绘制*/
 context.arc(clippingRegion.x, clippingRegion.y, clippingRegion.r, 0, Math.PI*2, false)
 /*希望路径是个剪辑区域调用此方法*/
 context.clip()
}
 
function draw(image ,clippingRegion){
 
 /*每次绘制之前,对canvas的内容进行清空*/
 context.clearRect(0,0,canvas.width,canvas.height)
 /*存储canvas的当前状态*/
 context.save()
 /*剪辑出一个圆形的区域*/
 setClippingRegion(clippingRegion)
 /*开始画*/
 //context.drawImage(image, 0 , 0)
 /*leftMargin, topMargin, canvas.width, canvas.height表示image剪出这么大
 0, 0, canvas.width, canvas.height 表示canvas的大小
 */
 context.drawImage(image, 
 leftMargin, topMargin, canvas.width, canvas.height,
 0, 0, canvas.width, canvas.height)
 /*canvas的状态恢复*/
 context.restore()
}
 
function reset(){
 initCanvas();
}
 
function show(){
 
 /*此函数是内置函数,表示每隔多少秒就执行前面的函数 所以第一个参数是函数,后面是间隔时间*/
 var id = setInterval(
 function(){
  a = id;
  clippingRegion.r += 20
  
  if(clippingRegion.r > 2*Math.max(canvas.width,canvas.height)){
  /*用来关闭函数执行的*/
  clearInterval(id);
  }
  draw(image ,clippingRegion)
  
 },
 30
 
 )
}
 
/*阻止滑动操作*/
/*canvas.addEventListener("touchstart",function(e){
 e.preventDefault()
});*/

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

Javascript 相关文章推荐
jquery.validate使用攻略 第五步 正则验证
Jul 01 Javascript
初学js插入节点appendChild insertBefore使用方法
Jul 04 Javascript
javascipt匹配单行和多行注释的正则表达式
Nov 20 Javascript
jquery 页面滚动到底部自动加载插件集合
Jan 31 Javascript
js数字转换为float,取N位小数
Feb 08 Javascript
深入分析JSON编码格式提交表单数据
Jun 25 Javascript
常用jQuery代码分享
Jul 14 Javascript
JavaScript拖拽、碰撞、重力及弹性运动实例分析
Jan 08 Javascript
JQuery实现简单的服务器轮询效果实例
Mar 31 Javascript
AngularJS中下拉框的基本用法示例
Oct 11 Javascript
jQuery实现所有验证通过方可提交的表单验证
Nov 21 jQuery
Vuejs中使用markdown服务器端渲染的示例
Nov 22 Javascript
js实现简单选项卡功能
Mar 23 #Javascript
js实现轮播图的完整代码
Oct 26 #Javascript
JQuery扩展对象方法操作示例
Aug 21 #jQuery
详解Vue结合后台的列表增删改案例
Aug 21 #Javascript
JavaScript事件发布/订阅模式原理与用法分析
Aug 21 #Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 #Javascript
小程序开发基础之view视图容器
Aug 21 #Javascript
You might like
如何设置mysql允许外网访问
2013/06/04 PHP
探讨各种PHP字符串函数的总结分析
2013/06/05 PHP
php三维数组去重(示例代码)
2013/11/26 PHP
smarty中js的调用方法示例
2014/10/27 PHP
PHP的PDO操作简单示例
2016/03/30 PHP
php快速导入大量数据的实例方法
2019/09/23 PHP
基于jQuery的获取标签名的代码
2012/07/16 Javascript
js前台分页显示后端JAVA数据响应
2013/03/18 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
javascript实现带节日和农历的日历特效
2015/02/01 Javascript
教你使用javascript简单写一个页面模板引擎
2015/05/05 Javascript
JavaScript校验Number(4,1)格式的数字实例代码
2017/03/13 Javascript
JS实现css hover操作的方法示例
2017/04/07 Javascript
js上传图片预览的实现方法
2017/05/09 Javascript
BootStrap 导航条实例代码
2017/05/18 Javascript
前端MVVM框架解析之双向绑定
2018/01/24 Javascript
浅谈JavaScript闭包
2019/04/09 Javascript
JavaScript中Dom操作实例详解
2019/07/08 Javascript
微信小程序如何实现五星评价功能
2019/10/15 Javascript
在VUE style中使用data中的变量的方法
2020/06/19 Javascript
Element Card 卡片的具体使用
2020/07/26 Javascript
js面试题之异步问题的深入理解
2020/09/20 Javascript
在Python的Tornado框架中实现简单的在线代理的教程
2015/05/02 Python
python实现井字棋游戏
2020/03/30 Python
利用Python脚本实现ping百度和google的方法
2017/01/24 Python
Python 如何优雅的将数字转化为时间格式的方法
2019/09/26 Python
使用Python的Turtle绘制哆啦A梦实例
2019/11/21 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
css3的focus-within选择器的使用
2020/05/11 HTML / CSS
怎样在程序里获得一个空指针
2015/01/24 面试题
大学专科求职信
2014/07/02 职场文书
运动会演讲稿300字
2014/08/25 职场文书
小学生迎国庆演讲稿
2014/09/05 职场文书
高中家长意见怎么写
2015/06/03 职场文书
校运会通讯稿
2015/07/18 职场文书
《吸血鬼:避世 血猎》官宣4.27发售 系列首款大逃杀
2022/04/03 其他游戏