监听 orientationchange 以后立刻读 window.innerWidth,拿到的还是竖屏的宽度,布局要等下一次 resize 才对,切换瞬间会明显闪一下,用户一眼就能看到。第一次遇到会往复杂处想,其实漏掉的多是个小前提。

window.addEventListener('resize', () => {
  clearTimeout(t);
  t = setTimeout(applyLayout, 150);
});

orientationchange 在部分浏览器上比尺寸更新先触发,回调里拿到的还是旧视口,加个延迟或者改听 resize 才可靠。别在回调里直接算布局,先让它稳定下来。这一点先确认清楚,后面就不用反复试。

「orientationchange 取值」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。

改完隔一天再看一次,当场正常不代表能稳住。

具体做法是,回调里用 setTimeout 延迟一帧再读尺寸,别同步取,同步读到的多半是旧值;或者直接监听 resize,并在里面做一次防抖再重排,两个事件一起听更稳;读尺寸统一走 visualViewport,地址栏伸缩的干扰也一并绕开,别用两套来源。

改完照着核一遍,横竖屏切换后排版一次到位,不会出现先错位再纠正的闪动。

作者 9823189