小程序canvas学习
效果图:
.wxml
<canvas style="width: 100vw; height: 100vh;" canvas-id="firstCanvas"></canvas>
.js
onLoad: function (options) { const ctx = wx.createCanvasContext(\'firstCanvas\') var canvasWidth = wx.getSystemInfoSync().windowWidth var canvasHeight = wx.getSystemInfoSync().windowHeight var numParticles = 50 var bg = [18, 10, 34] var cols = [\'#FF5722\', \'#FF9800\', \'#FF9800\', \'#FF9800\', \'#FF9800\', \'#B71C1C\', \'#00BCD4\', \'#00BCD4\', \'#009688\'] setup() function setup() { ctx.beginPath(); ctx.rect(0, 0, canvasWidth, canvasHeight) ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${1})` ctx.fill() ctx.draw() } // window.requestAnimationFrame(animate); setInterval(animate, 60) function animate() { fade(0.3) draw() // window.requestAnimationFrame(function(){animate()}) } function fade(amt) { ctx.beginPath(); ctx.rect(0, 0, canvasWidth, canvasHeight) ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${amt})` ctx.fill() ctx.draw() } function Particle() { this.pos = { x: Math.random() * canvasWidth * 0.8 + canvasWidth * 0.1, y: Math.random() * canvasHeight * 0.8 + canvasHeight * 0.1 } this.r = 1 this.speed = 6 this.step = Math.random() * 400 this.vx = Math.random() * this.speed / 4 - this.speed / 8 this.vy = Math.random() * this.speed / 4 - this.speed / 8 this.colIndex = Math.floor(Math.random() * cols.length) this.history = [] this.update = function () { this.step++ this.step %= 400 if (this.history.length > 5) { this.history.shift() } this.pos.x += this.vx this.pos.y += this.vy this.vx = this.vx * 0.98 + (Math.random() * this.speed * 2 - this.speed) * 0.12 this.vy = this.vy * 0.98 + (Math.random() * this.speed * 2 - this.speed) * 0.12 if (this.history.length > 4) { ctx.beginPath() ctx.moveTo(this.pos.x, this.pos.y) for (var i = this.history.length - 1; i >= 0; i--) { ctx.lineTo(this.history[i].x, this.history[i].y) } ctx.fillStyle = cols[this.colIndex] ctx.strokeStyle = cols[this.colIndex] ctx.fill() ctx.lineWidth = 2 ctx.lineJoin = "round" // ctx.closePath() ctx.stroke() } if (this.pos.x > canvasWidth || this.pos.x < 0 || this.pos.y > canvasHeight || this.pos.y < 0) { delete this.pos delete this.history return false; } this.history.push({ x: this.pos.x, y: this.pos.y }) return true; } } var particles = [new Particle()] function draw() { if (particles.length < numParticles) { particles.push(new Particle()) } particles = particles.filter(function (p) { return p.update() }) } },
总结:目前小程序canvas还很卡 不建议使用
PC端:
效果图
代码:
js
<script type="text/javascript"> var canvas = document.createElement(\'canvas\') document.getElementsByTagName(\'body\')[0].appendChild(canvas) var ctx = canvas.getContext(\'2d\') var numParticles = 50 var bg = [18, 10, 34] var cols = [\'#FF5722\', \'#FF9800\', \'#FF9800\', \'#FF9800\', \'#FF9800\', \'#B71C1C\', \'#00BCD4\', \'#00BCD4\', \'#009688\'] setup() function setup() { canvas.width = window.innerWidth canvas.height = window.innerHeight ctx.beginPath(); ctx.rect(0, 0, canvas.width, canvas.height) ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${1})` ctx.fill() } // window.requestAnimationFrame(animate); setInterval(animate, 1000/29.9) function animate() { fade(0.3) draw() // window.requestAnimationFrame(function(){animate()}) } function fade(amt) { ctx.beginPath(); ctx.rect(0, 0, canvas.width, canvas.height) ctx.fillStyle = `rgba(${bg[0]}, ${bg[1]}, ${bg[2]}, ${amt})` ctx.fill() } function Particle () { this.pos = { x: Math.random() * canvas.width * 0.8 + canvas.width * 0.1, y: Math.random() * canvas.height * 0.8 + canvas.height * 0.1 } this.r = 1 this.speed = 6 this.step = Math.random() * 400 this.vx = Math.random() * this.speed/4 - this.speed/8 this.vy = Math.random() * this.speed/4 - this.speed/8 this.colIndex = Math.floor(Math.random()*cols.length) this.history = [] this.update = function () { ////////////////////////////////////// this.step ++ this.step %= 400 if (this.history.length > 5){ this.history.shift() } this.pos.x += this.vx this.pos.y += this.vy this.vx = this.vx * 0.98 + (Math.random() * this.speed * 2 - this.speed) * 0.12 this.vy = this.vy * 0.98 + (Math.random() * this.speed * 2 - this.speed) * 0.12 ////////////////////////////////////// if (this.history.length > 4){ ctx.beginPath() ctx.moveTo(this.pos.x ,this.pos.y) for (var i = this.history.length-1; i >= 0; i--){ ctx.lineTo(this.history[i].x ,this.history[i].y) } // ctx.fillStyle = `hsla(${Math.sin( this.step / 300) * 70 + 70},${99}%,${50}%,1)` // ctx.strokeStyle = `hsla(${Math.sin( this.step / 300) * 70 + 70},${99}%,${50}%,0.5)` ctx.fillStyle = cols[this.colIndex] ctx.strokeStyle = cols[this.colIndex] ctx.fill() ctx.lineWidth = 2 ctx.lineJoin = "round" // ctx.closePath() ctx.stroke() } ////////////////////////////////////// if (this.pos.x > canvas.width || this.pos.x < 0 || this.pos.y > canvas.height || this.pos.y < 0) { delete this.pos delete this.history return false; } this.history.push({ x: this.pos.x, y: this.pos.y }) return true; } } var particles = [new Particle()] function draw() { if (particles.length < numParticles) { particles.push(new Particle()) } particles = particles.filter(function (p){ return p.update() }) } </script>