方向更改事件后,Chrome iOS 87.0.4280.77 中的 window.innerWidth 不正确

Wil*_*ill 5 javascript google-chrome orientation-changes ios

Chrome iOS 87.0.4280.77 上的 window.innerWidth 在方向更改事件后似乎不正确。在 iPhone 上查看时,初始加载时,innerWidth 为 414px。将手机方向更改为横向然后再返回纵向后,innerWidth 变为 326px。

我还使用https://whatismyviewport.com检查了内部宽度,它显示了与我的代码相同的内部宽度值。

初始负载时,方向改变之前

方向更改为横向并返回纵向后

<html>
<head>
   <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
</head>
<body>

<script type="text/javascript">
    alert("innerWidth1:"+window.innerWidth);  // initial innerwidth before orientation change

    window.addEventListener('orientationchange', function() {
        alert("innerWidth2:"+window.innerWidth);  // innerwidth after orientation change
    });

</script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

以前有其他人遇到过这个问题吗?

谢谢

A H*_*rth 4

当orientationChange函数运行时,window.innerWidth读数似乎没有改变,但是如果我们设置超时并再次读取它,它就会改变为预期值。

在此片段中设置暂停以查看效果。请注意(至少在 iPad 上 IOS14.2 上的 Safari 上)0 毫秒的暂停足以强制重新评估 innerWidth。

我试图找到这种行为的官方文档,但到目前为止还没有成功,尽管有很多讨论。就好像系统必须“重新绘制”窗口,并在这样做时找出实际的内部宽度。不管怎样,一个实际的解决方法似乎是引入 setTimeout,也许“以防万一”暂停 1 毫秒而不是 0 毫秒(我过去见过 Firefox 在某些系统上不会在 0 毫秒时触发重绘)。此外,requestAnimationFrame 也没有获得正确的宽度。

    <html>
    <head>
       <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
    </head>
    <body>
    <div id="info"></div>
    Pause: <button onclick="pause = 10000">10000</button>  <button onclick="pause = 10">10</button>  <button onclick="pause = 0">0</button>
    <script type="text/javascript">
        const info = document.getElementById('info');
        let pause = 10000; //number of ms to wait before read innerHTML again
        
        info.innerHTML = "innerWidth1:"+window.innerWidth;  // initial innerwidth before orientation change

        window.addEventListener('orientationchange', function() {
            info.style.color = 'red';
            info.innerHTML = "innerWidth on orientation change before pause:"+window.innerWidth;
            setTimeout(function() {info.style.color = 'blue';
                info.innerHTML = "innerWidth after orientation change and a pause of: " + pause + 'ms ' + window.innerWidth}, pause);  // innerwidth after orientation change
               });

    </script>

    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)