import React, { useRef, useEffect, useState } from 'react';
|
|
const BASE_WIDTH = 1920;
|
const BASE_HEIGHT = 1080;
|
|
const ScreenContainer = ({ children, style = {}, className = '' }) => {
|
const containerRef = useRef(null);
|
const [scale, setScale] = useState(1);
|
|
useEffect(() => {
|
const calcScale = () => {
|
if (!containerRef.current || !containerRef.current.parentNode) return;
|
const parent = containerRef.current.parentNode;
|
const pw = parent.clientWidth;
|
const ph = parent.clientHeight;
|
const scaleW = pw / BASE_WIDTH;
|
const scaleH = ph / BASE_HEIGHT;
|
setScale(Math.min(scaleW, scaleH));
|
};
|
calcScale();
|
let resizeObserver = null;
|
if (window.ResizeObserver) {
|
resizeObserver = new ResizeObserver(calcScale);
|
if (containerRef.current && containerRef.current.parentNode) {
|
resizeObserver.observe(containerRef.current.parentNode);
|
}
|
} else {
|
window.addEventListener('resize', calcScale);
|
}
|
return () => {
|
if (resizeObserver && containerRef.current && containerRef.current.parentNode) {
|
resizeObserver.unobserve(containerRef.current.parentNode);
|
}
|
window.removeEventListener('resize', calcScale);
|
};
|
}, []);
|
|
return (
|
<div
|
ref={containerRef}
|
className={className}
|
style={{
|
width: BASE_WIDTH,
|
height: BASE_HEIGHT,
|
transform: `scale(${scale})`,
|
transformOrigin: 'left top',
|
position: 'absolute',
|
left: 0,
|
top: 0,
|
...style,
|
}}
|
>
|
{children}
|
</div>
|
);
|
};
|
|
export default ScreenContainer;
|