日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

获取height固定折叠元素真实高度方法

發布時間:2025/4/5 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取height固定折叠元素真实高度方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

假設,DOM 被設置了 height:20px 和 overflow:hidden,如何計算它的真實高度呢?

一、問題背景

最近在優化折疊組件,需要在窗口寬度變化的時候重新判斷展開收起狀態。如果段落高度大于給定高度,則隱藏超高內容,展示【展開】按鈕。如果段落高度小于給定高度,則不限制最大高度,隱藏【展開】按鈕。

但如何計算【段落高度小于給定高度】呢?比如,段落被設置了 height="20px",如何計算它的真實高度呢?

二、干貨,計算元素真實高度函數

方法如下,直接傳入要計算的目標 dom 就好了。

function getHeightUnfold (dom) {var fakeNode = dom.cloneNode(true);fakeNode.style.position = 'absolute';// 先插入再改樣式,以防元素屬性在createdCallback中被添加覆蓋dom.parentNode.insertBefore(fakeNode, dom);fakeNode.style.height = 'auto';fakeNode.style.visibility = 'hidden';var height = fakeNode.getBoundingClientRect().height;dom.parentNode.removeChild(fakeNode);return height; }

這個方法的核心是,創建一個不可見元素,摘除高度限制,最終計算它的高度。

三、發散思考

1. 復制元素的必要性

Jenny_L 給復制出來的元素增加了 postiion: absolute 屬性,為了不觸發后面元素的重拍重繪,節省瀏覽器資源。如果直接快速地給目標元素設置 height: auto + 獲取高度 + height: 20px,雖然能達到目的,但會造成所有后續元素的(不一定可見)抖動,盡量避免。

2. Node.cloneNode 與 document.createElement('div') 的選擇

后者與innerHTML配合使用,雖然能夠模仿目標元素的內層內容,但不能繼承目標元素的樣式。即使使用document.createElement(dom.nodeName)也會有問題,不能繼承內聯樣式。而使用cloneNode不但可以繼承 class,css,還能觸發 createdCallback(如果有的話),繼承 js 中添加的內聯樣式。

3. fakeNode.getBoundingClientRect().height 與 getComputedStyle(fakeNode).height 的選擇

都是計算高度的,但前者計算的是占位高度,包括 padding+border;后者計算的是單純高度,經過多層 css 優先級競爭之后的 height 取值(px),獲取純數值還需要parseInt()。本次情況,需要計算占位高度,所以選擇getBoundingClientRect()

4. removeChild 的必要性

雖然 fakeNode 不可見,但終究在文檔流中,display 不是 none,重拍的時候會參與計算。除此之外,如果原先 dom 帶有 id="someID" 的話,刪除 fakeNode 之前,文檔中就會存在兩個 id="someID" 的元素。未來瀏覽器再做選擇的時候,就懵逼了。

四、自勉

好久不寫文章了,草稿箱里存了好多代碼片段,要加油了。

不得不說,這種小代碼片段還是很有分享價值的,一次研究(竟然花了一個小時),未來處處復制,走向人生巔峰。

總結

以上是生活随笔為你收集整理的获取height固定折叠元素真实高度方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。