iframe的內容增高或縮減時設置其iframe的高度的處理方案


  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即可。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM