iframe子頁面position的fixed


前言:

首先說一說我昨天天的苦逼經歷。中午吃飯時一同事跟我說,他做的項目嵌套iframe后,子頁面的position設置fixed失效了。

經過反復詢問,得知他用了兩層iframe,再加上最外的父頁面,一共就是三層。驚恐

下午就其iframe子頁面固定定位問題進行處理,上網找了各種解決方案:插件、js模擬等效果均不理想。頁面不是代碼過多就是效果卡頓、跳動(附:博主的同事架構的頁面是用於手機微信端,部分PC端的優秀代碼並不適用,非代碼不行)。無奈之下只得另想出路,最終功能完美實現,現拿出來與大家共享。

BUG: 

現有父頁面A,子頁面B,B頁面制作了一個底部菜單,設置position:fixed;bottion:0;單獨打開子頁面B,底部菜單始終定位底部,不隨頁面滾動條滾動。在父頁面A中,采用iframe映入頁面B,google瀏覽器打開父頁面A,菜單可以定位底部微笑;google瀏覽器手機調試模式打開父頁面A,菜單可以定位底部Android手機微信打開父頁面A,菜單可以定位底部羡慕;iPhone手機微信打開父頁面A,菜單未定位在頁面底部,而是始終位於B頁面內容的末尾

看到這,博主心都碎了,平時比垃圾還垃圾的Android,今天這么給力,倒是平時牛皮哄哄的iPhone,今天使出了這么大一個絆子。沒辦法,應下來的事,還要想辦法改呀……

iframe原理:

我們首先准備一枝筆及一張A4白紙,這只筆就好比我們的父頁面,白紙好比子頁面。固定住筆並將白紙放於筆下,來回拖動白紙。無論我們怎么拖動,白紙的高度始終都是A4紙張的高度。所以,相對底部的菜單,就永遠在子頁面的底部。

那么,,,如果我們把A4白紙卷起來呢?這時子頁面的高度就不再是A4白紙的高度了,由於底部菜單是定位在子頁面的相對底部,這時底部菜單就位於了A4白紙折疊后高度的最底。

那么,所謂的卷起A4紙,其實就等於給子頁面B一個新的高度,超出部分,用滾動條滾動顯示。

解決方案:

知道了導致問題的原因,接下來就是解決了。


博主的小demo父頁面很簡單,就是最基本的iframe加載頁面

 

[html]  view plain  copy
 
 print?
  1. <style>  
  2.     html,body,iframe{margin:0px;padding:0px;border:0px;width:100%;height:100%;}  
  3.     #navbar{background:url(http://www.yxccc.com/logo.png) no-repeat left center;}
  4. </style>  
  5. <iframe src="demo.html" scrolling="No"></iframe>  


子頁面被撐起的是一個class為bottom的div

 

 

[html]  view plain  copy
 
 print?
  1. <style>  
  2. .content{  
  3. <span style="white-space:pre">    </span>overflow:auto;//滾動條就靠它了  
  4. <span style="white-space:pre">    </span>width: 100%;  
  5. <span style="white-space:pre">    </span>position: absolute;  
  6. }  
  7. .bottom{  
  8. <span style="white-space:pre">    </span>position: fixed;  
  9. <span style="white-space:pre">    </span>bottom: 0px;  
  10. <span style="white-space:pre">    </span>width: 100%;  
  11. <span style="white-space:pre">    </span>height: 40px;  
  12. <span style="white-space:pre">    </span>line-height: 40px;  
  13. <span style="white-space:pre">    </span>text-align: center;  
  14. <span style="white-space:pre">    </span>background-color:#eee;  
  15. <span style="white-space:pre">    </span>color: #fff;  
  16. <span style="white-space:pre">    </span>font-size: 14px;  
  17. <span style="white-space:pre">    </span>z-index: 99;  
  18. }  
  19. </style>  
[html]  view plain  copy
 
 print?
  1. <pre name="code" class="html"><body>  
  2.     <div class="content">  
  3.         <div>撐起高度的div</div>  
  4.         <div class="bottom">菜單</div>  
  5.     </div>  
  6. </body>  
 
        
 
        

撐起頁面的代碼,讀者可自行添加

 

接下來就是兩段很關鍵的js方法了

 

[html]  view plain  copy
 
 print?
  1. /**滾動條高**/  
  2. function getWindowScrollTop(win){  
  3.     var scrollTop=0;   
  4.     if(win.document.documentElement&&win.document.documentElement.scrollTop){  
  5.         scrollTop=win.document.documentElement.scrollTop;  
  6.     }else if(win.document.body){   
  7.         scrollTop=win.document.body.scrollTop;}return scrollTop;  
  8.     }  
  9.     return scrollTop;  
  10. }  
  11. /**獲取**/  
  12. function getWindowHeight(win){  
  13.     var clientHeight=0;  
  14.     if(win.document.body.clientHeight&&win.document.documentElement.clientHeight){  
  15.         clientHeight = (win.document.body.clientHeight<win.document.documentElement.clientHeight)?win.document.body.clientHeight:win.document.documentElement.clientHeight;  
  16.     }else{  
  17.         clientHeight = (win.document.body.clientHeight>win.document.documentElement.clientHeight)?win.document.body.clientHeight:win.document.documentElement.clientHeight;  
  18.     }  
  19.     return clientHeight;  
  20. }  
 
        
 
        
 
        

 

最后為子頁面附上高度,,使其滾動條顯露出來

 

[javascript]  view plain  copy
 
 print?
  1. $(function(){  
  2.     var H = parseInt(getWindowHeight(top))+parseInt(getWindowScrollTop(top)) - 40;//此處的40是class為bottom的div元素高  
  3.     $(".content").css("height",H + "px");  
  4. });  


倒入jq插件,至此頁面無論在iphone或android,底部的菜單定位問題都得到了完美解決。代碼簡單好用,博主表示很開心大笑


免責聲明!

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



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