Chrome浏览器插件实现页面鼠标点击烟花成果写在后面成果如上图,鼠标点击之后页面会从底部发射一道烟花,在鼠标点击处绽开开来。
筹备工作1.理解浏览器插件制作方法chrome扩大:manifest.json文件相干字段
2.实现计划在网页上动静插入一个canvas元素,通过canvas来制作并展现烟花成果粒子,联合鼠标的点击事件,来触发烟花射线发射。
3.入手撸代码minifest.json简略地将必须的参数配置残缺
{ "name": "烟花点击特效", "version": "1.0.0", "manifest_version": 2, "description": "烟花点击特效", "browser_action": { "default_title": "查看", "default_icon": "1.jpg" }, "content_scripts": [ { "matches": ["<all_urls>"], "js": ["firework.js"] } ], "permissions" : ["tabs", "activeTab"] //向浏览器申请的权限}firework.jslet body = document.getElementsByTagName('body')[0];let myCanvas = document.createElement('canvas');myCanvas.id = 'canvas';myCanvas.style.position = 'fixed';myCanvas.style.left = '0';myCanvas.style.top = '0';body.before(myCanvas);//before插入能够将canvas插入到body后面body.style.opacity = 0.9;// body.appendChild(myCanvas);//requestAnimFrame 封装,能够兼容所有浏览器window.requestAnimFrame=(function(){ return window.requestAnimationFrame|| window.webkitRequestAnimationFrame|| window.mozRequestAnimationFrame|| function(callback){ window.setTimeout(callback,1000/60) } })(); var canvas=document.getElementById("canvas"), // Canvas.getContext(contextID)返回一个用于在画布上绘图的环境; // 目前非法参数contextID只有"2d",即二维绘图 ctx=canvas.getContext("2d"), // 获取电脑可视区域宽高 cw=window.innerWidth,ch=window.innerHeight, fireworks=[],//寄存烟花数组 particles=[],//寄存绽开粒子数组 hue=180,//设置色彩范畴 limiterTotal=5,//点击绽开速度 limiterTick=0,//点击计时器 timerTotal=40,//主动绽开速度 timerTick=0,//主动计时器 mousedown=false, mx,my; // 设置画布宽高 canvas.width=cw;canvas.height=ch; // 随机函数 function random(min,max){ return Math.random()*(max-min)+min } // 计算两点间隔 function calculateDistance(p1x,p1y,p2x,p2y){ var xDistance=p1x-p2x,yDistance=p1y-p2y;return Math.sqrt(Math.pow(xDistance,2)+Math.pow(yDistance,2)) } // 定义烟花对象 function Firework(sx,sy,tx,ty){ this.x=sx; this.y=sy; this.sx=sx; this.sy=sy; this.tx=tx; this.ty=ty; this.distanceToTarget=calculateDistance(sx,sy,tx,ty); //静止间隔 this.distanceTraveled=0; //生成的静止轨迹 this.coordinates=[]; this.coordinateCount=3; while(this.coordinateCount--){ this.coordinates.push([this.x,this.y]) } this.angle=Math.atan2(ty-sy,tx-sx); this.speed=2; this.acceleration=1.05; this.brightness=random(50,70);//烟花的亮度 this.targetRadius=1//烟花圈的半径 } //更新烟花地位 Firework.prototype.update=function(index){ this.coordinates.pop(); this.coordinates.unshift([this.x,this.y]); if(this.targetRadius<8){ this.targetRadius+=0.3 }else{ this.targetRadius=1 } this.speed*=this.acceleration; var vx=Math.cos(this.angle)*this.speed, vy=Math.sin(this.angle)*this.speed; this.distanceTraveled=calculateDistance(this.sx,this.sy,this.x+vx,this.y+vy); //如果烟花运行间隔大于或等于初始地位到指标地位之间的间隔,生成新烟花并移除以后烟花,否则更新烟花地位 if(this.distanceTraveled>=this.distanceToTarget){ //烟花绽放 createParticles(this.tx,this.ty); //销毁烟花点 fireworks.splice(index,1) }else{ this.x+=vx;this.y+=vy } }; // 烟花射线发射 Firework.prototype.draw=function(){ // 从新开始新门路,把之前的门路都清空掉 ctx.beginPath(); //先保留一个坐标 ctx.moveTo(this.coordinates[this.coordinates.length-1][0],this.coordinates[this.coordinates.length-1][1]); //从moveTo提供的坐标绘制到指定坐标 ctx.lineTo(this.x,this.y); //设置线条款式 ctx.strokeStyle="hsl("+hue+", 100%, "+this.brightness+"%)"; //通过此函数将以上绘制的图形绘制到画布上 ctx.stroke(); ctx.beginPath(); //画出鼠标点击时的圆圈 //arc(圆心的x坐标,圆心的y坐标,圆的半径,起始角(以弧度计,即l圆心的3点钟地位是0度),完结角,规定应该是顺时针还是逆时针画图(可选)) ctx.arc(this.tx,this.ty,this.targetRadius,0,Math.PI*2); //描边绘制 ctx.stroke() }; //烟花绽放办法 function Particle(x,y){ this.x=x;this.y=y;this.coordinates=[]; this.coordinateCount=5; while(this.coordinateCount--){ this.coordinates.push([this.x,this.y]) } // 往各个角度绽开 this.angle=random(0,Math.PI*2); this.speed=random(1,10); this.friction=0.95; this.gravity=1; this.hue=random(hue-20,hue+20); this.brightness=random(50,80); this.alpha=1; this.decay=random(0.015,0.03);//粒子隐没工夫(透明度减少速度) } Particle.prototype.update=function(index){ this.coordinates.pop(); this.coordinates.unshift([this.x,this.y]); //粒子静止 this.speed*=this.friction; this.x+=Math.cos(this.angle)*this.speed; this.y+=Math.sin(this.angle)*this.speed+this.gravity; this.alpha-=this.decay;//透明度减少 if(this.alpha<=this.decay){ particles.splice(index,1)//销毁烟花绽放粒子 } }; // 烟花绽放 Particle.prototype.draw=function(){ ctx.beginPath(); ctx.moveTo(this.coordinates[this.coordinates.length-1][0],this.coordinates[this.coordinates.length-1][1]); ctx.lineTo(this.x,this.y); //烟花的色彩 ctx.strokeStyle="hsla("+this.hue+", 100%, "+this.brightness+"%, "+this.alpha+")"; ctx.stroke() }; // 创立粒子 function createParticles(x,y){ //烟花绽放粒子数量 var particleCount=200; while(particleCount--){ particles.push(new Particle(x,y)) } } function loop(){ // 让浏览器循环调用指定的函数来更新动画。 requestAnimFrame(loop); hue+=0.5; ctx.globalCompositeOperation="destination-out"; ctx.fillStyle="rgba(0, 0, 0, 0.5)"; ctx.fillRect(0,0,cw,ch); ctx.globalCompositeOperation="lighter"; var i=fireworks.length; while(i--){ fireworks[i].draw(); fireworks[i].update(i) } var i=particles.length; while(i--){ particles[i].draw(); particles[i].update(i) } // 随机主动抉择地位 if(timerTick>=timerTotal){ //鼠标没有点击的状况 if(!mousedown){ // fireworks.push(new Firework(cw/2,ch,random(0,cw),random(0,ch/2))); timerTick=0 } }else{ timerTick++ } // 鼠标点击地位 if(limiterTick>=limiterTotal){ if(mousedown){ fireworks.push(new Firework(cw/2,ch,mx,my)); limiterTick=0 } }else{ limiterTick++ } } body.addEventListener("mousemove",function(e){ mx=e.pageX-body.offsetLeft - window.scrollX;//鼠标点击坐标 - body偏移量 - 窗口滚动间隔 my=e.pageY-body.offsetTop - window.scrollY;//鼠标点击坐标 - body偏移量 - 窗口滚动间隔 }); body.addEventListener("mousedown",function(e){ // e.preventDefault(); mousedown=true }); body.addEventListener("mouseup",function(e){ // e.preventDefault(); mousedown=false }); window.onload=loop;更多插件浏览器网页背景换肤插件浏览器桌面挂件动画插件B站视频评论屏蔽插件
...