Para implementar una visualización responsiva en pantallas grandes con escala de relación fija y funcionalidad de pantalla completa en React, se puede combinar el uso de la Fullscreen API con transformaciones CSS. A continuación, se describe un enfoque modular y optimizado.
1. Módulo de gestión de pantalla completa en JavaScript
Se crea un módulo que encapsula la lógica para activar y desactivar el modo de pantalla completa, manejando las diferencias entre navegadores.
// fullscreenManager.js
const toggleFullscreen = (activate) => {
const doc = document;
const docEl = doc.documentElement;
if (activate) {
const requestMethod = docEl.requestFullscreen ||
docEl.webkitRequestFullscreen ||
docEl.mozRequestFullScreen ||
docEl.msRequestFullscreen;
if (requestMethod) {
requestMethod.call(docEl);
} else if (typeof window.ActiveXObject !== 'undefined') {
const wscript = new ActiveXObject('WScript.Shell');
if (wscript) {
wscript.SendKeys('{F11}');
}
}
} else {
const exitMethod = doc.exitFullscreen ||
doc.webkitExitFullscreen ||
doc.mozCancelFullScreen ||
doc.msExitFullscreen;
if (exitMethod) {
exitMethod.call(doc);
} else if (typeof window.ActiveXObject !== 'undefined') {
const wscript = new ActiveXObject('WScript.Shell');
if (wscript) {
wscript.SendKeys('{F11}');
}
}
}
};
const checkFullscreenStatus = () => {
const screenHeight = window.screen.height;
const clientHeight = document.documentElement.clientHeight;
// Umbral para considerar pantalla completa
return (screenHeight - clientHeight) <= 20;
};
export { toggleFullscreen, checkFullscreenStatus };
2. Componente React con escala fija y eventos de pantalla completa
En el componente React, se calcula el factor de escala basado en una resolución de diseño fija (por ejemplo, 1920x1080) y se ajusta automáticamente al redimensionar la ventana.
import React, { useState, useEffect, useCallback } from 'react';
import { toggleFullscreen, checkFullscreenStatus } from './fullscreenManager';
const LargeScreenDisplay = ({ children }) => {
const [zoomFactor, setZoomFactor] = useState(1);
const updateScale = useCallback(() => {
const viewportWidth = window.innerWidth || document.documentElement.clientWidth;
const viewportHeight = window.innerHeight || document.documentElement.clientHeight;
// Resolución de diseño objetivo
const designWidth = 1920;
const designHeight = 1080;
const widthRatio = viewportWidth / designWidth;
const heightRatio = viewportHeight / designHeight;
// Usar la menor ratio para mantener relación de aspecto
setZoomFactor(Math.min(widthRatio, heightRatio));
}, []);
useEffect(() => {
updateScale();
window.addEventListener('resize', updateScale);
return () => {
window.removeEventListener('resize', updateScale);
};
}, [updateScale]);
const handleDoubleClick = () => {
const isFullscreen = checkFullscreenStatus();
toggleFullscreen(!isFullscreen);
};
return (
<div height:="" left="" ondoubleclick="{handleDoubleClick}" style="{{" transform:="" transformorigin:="" width:="">
{children}
</div>
);
};
export default LargeScreenDisplay;
3. Consideraciones de implementación
Para un despliegue robusto, se recomienda:
- Optimizar el cálculo de escala usando
requestAnimationFramepara evitar reflows innecesarios. - Manejar eventos de teclado como alternativa para activar la pantalla completa.
- Probar la compatibilidad con navegadores antiguos si es necesario, mediante polyfills específicos.