<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
本文範例為大家分享了JavaScript實現瀑布動畫的具體程式碼,供大家參考,具體內容如下
<!DOCTYPE html> <html> <head> <meta charset="utf8"> <meta http-equiv=「X-UA-Compatible」 content="IE-edge, chrome=1"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>瀑布(waterful)</title> <style> body { background: #222; } </style> </head> <body> <script> //判斷瀏覽器是否支援canvas function isSupportCanvas() { var canvas = document.createElement('canvas'); return !!(canvas.getContext && canvas.getContext("2d")); } //requestAnimationFrame會自動使用最優的影格率進行渲染,在我的瀏覽器上是每秒60幀 function setupRAF() { var lastTime = 0; var vendors = ['webkit', 'ms', 'moz', 'o']; for(var i=0; i<vendors.length && !window.requestAnimationFrame; i++) { window.requestAnimationFrame = window[vendors[i] + "RequestAnimationFrame"]; window.cancelAnimationFrame = window[vendors[i] + "CancelAnimationFrame"] || window[vendors[i] + "CancelRequestAnimationFrame"] } if(!window.requestAnimationFrame) { window.requestAnimationFrame = function(callback, element) { var currentTime = new Date().getTime(); var timeToCall = Math.max(0, 16 - (currentTime - lastTime)); var futureTime = currentTime + timeToCall; var id = window.setTimeout(function() { callback(futureTime); }, timeToCall); lastTime = futureTime; return id; } } if(!window.cancelAnimationFrame) { window.cancelAnimationFrame = function(id) { clearTimeout(id); } } } //在給定的範圍內隨機選取一個整數 function randomInt(min, max) { /* 由於位運算的運算元要求是整數,其結果也是整數,所以經過位運算的都會自動變成整數 可用的取整方法: (1)~~n (2)n<<0 (3)n>>0 (4)n|0 (5)Math.floor() (6)Math.ceil() (7)Math.round() 值得注意的是,位運算只是去掉小數部分,並不會改變整數部分 */ return ~~(Math.random() * (max - min) + min); } //在物件所表示的範圍中隨機選取一個數 function randomAtRange(obj) { return Math.random() * (obj.max - obj.min) + obj.min; } //在物件所表示的範圍中隨機選取一個整數 function randomIntAtRange(obj) { return randomInt(obj.min, obj.max); } //瀑布 var Waterful = function(width, height) { var doublePI = Math.PI * 2; var canvas; var ctx; //存放水粒子的陣列 var particles = []; //每幀生成或銷燬粒子的數量 var particleChangeRate = width / 25; //垂直方向上的加速度(即重力), 小數點前的0可以省略 var gravity = .15; //水流粒子 var WaterParticle = function() { //水流粒子寬度範圍 var waterWidthRange = {min: 1, max: 20}; //水流粒子高度範圍 var waterHeightRange = {min: 1, max: 45}; //水流粒子落到地上濺起的水花半徑範圍 var waterBubbleRadiusRange = {min: 1, max: 8}; //水花濺起的高度範圍 var waterBubbleSpringRange = {min: 20, max: 30}; //色相範圍 var hueRange = {min: 200, max: 220}; //飽和度範圍 var saturationRange = {min: 30, max: 60}; //亮度 var lightnessRange = {min: 30, max: 60}; //拼接成一個HSLA顏色值(注意:普通函數的this指代它自己) this.joinHSLA = function(alpha) { return "hsla(" + [this.hue, this.saturation + "%", this.lightness + "%", alpha].join(",") + ")"; } this.init = function() { //水流粒子的最大半徑 var waterMaxRadius = waterWidthRange.max / 2; //水流粒子初始X座標的範圍 var xRange = {min: waterMaxRadius, max: canvas.width - waterMaxRadius}; //水流粒子寬度 this.width = randomAtRange(waterWidthRange); //水流粒子高度 this.height = randomAtRange(waterHeightRange); //水流粒子初始X座標 this.x = randomAtRange(xRange); //水流粒子初始Y座標 this.y = -this.height; //水流粒子垂直方向上的初始速度 this.velocity = 0; //水流半徑等於水流粒子寬度的一半 this.waterRadius = this.width / 2; //水花半徑 this.waterBubbleRadius = randomAtRange(waterBubbleRadiusRange); //水花濺起的高度 this.waterBubbleSpring = randomAtRange(waterBubbleSpringRange); //水流顏色 this.hue = randomIntAtRange(hueRange); this.saturation = randomIntAtRange(saturationRange); this.lightness = randomIntAtRange(lightnessRange); //地板高度 this.floorHeight = canvas.height - waterBubbleSpringRange.min - this.height; //水流粒子是否已經落地變成水花 this.isDead = false; } this.update = function() { this.velocity += gravity; this.y += this.velocity; if(this.y > this.floorHeight) { this.isDead = true; } } this.render = function() { if(this.isDead) { //繪製水花 ctx.fillStyle = "hsla(" + this.hue + ", 40%, 40%, 1)"; ctx.fillStyle = this.joinHSLA(.3); ctx.beginPath(); ctx.arc(this.x, canvas.height - this.waterBubbleSpring, this.waterBubbleRadius, 0, doublePI); ctx.fill(); } else { //繪製水流 ctx.strokeStyle = this.joinHSLA(.05); ctx.lineCap = "round"; ctx.lineWidth = this.waterRadius; ctx.beginPath(); ctx.moveTo(this.x, this.y); ctx.lineTo(this.x, this.y + this.height); ctx.stroke(); } } this.init(); } this.init = function() { canvas = document.createElement("canvas"); //如果html不支援canvas的話會顯示該文字,否則不顯示 var textNode = document.createTextNode("Your browser can not support canvas"); canvas.appendChild(textNode); document.body.appendChild(canvas); canvas.width = width; canvas.height = height; //如果不支援canvas就沒必要繼續下去了 if(!isSupportCanvas()) { return; } ctx = canvas.getContext("2d"); setupRAF(); loop(); } function loop() { /* 先繪製一層朦朧的白非常重要,這樣可以省去很多用來填充顏色的粒子 將下面3句換成clearRect就能發現其實繪製的粒子顏色本身是很淡的,如果直接換成深的顏色就會發現空隙銜接處很不均勻 增大粒子數目可以發現顏色會變深,但是粒子數越多畫面越卡,所以先繪製上一層白色的蒙版是一種非常取巧的做法 */ ctx.globalCompositeOperation = 'destination-out'; ctx.fillStyle = 'rgba(255,255,255,.06)'; ctx.fillRect(0, 0, canvas.width, canvas.height); //ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.globalCompositeOperation = "lighter"; //新增新粒子 for(var i=0; i<particleChangeRate; i++) { particles.push(new WaterParticle()); } //更新渲染粒子 for(var i=0; i<particles.length; i++) { particles[i].update(); particles[i].render(); } //繪製水花,並刪除消亡的粒子 for(var i=particles.length-1; i>=0; i--) { if(particles[i].isDead) { particles.splice(i, 1); } } requestAnimationFrame(loop); } } function init() { var waterful = new Waterful(300, 300); waterful.init(); } init(); </script> </body> </html>
效果:
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援it145.com。
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45