PK creative Spring Festival, I am participating in the “Spring Festival creative submission contest”, please see: Spring Festival creative submission Contest
🌊 author’s home page: Hai Young 🌊 Author profile: 🏆CSDN full stack quality creator, 🥇HDZ core group member 🌊 Fan benefits: fans send 6~9 books every week, send a variety of small gifts from time to time, the award will be announced
May this year be a good one for you and me
I wish you all a happy New Year. This is my first article of 2022. I hope to bring you something fun and interesting
Will bring you some interesting articles on the theme of Spring Festival
- Watch Snow with Xiao Hai – Simple snow effects with HTML, CSS and JS
- HTML, CSS and JS implement the countdown timer for the 2022 New Year
- HTML, CSS and JS implementation fireworks
- Mobile responsive design
- .
Today we bring you a few beautiful fireworks based on HTML+CSS+JS effects
Snowflakes, cherry blossoms, romantic cards, and Christmas trees I made a few days ago. If you’re interested, check out my previous posts:
Snow: juejin. Cn/post / 705174… Sakura: juejin. Cn/post / 704285… Christmas trees and greeting cards: juejin.cn/post/704406…
🎇 Five different JS fireworks effects
🍕 a simple atmosphere of fireworks
Site: Haiyong-site /fireworks1
HTML code:
The HTML code here is short
<div>
<canvas id="canvas"></canvas>
</div>
Copy the code
CSS code
These are the only two pieces of CSS
body{
background:black;
overflow:hidden;
margin:0;
}
canvas{
background:# 000;
}
Copy the code
JS code
All the source code is here, copy and paste
window.addEventListener("resize", resizeCanvas, false);
window.addEventListener("DOMContentLoaded", onLoad, false);
window.requestAnimationFrame =
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function (callback) {
window.setTimeout(callback, 1000/60);
};
var canvas, ctx, w, h, particles = [], probability = 0.04,
xPoint, yPoint;
function onLoad() {
canvas = document.getElementById("canvas");
ctx = canvas.getContext("2d");
resizeCanvas();
window.requestAnimationFrame(updateWorld);
}
function resizeCanvas() {
if(!!!!! canvas) { w = canvas.width =window.innerWidth;
h = canvas.height = window.innerHeight; }}function updateWorld() {
update();
paint();
window.requestAnimationFrame(updateWorld);
}
function update() {
if (particles.length < 500 && Math.random() < probability) {
createFirework();
}
var alive = [];
for (var i=0; i<particles.length; i++) {
if (particles[i].move()) {
alive.push(particles[i]);
}
}
particles = alive;
}
function paint() {
ctx.globalCompositeOperation = 'source-over';
ctx.fillStyle = "Rgba (0,0,0,0.2)";
ctx.fillRect(0.0, w, h);
ctx.globalCompositeOperation = 'lighter';
for (var i=0; i<particles.length; i++) { particles[i].draw(ctx); }}function createFirework() {
xPoint = Math.random()*(w-200) +100;
yPoint = Math.random()*(h-200) +100;
var nFire = Math.random()*50+100;
var c = "rgb("+ (~ ~ (Math.random()*200+55)) +","+ (~ ~ (Math.random()*200+55)) +","+ (~ ~ (Math.random()*200+55)) +")";
for (var i=0; i<nFire; i++) {
var particle = new Particle();
particle.color = c;
var vy = Math.sqrt(25-particle.vx*particle.vx);
if (Math.abs(particle.vy) > vy) {
particle.vy = particle.vy>0? vy: -vy; } particles.push(particle); }}function Particle() {
this.w = this.h = Math.random()*4+1;
this.x = xPoint-this.w/2;
this.y = yPoint-this.h/2;
this.vx = (Math.random()-0.5) *10;
this.vy = (Math.random()-0.5) *10;
this.alpha = Math.random()*. 5+. 5;
this.color;
}
Particle.prototype = {
gravity: 0.05.move: function () {
this.x += this.vx;
this.vy += this.gravity;
this.y += this.vy;
this.alpha -= 0.01;
if (this.x <= -this.w || this.x >= screen.width ||
this.y >= screen.height ||
this.alpha <= 0) {
return false;
}
return true;
},
draw: function (c) {
c.save();
c.beginPath();
c.translate(this.x+this.w/2.this.y+this.h/2);
c.arc(0.0.this.w, 0.Math.PI*2);
c.fillStyle = this.color;
c.globalAlpha = this.alpha; c.closePath(); c.fill(); c.restore(); }}Copy the code
🍜 2. Fireworks seen in the countryside
Demo Address:haiyong.site/fireworks2(Need to use the computer to open, do not respond to the mobile phone to open a black, or you can see the fireworks behind) HTML code:
The HTML code here is just as short
<div id="jsi-fireworks-container" class="container"></div>
Copy the code
CSS code
CSS only has these three pieces of content
html.body{
width: 100%;
height: 100%;
margin: 0;
padding: 0;
overflow: hidden;
background-color: # 101010;
}
.container{
position: absolute;
width: 500px;
height: 500px;
top: 50%;
left: 50%;
margin-top: -250px;
margin-left: -250px;
}
canvas{
position: absolute;
top: 0;
left: 0;
}
Copy the code
JS code
JS code is relatively long, I put a part of it here, need to complete the source can pay attention to the public number [hai Long]
var RENDERER = {
LEAF_INTERVAL_RANGE : {min : 100.max : 200},
FIREWORK_INTERVAL_RANGE : {min : 20.max : 200},
SKY_COLOR : 'hsla (210. 60%, % % luminance, 0.2)'.STAR_COUNT : 100.init : function(){
this.setParameters();
this.reconstructMethod();
this.createTwigs();
this.createStars();
this.render();
},
setParameters : function(){
this.$container = $('#jsi-fireworks-container');
this.width = this.$container.width();
this.height = this.$container.height();
this.distance = Math.sqrt(Math.pow(this.width / 2.2) + Math.pow(this.height / 2.2));
this.contextFireworks = $('<canvas />').attr({width : this.width, height : this.height}).appendTo(this.$container).get(0).getContext('2d');
this.contextTwigs = $('<canvas />').attr({width : this.width, height : this.height}).appendTo(this.$container).get(0).getContext('2d');
this.twigs = [];
this.leaves = [new LEAF(this.width, this.height, this)];
this.stars = [];
this.fireworks = [new FIREWORK(this.width, this.height, this)];
this.leafInterval = this.getRandomValue(this.LEAF_INTERVAL_RANGE) | 0;
this.maxFireworkInterval = this.getRandomValue(this.FIREWORK_INTERVAL_RANGE) | 0;
this.fireworkInterval = this.maxFireworkInterval;
},
reconstructMethod : function(){
this.render = this.render.bind(this);
},
getRandomValue : function(range){
return range.min + (range.max - range.min) * Math.random();
},
createTwigs : function(){
this.twigs.push(new TWIG(this.width, this.height, 0.0.Math.PI * 3 / 4.0));
this.twigs.push(new TWIG(this.width, this.height, this.width, 0, -Math.PI * 3 / 4.Math.PI));
this.twigs.push(new TWIG(this.width, this.height, 0.this.height, Math.PI / 4.Math.PI));
this.twigs.push(new TWIG(this.width, this.height, this.width, this.height, -Math.PI / 4.0));
},
createStars : function(){
for(var i = 0, length = this.STAR_COUNT; i < length; i++){
this.stars.push(new STAR(this.width, this.height, this.contextTwigs, this)); }},render : function(){
requestAnimationFrame(this.render);
var maxOpacity = 0,
contextTwigs = this.contextTwigs,
contextFireworks = this.contextFireworks;
for(var i = this.fireworks.length - 1; i >= 0; i--){
maxOpacity = Math.max(maxOpacity, this.fireworks[i].getOpacity());
}
contextTwigs.clearRect(0.0.this.width, this.height);
contextFireworks.fillStyle = this.SKY_COLOR.replace('%luminance'.5 + maxOpacity * 15);
contextFireworks.fillRect(0.0.this.width, this.height);
for(var i = this.fireworks.length - 1; i >= 0; i--){
if(!this.fireworks[i].render(contextFireworks)){
this.fireworks.splice(i, 1); }}for(var i = this.stars.length - 1; i >= 0; i--){
this.stars[i].render(contextTwigs);
}
for(var i = this.twigs.length - 1; i >= 0; i--){
this.twigs[i].render(contextTwigs);
}
for(var i = this.leaves.length - 1; i >= 0; i--){
if(!this.leaves[i].render(contextTwigs)){
this.leaves.splice(i, 1); }}if(--this.leafInterval == 0) {this.leaves.push(new LEAF(this.width, this.height, this));
this.leafInterval = this.getRandomValue(this.LEAF_INTERVAL_RANGE) | 0;
}
if(--this.fireworkInterval == 0) {this.fireworks.push(new FIREWORK(this.width, this.height, this));
this.maxFireworkInterval = this.getRandomValue(this.FIREWORK_INTERVAL_RANGE) | 0;
this.fireworkInterval = this.maxFireworkInterval; }}};Copy the code
🧀 3. Clickable fireworks
Demo Address:haiyong.site/fireworks3
HTML code:
<canvas id="canvas"></canvas>
Copy the code
CSS code
body{
background-color: # 000;
}
canvas{
display: block;
margin: auto;
-webkit-tap-highlight-color:rgba(0.0.0.0);
-webkit-user-select:none;
}
Copy the code
Complete JS code
(function() {
var Fireworks, GRAVITY, K, SPEED, ToRadian, canvas, context, ctx, fireBoss, repeat, stage;
canvas = document.getElementById("canvas");
context = canvas.getContext("2d");
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
stage = new createjs.Stage(canvas);
stage.autoClear = false;
ctx = canvas.getContext("2d");
ctx.fillStyle = "rgba(0, 0, 0, 0)";
ctx.fillRect(0.0, canvas.width, canvas.height);
createjs.Ticker.setFPS(50);
createjs.Touch.enable(stage);
stage.update();
/ / gravity
GRAVITY = 1;
/ / resistance
K = 0.9;
/ / speed
SPEED = 12;
// Convert from degrees to radians
ToRadian = function(degree) {
return degree * Math.PI / 180.0;
};
// Make fireworks class
Fireworks = class Fireworks {
constructor(sx = 100, sy = 100, particles = 70) {
var circle, i, j, rad, ref, speed;
this.sx = sx;
this.sy = sy;
this.particles = particles;
this.sky = new createjs.Container();
this.r = 0;
this.h = Math.random() * 360 | 0;
this.s = 100;
this.l = 50;
this.size = 3;
for (i = j = 0, ref = this.particles; (0 <= ref ? j < ref : j > ref); i = 0 <= ref ? ++j : --j) {
speed = Math.random() * 12 + 2;
circle = new createjs.Shape();
circle.graphics.f(`hsla(The ${this.h}.The ${this.s}%, The ${this.l}` %, 1)).dc(0.0.this.size);
circle.snapToPixel = true;
circle.compositeOperation = "lighter";
rad = ToRadian(Math.random() * 360 | 0);
circle.set({
x: this.sx,
y: this.sy,
vx: Math.cos(rad) * speed,
vy: Math.sin(rad) * speed,
rad: rad
});
this.sky.addChild(circle);
}
stage.addChild(this.sky);
}
explode() {
var circle, j, p, ref;
if (this.sky) {
++this.h;
for (p = j = 0, ref = this.sky.getNumChildren(); (0 <= ref ? j < ref : j > ref); p = 0 <= ref ? ++j : --j) {
circle = this.sky.getChildAt(p);
/ / acceleration
circle.vx = circle.vx * K;
circle.vy = circle.vy * K;
// Position calculation
circle.x += circle.vx;
circle.y += circle.vy + GRAVITY;
this.l = Math.random() * 100;
/ / size
this.size = this.size - 0.001;
if (this.size > 0) {
circle.graphics.c().f(`hsla(The ${this.h}, 100%, The ${this.l}` %, 1)).dc(0.0.this.size); }}if (this.sky.alpha > 0.1) {
this.sky.alpha -= K / 50;
} else {
stage.removeChild(this.sky);
this.sky = null; }}else{}}}; fireBoss = [];setInterval(function() {
ctx.fillStyle = "Rgba (0, 0, 0, 0.1)";
ctx.fillRect(0.0, canvas.width, canvas.height);
}, 40);
setInterval(function() {
var x, y;
x = Math.random() * canvas.width | 0;
y = Math.random() * canvas.height | 0;
fireBoss.push(new Fireworks(x, y));
return fireBoss.push(new Fireworks(x, y));
}, 1300);
repeat = function() {
var fireworks, j, ref;
for (fireworks = j = 0, ref = fireBoss.length; (0 <= ref ? j < ref : j > ref); fireworks = 0 <= ref ? ++j : --j) {
if (fireBoss[fireworks].sky) {
fireBoss[fireworks].explode();
}
}
stage.update();
};
createjs.Ticker.on("tick", repeat);
stage.addEventListener("stagemousedown".function() {
fireBoss.push(new Fireworks(stage.mouseX, stage.mouseY));
return fireBoss.push(new Fireworks(stage.mouseX, stage.mouseY));
});
}).call(this);
Copy the code
🍖 4. 3D rotating fireworks
Site: Haiyong. site/ Fireworks4
HTML code:
<canvas id="canvas"></canvas>
Copy the code
CSS code
html.body{
margin:0px;
width:100%;
height:100%;
overflow:hidden;
background:# 000;
}
#canvas{
width:100%;
height:100%;
}
Copy the code
Part of JS code
The JS code is long and I will not list it all. If you need the full source code, you can download all the source code of this article here:
function initVars(){
pi=Math.PI;
ctx=canvas.getContext("2d");
canvas.width=canvas.clientWidth;
canvas.height=canvas.clientHeight;
cx=canvas.width/2;
cy=canvas.height/2;
playerZ=-25;
playerX=playerY=playerVX=playerVY=playerVZ=pitch=yaw=pitchV=yawV=0;
scale=600;
seedTimer=0; seedInterval=5,seedLife=100; gravity=. 02;
seeds=new Array(a); sparkPics=new Array(a); s="https://cantelope.org/NYE/";
for(i=1; i<=10; ++i){ sparkPic=new Image();
sparkPic.src=s+"spark"+i+".png";
sparkPics.push(sparkPic);
}
sparks=new Array(a); pow1=new Audio(s+"pow1.ogg");
pow2=new Audio(s+"pow2.ogg");
pow3=new Audio(s+"pow3.ogg");
pow4=new Audio(s+"pow4.ogg");
frames = 0;
}
function rasterizePoint(x,y,z){
var p,d;
x-=playerX;
y-=playerY;
z-=playerZ;
p=Math.atan2(x,z);
d=Math.sqrt(x*x+z*z);
x=Math.sin(p-yaw)*d;
z=Math.cos(p-yaw)*d;
p=Math.atan2(y,z);
d=Math.sqrt(y*y+z*z);
y=Math.sin(p-pitch)*d;
z=Math.cos(p-pitch)*d;
var rx1=-1000,ry1=1,rx2=1000,ry2=1,rx3=0,ry3=0,rx4=x,ry4=z,uc=(ry4-ry3)*(rx2-rx1)-(rx4-rx3)*(ry2-ry1);
if(! uc)return {x:0.y:0.d: -1};
var ua=((rx4-rx3)*(ry1-ry3)-(ry4-ry3)*(rx1-rx3))/uc;
var ub=((rx2-rx1)*(ry1-ry3)-(ry2-ry1)*(rx1-rx3))/uc;
if(! z)z=000000001.;
if(ua>0&&ua<1&&ub>0&&ub<1) {return {
x:cx+(rx1+ua*(rx2-rx1))*scale,
y:cy+y/z*scale,
d:Math.sqrt(x*x+y*y+z*z)
};
}else{
return {
x:cx+(rx1+ua*(rx2-rx1))*scale,
y:cy+y/z*scale,
d: -1}; }}function spawnSeed(){
seed=new Object(a); seed.x=-50+Math.random()*100;
seed.y=25;
seed.z=-50+Math.random()*100;
seed.vx=1.-Math.random()*2.;
seed.vy=-1.5;//*(1+Math.random()/2);
seed.vz=1.-Math.random()*2.;
seed.born=frames;
seeds.push(seed);
}
Copy the code
🍰 5. Custom fireworks that can be dragged from perspective
Site: Haiyong. site/ Fireworks5
HTML code:
<div id="WebGL-output"></div>
Copy the code
CSS code
body {
margin: 0;
overflow: hidden;
background: -webkit-linear-gradient(0deg.rgb(0.12.91), rgb(0.0.0));
background: linear-gradient(0deg.rgb(0.12.91), rgb(0.0.0));
}
Copy the code
Part of JS code
The JS code is long and I will not list it completely. If you need the complete source code, you can refer to the end of the article for two ways to obtain the source code
let scene,
camera,
renderer,
orbitControls,
planeMesh,
canvasTexture,
isAutoLaunch = true;
const gravity = new THREE.Vector3(0, -0.005.0);
const friction = 0.998;
const noise = new SimplexNoise();
const textureSize = 128.0;
const fireworksInstances = [];
let outputDom;
const getOffsetXYZ = i= > {
const offset = 3;
const index = i * offset;
const x = index;
const y = index + 1;
const z = index + 2;
return { x, y, z };
};
const getOffsetRGBA = i= > {
const offset = 4;
const index = i * offset;
const r = index;
const g = index + 1;
const b = index + 2;
const a = index + 3;
return { r, g, b, a };
};
const gui = new dat.GUI();
const guiControls = new function () {
this.ParticleSize = 300;
this.AutoLaunch = true; } (); gui.add(guiControls,'ParticleSize'.100.600);
gui.add(guiControls, 'AutoLaunch').onChange(e= > {
isAutoLaunch = e;
outputDom.style.cursor = isAutoLaunch ? 'auto' : 'pointer';
});
const getRandomNum = (max = 0, min = 0) = > Math.floor(Math.random() * (max + 1 - min)) + min;
const launchFireWorks = () = > {
if (fireworksInstances.length > 5) return;
const fw = Math.random() > 8 ? new BasicFIreWorks() : new RichFIreWorks();
fireworksInstances.push(fw);
scene.add(fw.meshGroup);
};
const autoLaunch = () = > {
if(! isAutoLaunch)return;
if (Math.random() > 0.7) launchFireWorks();
};
const drawRadialGradation = (ctx, canvasRadius, canvasW, canvasH) = > {
ctx.save();
const gradient = ctx.createRadialGradient(canvasRadius, canvasRadius, 0, canvasRadius, canvasRadius, canvasRadius);
gradient.addColorStop(0.0.'rgba (255255255,1.0)');
gradient.addColorStop(0.5.'rgba (255255255,0.5)');
gradient.addColorStop(1.0.'rgba(255,255,255,0)');
ctx.fillStyle = gradient;
ctx.fillRect(0.0, canvasW, canvasH);
ctx.restore();
};
const getTexture = () = > {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const diameter = textureSize;
canvas.width = diameter;
canvas.height = diameter;
const canvasRadius = diameter / 2;
drawRadialGradation(ctx, canvasRadius, canvas.width, canvas.height);
const texture = new THREE.Texture(canvas);
texture.type = THREE.FloatType;
texture.needsUpdate = true;
return texture;
};
canvasTexture = getTexture();
const getPointMesh = (num, vels, type) = > {
const bufferGeometry = new THREE.BufferGeometry();
const vertices = [];
const velocities = [];
const colors = [];
const adjustSizes = [];
const masses = [];
const colorType = Math.random() > 0.3 ? 'single' : 'multiple';
const singleColor = getRandomNum(100.20) * 0.01;
const multipleColor = () = > getRandomNum(100.1) * 0.01;
let rgbType;
const rgbTypeDice = Math.random();
if (rgbTypeDice > 0.66) {
rgbType = 'red';
} else if (rgbTypeDice > 0.33) {
rgbType = 'green';
} else {
rgbType = 'blue';
}
for (let i = 0; i < num; i++) {
const pos = new THREE.Vector3(0.0.0);
vertices.push(pos.x, pos.y, pos.z);
velocities.push(vels[i].x, vels[i].y, vels[i].z);
if (type === 'seed') {
let size;
if (type === 'trail') {
size = Math.random() * 0.1 + 0.1;
} else {
size = Math.pow(vels[i].y, 2) * 0.04;
}
if (i === 0) size *= 1.1;
adjustSizes.push(size);
masses.push(size * 0.017);
colors.push(1.0.1.0.1.0.1.0);
} else {
const size = getRandomNum(guiControls.ParticleSize, 10) * 0.001;
adjustSizes.push(size);
masses.push(size * 0.017);
if (colorType === 'multiple') {
colors.push(multipleColor(), multipleColor(), multipleColor(), 1.0);
} else {
switch (rgbType) {
case 'red':
colors.push(singleColor, 0.1.0.1.1.0);
break;
case 'green':
colors.push(0.1, singleColor, 0.1.1.0);
break;
case 'blue':
colors.push(0.1.0.1, singleColor, 1.0);
break;
default:
colors.push(singleColor, 0.1.0.1.1.0); } } } } bufferGeometry.addAttribute('position'.new THREE.Float32BufferAttribute(vertices, 3).setDynamic(true));
bufferGeometry.addAttribute('velocity'.new THREE.Float32BufferAttribute(velocities, 3).setDynamic(true));
bufferGeometry.addAttribute('color'.new THREE.Float32BufferAttribute(colors, 4).setDynamic(true));
bufferGeometry.addAttribute('adjustSize'.new THREE.Float32BufferAttribute(adjustSizes, 1).setDynamic(true));
bufferGeometry.addAttribute('mass'.new THREE.Float32BufferAttribute(masses, 1).setDynamic(true));
Copy the code
✨ Download the full source code
For beginners, all the source code for this article has been packaged. Contact information can be obtained from my nuggets home page. Please note: nuggets 👇👇👇 juejin.cn/user/204034…
Why not give them the romance of a programmer?
Hopefully, through this tutorial, you’ll also be able to implement simple fireworks effects using JS.
The author is determined to build a fishing site with 100 small games/tools, update progress: 52/100
I’ve been writing tech blogs for a long time, mostly through Nuggets, and this is my post on how to implement simple snow effects using HTML, CSS, and JS. I like to share technology and happiness through articles. You can visit my blog at juejin.cn/user/204034… For more information. Hope you like it! 😊
💌 welcomes your comments and suggestions in the comments section! 💌