Window 大小和滾動

JAVASCRIPT.INFO

Window 大小和滾動

JavaScript 要取得網頁 windows 寬度和高度有兩種方式:

  • document.documentElement.clientWidthdocument.documentElement.clientHeight,這裡傳回的值是不含視窗捲軸的真正尺度。
  • window.innerWidthwindow.innerHeight,這裡傳回的值是包含視窗捲軸的尺度。

這兩種值在手機上大多是一樣的,因為手機的捲軸是覆蓋在頁面一側的,而且僅有在滾動時才顯現,但在桌面上就會依照作業系統或瀏覽器的不同的得到不同的結果,在 Safari 上,因為捲軸也是設計成和手機一樣,所以兩種方式也會得到相同的尺度,但一旦插上滑鼠 macOS 就會把捲軸的形式改為佔有固定寬度的形式,其它作業系統對捲軸也是各有各的樣式,所以一旦誤用了 window.innerWidth,那麼最後計算出的尺度就可能會有偏差,最常見的就是原本不會有的水平捲軸卻出現的狀況。

除了 JavaScript,CSS 也會遇到類似的問題,比較新的寬高單位 vw / vh / vmin / vmax 都是包含捲軸的尺度,100vw 用下去很容易就會發生頁面寬度超出 viewport 寬度的現象,因為假設 100vw 拿到的是 1000px 的款度,頁面內又用 100vw 把它撐滿,但實際上扣掉捲軸的寬度後,真正 viewport 剩下的只有 985px,導致原本以為會玩玩美美的撐滿版面的設計,變成超出一點點出現水平捲軸的破版設計。對於上面的例子,比較好的方法是用 100% 代替 100vw,百分比的基礎就是父容器的寬度,如果父容器是 <html>,那就會得到 viewport 真正的寬度。