WEB管理軟件往往是如下結構的
用戶點擊子頁tab切換中部的顯示內容,在切換過程中需要保證前面的子頁保持先前的狀態。這種情況一般都使用iframe來來作為切換的子頁顯示內容。
但是這里有一個問題,iframe不能做高度(height)的自適應。理想狀態是當iframe高度超過中部內容顯示區的高度的時候iframe自動增高,這樣主頁面會出現滾動條來做適應。處理方式即不斷計算iframe內部元素高度設置iframe
所以計算iframe里面的內容的高度便是關鍵(兼容IE8+)。
首先,不能使用文檔document的高度,因為document的高度可能不是iframe里面的內容的真實高度(當body的高度小於iframe的window高度的時候,document的高度實際上是window的高度。)。而且一旦使用document的高度來設置iframe的高度,那么document的高度只會增加不會減少(當設置了iframe的高度后,那么無論iframe里面的內容如何變動,iframe的document的高度就會至少是iframe的高度),那么將導致iframe越來越高。所以這里使用body的高度(參考關於瀏覽器window、document、html、body高度的探究)來計算iframe內容的高度。
其次,使用body的高度后,那些脫離文檔流的元素則需要手動計算其撐開iframe的高度。計算方法是
脫離文檔流元素撐開iframe的高度 = 脫離文檔流元素的高度 + 脫離文檔流元素離文檔頂部的高度 + 離窗口底部的余留空間
然后計算每個脫離文檔流元素撐開的高度取其中最大的值再和body比較,取出最大的最終iframe內容高度值。
實現代碼如下(iframe中引用)
//供主頁面調用 //設置iframe高度 function setActiveIframeHeight(){ //計算iframe內容的高度 function getBodyHeight(){ var height = 0; if (document) { height = $(document.body).height();//Math.max(document.body.clientHeight,document.body.offsetHeight); //獲取iframe中顯示的脫離文檔流的元素 var panels = $('.page-shadow.active'), pHeight = 0; //計算其中最大的值 for(var i = 0; i < panels.length; i++){ //計算撐開iframe的高度 var panelContent = $(panels[i]), panelContentHeight = panelContent.height() + panelContent.offset().top + 50; pHeight = (panelContentHeight > pHeight)?panelContentHeight:pHeight; } height = (pHeight > height)?pHeight:height; } return height; } var curHeight = getBodyHeight(), //這里使用#right-content-test自適應來探測中部內容顯示區域的最小高度 minHeight = top.$('#right-content-test').height(), //獲取iframe元素 htmlDom = top.$('.tab-content>.active').find('iframe')[0]; curHeight = (minHeight >= curHeight) ? minHeight : curHeight; //top.activeIframeHeight記錄了當前的iframe的的高度 if(htmlDom && htmlDom.height != top.activeIframeHeight){ htmlDom.height = top.activeIframeHeight; } //防止臨界值導致滾動條時有時無使用Math.abs處理 if(setActiveIframeHeight.isFirst || (Math.abs(top.activeIframeHeight - curHeight) > 2)){ top.activeIframeHeight = curHeight; htmlDom && (htmlDom.height = top.activeIframeHeight); } setActiveIframeHeight.isFirst = 0; } setActiveIframeHeight.isFirst = 1;
間隔一段時間調用setActiveIframeHeight即可。