Spaces:
Running
Running
File size: 1,406 Bytes
d41f9bc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | function scaleCanvas({ selector = '.canvas-root', minScale = 0.25, maxScale = 1 } = {}) {
const canvases = Array.from(document.querySelectorAll(selector));
if (canvases.length === 0) {
return;
}
function updateBaseSize(canvas) {
if (canvas.dataset.baseWidth && canvas.dataset.baseHeight) {
return;
}
const { width, height } = canvas.getBoundingClientRect();
if (width && height) {
canvas.dataset.baseWidth = width;
canvas.dataset.baseHeight = height;
}
}
function updateScale() {
canvases.forEach((canvas) => {
updateBaseSize(canvas);
const baseWidth = parseFloat(canvas.dataset.baseWidth || '0');
const baseHeight = parseFloat(canvas.dataset.baseHeight || '0');
if (!baseWidth || !baseHeight) {
return;
}
const scale = Math.min(window.innerWidth / baseWidth, window.innerHeight / baseHeight);
const clamped = Math.max(minScale, Math.min(scale, maxScale));
canvas.style.transform = `scale(${clamped})`;
canvas.style.transformOrigin = 'center';
});
}
const observer = new ResizeObserver(() => updateScale());
canvases.forEach((canvas) => {
observer.observe(canvas);
updateBaseSize(canvas);
});
window.addEventListener('resize', updateScale);
window.addEventListener('load', () => requestAnimationFrame(updateScale));
requestAnimationFrame(updateScale);
}
|