diff --git a/index.html b/index.html
index 0fd2663..24188c0 100644
--- a/index.html
+++ b/index.html
@@ -43,9 +43,8 @@
openLinksInNewTab: true,
rainColumns: 200,
rainFade: 0.2,
- rainFrameRate: 1000 / 20,
+ rainFrameRate: 1000 / 18,
rainFrameTotal: Infinity,
- rainOverlap: 0.2,
rainResilience: 0.8,
suggestionLimit: 4,
};
@@ -756,7 +755,7 @@
#ctx;
#drops;
#frameCount;
- #interval;
+ #lastRender;
#rainColor;
#size;
@@ -766,7 +765,7 @@
const template = document.getElementById('rain-template');
const clone = template.content.cloneNode(true);
this.#canvas = clone.querySelector('.rain');
- this.#ctx = this.#canvas.getContext('2d');
+ this.#ctx = this.#canvas.getContext('2d', { alpha: false });
this.#renderCanvas();
const rerender = Rain.debounce(this.#renderCanvas, CONFIG.rainFrameRate);
const mq = '(prefers-color-scheme: light)';
@@ -789,39 +788,40 @@
}
#renderCanvas = () => {
- if (this.#interval) clearInterval(this.#interval);
this.#canvas.height = window.innerHeight;
this.#canvas.width = window.innerWidth;
- this.#size = this.#canvas.width / CONFIG.rainColumns;
+ this.#size = Math.ceil(this.#canvas.width / CONFIG.rainColumns);
this.#backgroundColor = Rain.cssVar('--color-background');
this.#rainColor = Rain.cssVar('--color-rain');
this.#drops = new Array(CONFIG.rainColumns).fill(0);
this.#frameCount = 0;
- this.#interval = setInterval(this.#renderRain, CONFIG.rainFrameRate);
+ this.#lastRender = performance.now();
+ requestAnimationFrame(this.#renderRain);
};
- #renderRain = () => {
- if (this.#frameCount >= CONFIG.rainFrameTotal) {
- clearInterval(this.#interval);
- return;
+ #renderRain = (timestamp) => {
+ if (this.#frameCount >= CONFIG.rainFrameTotal) return;
+
+ if (timestamp - this.#lastRender >= CONFIG.rainFrameRate) {
+ this.#ctx.fillStyle = this.#backgroundColor;
+ this.#ctx.globalAlpha = CONFIG.rainFade;
+ this.#ctx.fillRect(0, 0, this.#canvas.width, this.#canvas.height);
+
+ for (let i = 0; i < this.#drops.length; i++) {
+ this.#ctx.fillStyle = this.#rainColor;
+ this.#ctx.globalAlpha = 1;
+ const y = this.#drops[i] * this.#size;
+ this.#ctx.fillRect(i * this.#size, y, this.#size, this.#size);
+ const reset = Math.random() > CONFIG.rainResilience;
+ if (reset || y > this.#canvas.height) this.#drops[i] = 0;
+ else this.#drops[i]++;
+ }
+
+ this.#frameCount++;
+ this.#lastRender = timestamp;
}
- this.#ctx.fillStyle = this.#backgroundColor;
- this.#ctx.globalAlpha = CONFIG.rainFade;
- this.#ctx.fillRect(0, 0, this.#canvas.width, this.#canvas.height);
-
- for (let i = 0; i < this.#drops.length; i++) {
- this.#ctx.fillStyle = this.#rainColor;
- this.#ctx.globalAlpha = 1;
- const y = this.#drops[i] * this.#size - CONFIG.rainOverlap;
- const size = this.#size + CONFIG.rainOverlap * 2;
- this.#ctx.fillRect(i * this.#size - CONFIG.rainOverlap, y, size, size);
- const reset = Math.random() > CONFIG.rainResilience;
- if (reset || y > this.#canvas.height) this.#drops[i] = 0;
- else this.#drops[i]++;
- }
-
- this.#frameCount++;
+ requestAnimationFrame(this.#renderRain);
};
}