ventana. pantalla Top devuelve el valor incorrecto en la configuración multi-monitor

Tengo un monitor externo conectado a mi MacBook que tiene una pantalla más grande que mi portátil, por lo tanto la parte superior de mi pantalla portátil no es la parte superior de mi pantalla externa.

Display alignment

La pantalla a la izquierda es la pantalla de mi portátil, y está etiquetada como Pantalla 2. A la derecha está mi pantalla externa y está etiquetada Pantalla 1.

Cuando imploro window.screenTop en Pantalla 1 (external) cuando la ventana del navegador es maximizada, obtengo 23 píxeles. Estos 23 píxeles son de mi barra de herramientas macOS.

screenTop value on external display (screen 1)

Sin embargo, cuando corro window.screenTop en Pantalla 2 (laptop) en otra ventana del navegador optimizada, obtengo 303 píxeles. En lugar de devolver la distancia desde la parte superior del navegador a la parte superior de que pantalla, me da la distancia desde la parte superior del navegador a la parte superior de la pantalla 1 (external)!

screenTop value on internal display (screen 2)

Aquí hay una captura de pantalla que abarca ambas pantallas para mostrar la diferencia:

Cross-display alignment

Esperaría screenTop para devolver la distancia sobre la ventana del navegador para la pantalla actualNo en pantallas. Esto está causando problemas para mí porque mi caso de uso requiere mediciones exactas de la pantalla para recortar capturas de pantalla completa. ¿Hay alguna manera de solucionar este problema, o hay alguna alternativa para averiguar el tamaño de screenTop?

window.screen.availTop también devuelve el mismo, valor incorrecto, y simplemente restando window.screen.availHeight desde window.screen.height me dará la altura de la barra de herramientas macOS, pero no el espacio por encima del navegador. Y subcontratación window.outerHeight desde window.screen.availHeight no distingue entre el espacio arriba y debajo de la ventana del navegador.

Este error ocurre en Chrome y Firefox, pero no en Safari.

Pregunta hecha hace 3 años, 4 meses, 27 días - Por bytebison


2 Respuestas:

  • El comportamiento que estás experimentando con la propiedad window.screenTop es debido a cómo se gestionan las coordenadas en un entorno multi-monitor. La propiedad screenTop da la posición vertical de la ventana en relación con la pantalla actual en la que se encuentra. Sin embargo, en un entorno multi-monitor, puede ser difícil obtener la posición exacta de la ventana respecto a la pantalla en la que se encuentra.

    Una alternativa que puedes intentar es utilizar la propiedad window.screenY, que devuelve la posición vertical de la ventana en relación con la pantalla principal. Esta propiedad puede darte una mejor referencia en un entorno multi-monitor.

    Otra opción es utilizar la combinación de window.outerHeight y window.innerHeight para calcular la posición exacta de la ventana respecto a la pantalla disponible. Esto puede requerir un poco más de cálculos, pero puede darte una medida más precisa.

    Recuerda que este comportamiento puede variar entre navegadores, por lo que es posible que encuentres diferencias entre Chrome, Firefox y Safari.

    Respondida el Dec 19, 2020 a las 16:34 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Problema:

    window.screenTop devuelve un valor incorrecto cuando se utilizan múltiples monitores, lo que lleva a mediciones inexactas de la pantalla para las capturas de pantalla.

    Causa:

    En configuraciones de múltiples monitores, window.screenTop devuelve la distancia desde la parte superior del navegador a la parte superior de la pantalla primaria (generalmente el monitor externo). Esto no es preciso para los monitores secundarios.

    Solución:

    Para obtener mediciones precisas de la pantalla en entornos de múltiples monitores, utiliza la API screen de JavaScript (disponible en navegadores modernos).

    Código:

    javascript
    // Obtener las dimensiones de la pantalla actual
    const screenBounds = screen.get(window.screen.displayId);
    
    // Obtener la distancia desde la parte superior del navegador a la parte superior de la pantalla actual
    const screenTop = screenBounds.bounds.top;
    
    // Obtener la distancia desde la parte superior del navegador a la parte superior de la pantalla primaria
    const primaryScreenTop = screen.get(0).bounds.top;
    
    // Restar para obtener la distancia desde la parte superior de la pantalla primaria a la parte superior de la pantalla actual
    const offsetTop = screenTop - primaryScreenTop;
    

    Nota:

    window.screen.displayId devuelve el ID de la pantalla actual. screen.get(displayId) devuelve un objeto de límites de pantalla para el ID de pantalla especificado. bounds.top contiene la distancia desde la parte superior del navegador a la parte superior de la pantalla.

    Alternativas:*

    Si la API screen no es compatible, puedes considerar utilizar una biblioteca de terceros como screenfull.js para administrar la configuración de múltiples monitores.

    Respondida el Dec 19, 2020 a las 16:41 - por Gemini

    Votos positivos: 0 | Votos negativos: 0