catdad / canvas-confetti Goto Github PK
View Code? Open in Web Editor NEWπ performant confetti animation in the browser
Home Page: https://catdad.github.io/canvas-confetti/
License: ISC License
π performant confetti animation in the browser
Home Page: https://catdad.github.io/canvas-confetti/
License: ISC License
Not working for IE giving SCRIPT438: Object doesn't support property or method 'ellipse' error.
function setupCanvas(canvas) {
// Get the device pixel ratio, falling back to 1.
var dpr = window.devicePixelRatio || 1;
// Get the size of the canvas in CSS pixels.
var rect = canvas.getBoundingClientRect();
// Give the canvas pixel dimensions of their CSS
// size * the device pixel ratio.
canvas.width = rect.width * dpr;
canvas.height = rect.height * dpr;
var ctx = canvas.getContext('2d');
// Scale all drawing operations by the dpr, so you
// don't have to worry about the difference.
ctx.scale(dpr, dpr);
return ctx;
}
// Now this line will be the same size on the page
// but will look sharper on high-DPI devices!
var ctx = setupCanvas(document.querySelector('.my-canvas'));
ctx.lineWidth = 5;
ctx.beginPath();
ctx.moveTo(100, 100);
ctx.lineTo(200, 200);
ctx.stroke();
It should look more natural... I think there is an issue with the rotation origin.
By default it covers entire viewport.
this happens when there are less overlapping confetti that do not end up posterizing to black
These are actually pretty common on mobile, when the address bar disappears while scrolling (or when someone rotates their phone).
This is a feature request regarding the options, it would be good if we can include some extra property or class in the options, so it would be easier to refer them later on or style them.
main
in package.json
In terms of page width/height percent
How about add nodejs canvas support?
Hi, thanks for added the reset!
I know it uses an instance to reset the confetti but what about the example below?
I use that one to create a confetti canon like animation.
How to stop those?
// do this for 30 seconds
var duration = 30 * 1000;
var end = Date.now() + duration;
(function frame() {
// launch a few confetti from the left edge
confetti({
particleCount: 7,
angle: 60,
spread: 55,
origin: { x: 0 }
});
// and launch a few from the right edge
confetti({
particleCount: 7,
angle: 120,
spread: 55,
origin: { x: 1 }
});
// keep going until we are out of time
if (Date.now() < end) {
requestAnimationFrame(frame);
}
}());
Next to rectangles and ellipses, i'd love to see the option of using images as particle shapes.
One could use it with the standard shape array like ['image', 'image', 'circle'] to accomodate for distribution of a single image next to common shapes.
To get the single image source, it would be one way to just define it in the confetti object like:
confetti: {
image: {
source: 'URL',
options: {}
}
}
Another way could be defining a set of images in shapes as well: ['images']. Probability should fit the current system, but can be precised in its own child images' property.
To define them we use another object inside confetti:
confetti: {
images: [
image: {
source: 'URL',
chance: 0.5
options: {}
},
image: {
source: 'URL',
chance: 0.5
options: {}
}
]
}
Thanks for this awesome project which looks by far the best! βπ₯³
Example code (limited to more modern browsers):
function path(context, x, y, scaleX, scaleY, rotation, path) {
context.save();
context.translate(x, y);
context.rotate(rotation);
context.scale(scaleX, scaleY);
context.fill(new Path2D(path));
context.restore();
}
...
path(context, fetti.x + fetti.wobble, fetti.y + fetti.wobble, Math.abs(x2 - x1) * 0.2, Math.abs(y2 - y1) * 0.2, Math.PI / 10 * fetti.wobble, fetti.shape.path);
...
confetti({
particleCount: 100,
shapes: ['circle', { type: 'path', path: 'M1 1 h 8 v 8 h -8 Z' }]
});
A path will probably need to provide a width and height or a scale factor, so that the resulting path can be scaled appropriately.
This code has very poor performance. Any acceptable solution will need to solve that.
The confetti movement speed is about twice as fast when using a 144 Hz monitor.
To ensure it's a framerate issue, I set my monitor down to 60 Hz; resulting the animation to be shown in it's correct speed.
Please fix & Thank You!
I saw this in an animation somewhere. It had confetti as a mixture of circles and squares, and it looked pretty cool.
Hi guys !
I install this canvas-confetti using npm install.. after that i dont have an idea to use this in my angular project.
how can i import this ?
animationObj
setCanvasSize
on user canvas, as the lib should not be modifying thoseHi,
can you please provide a license file or state under which license this project is published. Thanks and keep up the good work!
When using SSR (for example, with something like Razzle), window
cannot be assumed as an existing global, because it does not exist at the time of the build (the code has to be evaluated on the server), so such uses need to reserved for function execution.
/mnt/d/Git/test/confetti-razzle/node_modules/canvas-confetti/src/confetti.js:370
}());
^
ReferenceError: window is not defined
at /mnt/d/Git/test/confetti-razzle/node_modules/canvas-confetti/src/confetti.js:4:5
at /mnt/d/Git/test/confetti-razzle/node_modules/canvas-confetti/src/confetti.js:31:4
at Object.<anonymous> (/mnt/d/Git/test/confetti-razzle/node_modules/canvas-confetti/src/confetti.js:370:2)
at Module._compile (internal/modules/cjs/loader.js:956:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:973:10)
at Module.load (internal/modules/cjs/loader.js:812:32)
at Function.Module._load (internal/modules/cjs/loader.js:724:14)
at Module.require (internal/modules/cjs/loader.js:849:19)
at require (internal/modules/cjs/helpers.js:74:18)
at Object.canvas-confetti (/mnt/d/Git/test/confetti-razzle/external "canvas-confetti":1:1)
https://developers.google.com/web/updates/2018/08/offscreen-canvas#unblock_main_thread
confetti
method should always use a worker when it is capable of doing so without the user having to do anythingconfetti
should have an option controlling whether workers may be used, defaults to false
Broken in older versions of iOS Safari (and probably other browsers) that don't support ECMAScript 6 features such as let
.
I was able to fix this issue by simply changing 'let' to 'var' in confetti.module.mjs
:
OLD
export let create = module.exports.create;
NEW
export var create = module.exports.create;
ES module syntax (ESM) is JavaScriptβs modern native module system.
Tools like Pika can help.
This will allow some internal improvements, especially related to #83 where asynchronous code will need to be kept track of across threads. Promises are ubiquitous now, and users who support browsers without promises will be required to polyfill them.
<meta name="keywords" content="comma,separated,keywords">
blocked by #23
Example code:
function text(context, x, y, scaleX, scaleY, rotation, char) {
context.setTransform(scaleX, 0, 0, scaleY, x, y);
context.rotate(rotation);
context.textAlign = 'center';
context.font = 'normal normal 16px auto';
context.fillText(char, 0, 0);
context.setTransform(1,0,0,1,0,0);
}
...
text(context, fetti.x, fetti.y, Math.abs(x2 - x1) * 0.2, Math.abs(y2 - y1) * 0.2, Math.PI / 10 * fetti.wobble, fetti.shape.char);
...
confetti({
shapes: [{ type: 'char', char: 'π©' }]
});
I am guessing we'd need an additional font family argument.
This code has very poor performance. Any acceptable solution will need to solve that.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
π Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. πππ
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google β€οΈ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.