2025年3月17日 星期一 甲辰(龙)年 月十六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Html+Div+Css(前端)

河面上的月亮倒影动画特效

时间:08-26来源:作者:点击数:24
在这里插入图片描述

css代码

  • * {
  • margin: 0;
  • padding: 0;
  • }
  • canvas#canvas {
  • display: block;
  • background: #360033;
  • background: -webkit-linear-gradient(to bottom, #0b8793, #360033);
  • background: linear-gradient(to bottom, #0b8793, #360033);
  • }

js代码

  • (function () {
  • 'use strict';
  • window.addEventListener('load', function () {
  • var canvas = document.getElementById('canvas');
  • if (!canvas || !canvas.getContext) {
  • return false;
  • }
  • /********************
  • Random Number
  • ********************/
  • function rand(min, max) {
  • return Math.floor(Math.random() * (max - min + 1) + min);
  • }
  • /********************
  • Var
  • ********************/
  • var ctx = canvas.getContext('2d');
  • var X = canvas.width = window.innerWidth;
  • var Y = canvas.height = window.innerHeight;
  • var mouseX = X / 2;
  • var mouseY = Y / 2;
  • var shapes = [];
  • var shapeNum = Y / 4;
  • /********************
  • Animation
  • ********************/
  • window.requestAnimationFrame =
  • window.requestAnimationFrame ||
  • window.mozRequestAnimationFrame ||
  • window.webkitRequestAnimationFrame ||
  • window.msRequestAnimationFrame ||
  • function(cb) {
  • setTimeout(cb, 17);
  • };
  • /********************
  • Shape
  • ********************/
  • function Shape(ctx, x, y, i) {
  • this.ctx = ctx;
  • this.init(x, y, i);
  • }
  • Shape.prototype.init = function(x, y, i) {
  • this.x = x;
  • this.y = y;
  • this.i = i;
  • this.r = 2;
  • this.a = rand(0, 360);
  • this.rad = this.a * Math.PI / 180;
  • this.ga = Math.random() * Math.random() * Math.random();
  • this.inA = Math.random();
  • this.scaleX = 100 - i / 2;
  • this.dist = shapeNum - i;
  • };
  • Shape.prototype.draw = function() {
  • var ctx = this.ctx;
  • ctx.save();
  • ctx.fillStyle = 'white';
  • ctx.globalCompositeOperation = 'lighter';
  • ctx.globalAlpha = this.ga;
  • ctx.translate(Math.sin(this.rad) * this.dist + this.x, this.y);
  • ctx.scale(this.scaleX, 1);
  • ctx.translate(-Math.sin(this.rad) * this.dist - this.x, -this.y);
  • ctx.beginPath();
  • ctx.arc(Math.sin(this.rad) * this.dist + this.x, this.y, this.r, 0, Math.PI * 2, false);
  • ctx.fill();
  • ctx.restore();
  • };
  • Shape.prototype.updateParams = function() {
  • this.a += this.inA;
  • this.rad = this.a * Math.PI / 180;
  • };
  • Shape.prototype.render = function() {
  • this.updateParams();
  • this.draw();
  • };
  • for (var i = 0; i < shapeNum; i++) {
  • var s = new Shape(ctx, X / 2, Y - i * 1, i);
  • shapes.push(s);
  • }
  • /********************
  • Moon
  • ********************/
  • var radius = 150;
  • if (X < 768) {
  • radius = 100;
  • }
  • function drawMoon() {
  • ctx.save();
  • ctx.beginPath();
  • ctx.fillStyle = 'white';
  • ctx.shadowColor = 'white';
  • ctx.shadowBlur = 100;
  • ctx.arc(X / 2, Y / 3, radius, 0, Math.PI * 2, false);
  • ctx.fill();
  • ctx.restore();
  • }
  • /********************
  • Kirakira
  • ********************/
  • var particleNum = 500;
  • var particles = [];
  • function Particle(ctx, x, y) {
  • this.ctx = ctx;
  • this.init(x, y);
  • }
  • Particle.prototype.init = function(x, y) {
  • this.x = x;
  • this.y = y;
  • this.r = rand(5, 10);
  • this.ga = Math.random() * Math.random() * Math.random() * Math.random();
  • this.v = {
  • x: 0,
  • y: -Math.random() * Math.random()
  • };
  • this.l = rand(10, 50);
  • };
  • Particle.prototype.draw = function() {
  • var ctx = this.ctx;
  • ctx.save();
  • ctx.fillStyle = 'white';
  • ctx.globalCompositeOperation = 'lighter';
  • ctx.globalAlpha = this.ga;
  • ctx.beginPath();
  • ctx.arc(this.x, this.y, this.r, 0, Math.PI * 2, false);
  • ctx.fill();
  • ctx.restore();
  • };
  • Particle.prototype.updateParams = function() {
  • this.a += this.inA;
  • this.rad = this.a * Math.PI / 180;
  • this.l -= 0.1;
  • if (this.l < 0) {
  • this.init(rand(0, X), rand(Y - Y / 4, Y));
  • }
  • };
  • Particle.prototype.updatePositon = function() {
  • this.y += this.v.y;
  • };
  • Particle.prototype.render = function() {
  • this.updatePositon();
  • this.updateParams();
  • this.draw();
  • };
  • for (var i = 0; i < particleNum; i++) {
  • var p = new Particle(ctx, rand(0, X), rand(Y - Y / 4, Y));
  • particles.push(p);
  • }
  • /********************
  • Render
  • ********************/
  • function render() {
  • ctx.clearRect(0, 0, X, Y);
  • drawMoon();
  • for (var i = 0; i < shapes.length; i++) {
  • shapes[i].render(i);
  • }
  • for (var i = 0; i < particles.length; i++) {
  • particles[i].render(i);
  • }
  • requestAnimationFrame(render);
  • }
  • render();
  • /********************
  • Event
  • ********************/
  • function onResize() {
  • X = canvas.width = window.innerWidth;
  • Y = canvas.height = window.innerHeight;
  • shapes = [];
  • if (X < 768) {
  • radius = 100;
  • } else {
  • radius = 150;
  • }
  • for (var i = 0; i < shapeNum; i++) {
  • var s = new Shape(ctx, X / 2, Y - i * 1, i);
  • shapes.push(s);
  • }
  • }
  • window.addEventListener('resize', function() {
  • onResize();
  • });
  • });
  • // Author
  • console.log('');
  • })();

html代码

  • <canvas id="canvas">Canvas not supported.</canvas>
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门