pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

網頁設計技巧:iframe自適應高度

可能有人還沒接觸到這個問題過,先說明一下,什么是自適應高度吧。所謂iframe自適應高度,就是,基于界面美觀和交互的考慮,隱藏了iframe的border和scrollbar,讓人看不出它是個iframe。如果iframe始終調用同一個固定高度的頁面,我們直接寫死iframe高度就可以了。而如果iframe要切換頁面,或者被包含頁面要做DOM動態操作,這時候,就需要程序去同步iframe高度和被包含頁的實際高度了。

順便說下,iframe在迫不得已的時候才去用,它會給前端開發帶來太多的麻煩。

傳統做法大致有兩個:

方法一,在每個被包含頁在本身內容加載完畢之后,執行JS取得本頁面的高度,然后去同步父頁面的iframe高度。

方法二,在主頁面iframe的onload事件中執行JS,去取得被包含頁的高度內容,然后去同步高度。

在代碼維護角度考慮,方法二是優于方法一的,因為方法一,每個被包含頁都要去引入一段相同的代碼來做這個事情,創建了好多副本。

兩個方法都只處理了靜的東西,就是只在內容加載的時候執行,如果JS去操作DOM引起的高度變化,都不太方便。

如果在主窗口做一個Interval,不停的來獲取被包含頁的高度,然后做同步,是不是即方便,又解決了JS操作DOM的問題了呢?答案是肯定的。

Demo頁面:主頁面 iframe_a.html ,被包含頁面 iframe_b.htm 和 iframe_c.html

主頁面代碼示例:

<iframe id="frame_content" src="iframe_b.html" scrolling="no" frameborder="0"></iframe><script type="text/javascript">

function reinitIframe(){

var iframe = document.getElementById("frame_content");

try{

iframe.height = iframe.contentWindow.document.documentElement.scrollHeight;

}catch (ex){}

}

window.setInterval("reinitIframe()", 200);

< /script>一直執行,效率會不會有問題?

我做了測試,同時開5個窗口(IE6、IE7、FF、Opera、Safari)執行這個代碼,不會對CPU有什么影響,甚至調整到2ms,也沒影響(基本維持在0%占用率)。

下面談談各瀏覽器的兼容性問題,如何獲取到正確的高度,主要是對body.scrollHeight和documentElement.scrollHeight兩個值得比較。注意本文用的是這個doctype,不同的doctype應該不會影響結果,但是假如你的頁面沒有申明doctype,那還是先去加一個吧。

< !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">在主頁面追加以下測試代碼,以輸出這兩個值,代碼示例:

<div><button>Check Height</button></div><script type="text/javascript">

function checkHeight() {

var iframe = document.getElementById("frame_content");

var bHeight = iframe.contentWindow.document.body.scrollHeight;

var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;

alert("bHeight:" + bHeight + ", dHeight:" + dHeight);

}

< /script>被加載頁面,可以切換一個絕對定位的層,來使頁面高度動態改變。如果層展開,則會撐高頁面高度。代碼示例:

<div><button>Toggle Overlay</button>

< /div>

< div style="height:160px;position:relative">

< div id="overlay" style="position:absolute;width:280px;height:280px;display:none;"></div>

< /div>

< script type="text/javascript">

function toggleOverlay() {

var overlay = document.getElementById('overlay');

overlay.style.display = (overlay.style.display == 'none') ? 'block' : 'none';

}

< /script>下面列出以上代碼在各瀏覽器的測試值:

(bHeight = body.scrollHeight, dHeight = documentElement.scrollHeight, 紅色 = 錯誤值, 綠色 = 正確值)

/ 層隱藏時 層展開時

bHeight dHeight bHeight dHeight

IE6 184 184 184 303

IE7 184 184 184 303

FF 184 184 184 303

Opera 181 181 300 300

Safari 184 184 303 184

暫且無視Opera比別人少3像素的問題…可以看出,如果沒有絕對定位的東西,兩個值是相等的,取哪個都無所謂。

但是如果有,那么各個瀏覽器的表現不太相同,單取哪個值都不對。但可以找到了一條規律,那就是取兩個值得最大值可以兼容各瀏覽器。所以我們的主頁面代碼就要改造成這樣了:

function reinitIframe(){var iframe = document.getElementById("frame_content");

try{

var bHeight = iframe.contentWindow.document.body.scrollHeight;

var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;

var height = Math.max(bHeight, dHeight);

iframe.height = height;

}catch (ex){}

}

window.setInterval("reinitIframe()", 200);這樣子,基本解決了兼容性問題。順便說下,不光絕對定位的層會影響到值,float也會導致兩個值的差異。

如果你演示Demo后,會發現,除了IE,其他瀏覽器中,當層展開后再隱藏,取到的高度值還是維持在展開的高度303,而非隱藏回去的真正值184,就是說長高了之后縮不回去了。這個現象在不同被包含頁面之間做切換也會發生,當從高的頁面切換到矮頁面的時候,取到的高度還是那個高的值。

可以歸納為,當iframe窗體高度高于文檔實際高度的時候,高度取的是窗體高度,而當窗體高度低于實際文檔高度時,取的是文檔實際高度。因此,要想辦法在同步高度之前把高度設置到一個比實際文檔低的值。所以,在iframe的添加 onload=”this.height=100″,讓頁面加載的時候先縮到足夠矮,然后再同步到一樣的高度。

這個值,在實際應用中決定,足夠矮但又不能太矮,否則在FF等瀏覽器里會有很明顯的閃爍。DOM操作的時候主頁面無法監聽到,只能DOM操作完了之后把高度變小了。

在我的一個實際項目中,在成本和收益之間權衡,我并沒有做這個事情,因為每個DOM函數中都要插入這個代碼,代價太高,其實層縮回去不縮掉也不是那么致命。包括Demo里,也沒有去做這個事情。如果讀者有更好的方法,請告訴我。

這是最終的主頁面的代碼:

<iframe id="frame_content" src="iframe_b.html" scrolling="no" frameborder="0"></iframe>

< script type="text/javascript">

function reinitIframe(){

var iframe = document.getElementById("frame_content");

try{

var bHeight = iframe.contentWindow.document.body.scrollHeight;

var dHeight = iframe.contentWindow.document.documentElement.scrollHeight;

var height = Math.max(bHeight, dHeight);

iframe.height = height;

}catch (ex){}

}

window.setInterval("reinitIframe()", 200);

< /script>

【網站聲明】本站除付費源碼經過測試外,其他素材未做測試,不保證完整性,網站上部分源碼僅限學習交流,請勿用于商業用途。如損害你的權益請聯系客服QQ:2655101040 給予處理,謝謝支持。

相關文檔推薦

這篇文章給大家詳細介紹了HTML頁面跳轉及參數傳遞問題,需要的朋友參考下吧
這篇文章主要介紹了純css實現照片墻3D效果的示例代碼,可以實現鼠標經過圖片實現改變,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本篇文章主要介紹了純 Css 繪制扇形的方法示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
本篇文章主要介紹了一份純CSS loading效果代碼示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
這篇文章主要介紹了css 實現文字過長自動隱藏功能,需要的朋友可以參考下
本篇文章主要介紹了詳解CSS3 rem(設置字體大小) 教程,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
主站蜘蛛池模板: 聚合氯化铝-碱式氯化铝-聚合硫酸铁-聚氯化铝铁生产厂家多少钱一吨-聚丙烯酰胺价格_河南浩博净水材料有限公司 | 高硼硅玻璃|水位计玻璃板|光学三棱镜-邯郸奥维玻璃科技有限公司 高温高压釜(氢化反应釜)百科 | led全彩屏-室内|学校|展厅|p3|户外|会议室|圆柱|p2.5LED显示屏-LED显示屏价格-LED互动地砖屏_蕙宇屏科技 | 找培训机构_找学习课程_励普教育| 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 对辊式破碎机-对辊制砂机-双辊-双齿辊破碎机-巩义市裕顺机械制造有限公司 | 工控机,嵌入式主板,工业主板,arm主板,图像采集卡,poe网卡,朗锐智科 | 氧化锆纤维_1800度高温退火炉_1800度高温烧结炉-南京理工宇龙新材料股份有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | nalgene洗瓶,nalgene量筒,nalgene窄口瓶,nalgene放水口大瓶,浙江省nalgene代理-杭州雷琪实验器材有限公司 | 真空泵厂家_真空泵机组_水环泵_旋片泵_罗茨泵_耐腐蚀防爆_中德制泵 | 免费B2B信息推广发布平台 - 推发网 | 内六角扳手「厂家」-温州市威豪五金工具有限公司 | 上海平衡机-单面卧式动平衡机-万向节动平衡机-圈带动平衡机厂家-上海申岢动平衡机制造有限公司 | ph计,实验室ph计,台式ph计,实验室酸度计,台式酸度计 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 北京普辉律师事务所官网_北京律师24小时免费咨询|法律咨询 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 环氧树脂地坪漆_济宁市新天地漆业有限公司 | 细石混凝土泵_厂家_价格-烟台九达机械有限公司 | 瑞典Blueair空气净化器租赁服务中心-专注新装修办公室除醛去异味服务! | uv机-uv灯-uvled光固化机-生产厂家-蓝盾机电 | 强效碱性清洗剂-实验室中性清洗剂-食品级高纯氮气发生器-上海润榕科学器材有限公司 | 深圳公司注册-工商注册公司-千百顺代理记账公司 | 猎头招聘_深圳猎头公司_知名猎头公司| 安全光栅|射频导纳物位开关|音叉料位计|雷达液位计|两级跑偏开关|双向拉绳开关-山东卓信机械有限公司 | 高温链条油|高温润滑脂|轴承润滑脂|机器人保养用油|干膜润滑剂-东莞卓越化学 | 中医中药治疗血小板减少-石家庄血液病肿瘤门诊部 | PVC快速门-硬质快速门-洁净室快速门品牌厂家-苏州西朗门业 | 食品级焦亚硫酸钠_工业级焦亚硫酸钠_焦亚硫酸钠-潍坊邦华化工有限公司 | PTFE接头|聚四氟乙烯螺丝|阀门|薄膜|消解罐|聚四氟乙烯球-嘉兴市方圆氟塑制品有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 磁力抛光研磨机_超声波清洗机厂家_去毛刺设备-中锐达数控 | 北京网站建设-企业网站建设-建站公司-做网站-北京良言多米网络公司 | 齿辊分级破碎机,高低压压球机,立式双动力磨粉机-郑州长城冶金设备有限公司 | 渣油泵,KCB齿轮泵,不锈钢齿轮泵,重油泵,煤焦油泵,泊头市泰邦泵阀制造有限公司 | 防爆型气象站_农业气象站_校园气象站_农业四情监测系统「山东万象环境科技有限公司」 | 首页-恒温恒湿试验箱_恒温恒湿箱_高低温试验箱_高低温交变湿热试验箱_苏州正合 | 阀门智能定位器_电液动执行器_气动执行机构-赫尔法流体技术(北京)有限公司 | 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 |