前端中 width 的獲取

来源:http://www.cnblogs.com/JuFoFu/archive/2017/10/23/7719679.html
-Advertisement-
Play Games

這篇文章其實是在瞭解 viewport 的過程中發現這些概念容易混淆做了個小小的總結。viewport的首要關鍵是寬度的獲取,寬度的計算有下麵幾個屬性和方法: clientWidth offsetWidth innerWidth scrollWidth getBoundingClientRect() ...


這篇文章其實是在瞭解 viewport 的過程中發現這些概念容易混淆做了個小小的總結。viewport的首要關鍵是寬度的獲取,寬度的計算有下麵幾個屬性和方法:

  • clientWidth
  • offsetWidth
  • innerWidth
  • scrollWidth
  • getBoundingClientRect().width

Element.clientWidth

非行內元素的內部寬度(inner width of an element),包括 padding,不包括 margin 和 border。行內元素獲取的值一直是 0,值為整數,小數四捨五入(round the value to an integer),屬性為只讀。

HTMLElement.offsetWidth

獲取元素外圍寬度(layout width of an element),包括 padding,border 以及滾動條,不包括 margin。同樣是整數以及只讀。
註:這裡可以看到一個是 Element 的屬性,一個是 HTMLElement 的屬性,HTMLElement 繼承於 Element,Element 不僅包括 html 元素,還有其他像 XML 之類的能在網頁上展示的元素。可見 clientWidth 應用範圍更廣,這裡暫時不作區別。

Window.innerWidth

innerWidth 屬於 window 對象,包括了 window, frame, frameset, secondary window(二級視窗,這個不知道是啥),和元素無關,獲取的是 window 的寬度,包括了滾動條,屬性只讀。

Window.outerWidth

獲取的是瀏覽器外部寬度,這個對於頁面渲染來說意義不大。包括了所有的瀏覽器元素,例如標題欄之類的。在 iphone 6sp 上測試值為0。screen.width 和這個值結果類似,在 iphone 6sp上正常。

Element.scrollWidth

當元素內部內容沒有超出時,和 clientWidth 類似,獲取的是元素的內容寬度,包括 padding。當內容(包括所有子元素,不過)溢出時,會把溢出內容的寬度計算進去,就算設置的 overflow 為 hidden,不過溢出內容需要是有效內容,display 為 none 或者沒有內容只設置了寬度的元素是不會計算入內的。

Element.getBoundingClientRect()

這個方法不是專門返回元素寬度的,返回的是一個 DOMRect 對象:

{
    bottom:-75
    height:160
    left:88
    right:248
    top:-235
    width:160
    x:88
    y:-235
}

除了 winth 和 height 外,其他值相對於 viewport。寬高計算類似 offsetWidth,包括 padding,border,不包括 margin。MDN 上說 Empty border-boxes are completely ignored. 不過不知道什麼是 Empty border-boxes,測試出來的結果都是不為0 的,行內元素也能夠獲取寬度。x,y,left,right 的值是相對於 viewport 獲取的,即頁面滾動時會有所影響。
getBoundingClientRect() 的計算會更常用於輪播等一些js組件中,因為他的結果不是整數,有小數結果,更加準確。

相容性:
1、IE8 及更低沒有返回 width 和 height。
2、IE 和 Edge 返回的內容不包括 x 和 y 屬性。



本文來源:JuFoFu

本文地址:http://www.cnblogs.com/JuFoFu/p/7719679.html

水平有限,錯誤歡迎指正,轉載請註明出處。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近火的不能再火的日誌框架就是ELK,其中E(Elasticsearch)表示日誌存儲,L(Logstash)表示日誌收集,K(kibana)表示日誌的UI界面,用來查詢和分析,而其中的L可以使用Fluentd來代替,並且以上架構都可以通過docker來進行快速的部署。 它們的工作流程 fluent ...
  • 本文帶來一個垂直方向的手風琴插件開發,可以定製的功能如下: 調用方法: 效果預覽: 效果預覽: 完整的手風琴插件代碼: html部分: 1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <!--作者:ghostwu(吳華)--> 5 <meta char ...
  • 本文來源於多年的 JavaScript 編碼技術經驗,適合所有正在使用 JavaScript 編程的開發人員閱讀。本文的目的在於幫助大家更加熟練的運用 JavaScript 語言來進行開發工作。 ...
  • 最近自己在學習Vue.js,在看一些課程的時候可能Vue更新太塊了導致課程所講知識和現在Vue的版本不符,從而報錯,我會在以後的帖子持續更新Vue的變化與更新,大家也可以一起交流,共同監督學習! 1.關於Vue中$index獲取索引值已經取消,多用於多個元素的操作,像ul中的li,通過v-for來建 ...
  • 轉載博客園jiangxiaobo,最近需要接觸vue方面的東西. 方法與事件處理器 方法處理器 可以用 v-on 指令監聽 DOM 事件: 我們綁定了一個單擊事件處理器到一個方法 greet。下麵在 Vue 實例中定義這個方法: 內聯語句處理器 除了直接綁定到一個方法,也可以用內聯 JavaScri ...
  • 棧(stack)和堆(heap) stack為自動分配的記憶體空間,它由系統自動釋放;而heap則是動態分配的記憶體,大小不定也不會自動釋放。 基本類型和引用類型 基本類型:存放在棧記憶體中的簡單數據段,數據大小確定,記憶體空間大小可以分配。 基本數據類型有Undefined、Null、Boolean、Nu ...
  • 最近幾個舊項目里使用的圖片編輯插件出現Bug, 經Review 後確定需要在其內外均做些改動,但是頭疼的發現部分頁面里的JavaScript 代碼被冗餘了NN次。部分新同事堆疊了大量的過程式的腳本塊(幾乎沒有利用面向對象封裝的概念-雖然面向對象也按需擇時),改起來挺累(而且幾個項目里各自不同)。本身... ...
  • 寫在前面 國慶整理資料時,發現剛開始入門前端時學習JS 的資料,打算以一個基礎入門博客記錄下來,有不寫不對的多多指教; 先推薦些書籍給需要的童鞋 《JavaScript 高級程式設計.pdf》第三版 《JavaScript權威指南(第六版).pdf》 《高性能javascript.pdf》 《Jav ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...