ナオユネット | WordpressとWEBデザインの参考書

スマホでwindow.loadでwindow.innerWidthを呼び出すと数値がおかしい

更新日: 2019-03-19

レスポンシブサイトを作る際、現在の画面幅(Viewportサイズ)で条件分岐させる事が少なくないと思いますが、スマホ等のモバイル端末でwindow.loadイベント発火時にwindow.innerWidthを取得すると、意図した数値と異なってしまう現象に遭遇しました。

原因

結論から言うと、ブラウザのスクロールバーの出現タイミングや、レンダリングの完了状態がloadイベントの直後と重なり、正確な幅が算出できていないケースがほとんどです。

解決策: setTimeoutで遅延させる

直接呼び出すのではなく、微細な遅延を入れることで解決できます。


window.addEventListener('load', function() {
    setTimeout(function() {
        var width = window.innerWidth;
        console.log(width);
    }, 100);
});
            

このように処理を少し送らせることで、ブラウザ側の計算が完了し、正しい数値を拾うことが可能です。

注意点

画面幅の取得はresizeイベントでも頻繁に行うため、関数の共通化を行い、呼び出し元に注意を払うことが重要です。