亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > HTML > 正文

網頁制作技巧教程:iframe自適應高度

2024-08-26 00:16:50
字體:
來源:轉載
供稿:網友

武林網(www.49028c.com)文章簡介:可能有人還沒接觸到這個問題過,先說明一下,什么是自適應高度吧。所謂iframe自適應高度,就是,基于界面美觀和交互的考慮,隱藏了iframe的border和scrollbar,讓人看不出它是個iframe。如果iframe始終調用同一個固定高度的頁面,我們直接寫死iframe高度就可以了。而如

通過Google搜索iframe 自適應高度,結果5W多條,搜索iframe 高度自適應,結果2W多條。
我翻了前面的幾十條,刨去大量的轉載,有那么三五篇是原創的。而這幾篇原創里面,基本上只談到如何自適應靜的東西,就是沒有考慮到JS操作DOM之后,如何做動態同步的問題。另外,在兼容性方面,也研究的不徹底。

這篇文章,希望在這兩個方面再做一些深入。

可能有人還沒接觸到這個問題過,先說明一下,什么是自適應高度吧。所謂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" "">在主頁面追加以下測試代碼,以輸出這兩個值,代碼示例:

<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>

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
性欧美xxxx交| 亚洲精品黄网在线观看| 狠狠爱在线视频一区| 欧美日韩国产一区二区| 久久久精品在线| 在线视频一区二区| 亚洲一区二区三区四区视频| 亚洲缚视频在线观看| 日本久久精品视频| 成人免费网站在线看| 久久久中文字幕| 久久久久久高潮国产精品视| 国产一区二区久久精品| 久色乳综合思思在线视频| 国产日韩在线免费| 久久av在线看| 国产做受69高潮| 欧美日韩中文在线| 国产精品2018| 伊人亚洲福利一区二区三区| 国产91精品久久久久久| 日本不卡高字幕在线2019| 亚洲欧美国产精品va在线观看| 亚洲网站在线播放| 欧美—级a级欧美特级ar全黄| 一区二区三区天堂av| 国产精品久久久久久久久久久久久| 亚洲成人三级在线| 亚洲女人被黑人巨大进入al| 成人黄色在线观看| 91极品视频在线| 久久精品最新地址| 国产精品免费视频久久久| 日韩av在线免费观看| 深夜福利91大全| 国产精品黄色影片导航在线观看| 日韩av一区在线| 国产亚洲人成a一在线v站| 日韩高清有码在线| 中文字幕不卡av| 日韩欧美在线视频观看| 国产不卡精品视男人的天堂| 蜜臀久久99精品久久久无需会员| 久久久精品电影| 91在线视频成人| 国产伦精品一区二区三区精品视频| 欧美中文字幕在线| 亚洲精品自产拍| 亚洲欧美成人网| 国产精品旅馆在线| 欧美亚洲视频一区二区| 亚州欧美日韩中文视频| 亚洲第一网站男人都懂| 国产原创欧美精品| 欧美洲成人男女午夜视频| 欧美激情日韩图片| 国产免费一区二区三区在线观看| 日韩av免费在线观看| 久久视频国产精品免费视频在线| 国产91热爆ts人妖在线| 成人黄色片网站| 日韩电视剧在线观看免费网站| 欧美又大粗又爽又黄大片视频| 日韩精品福利网站| 色小说视频一区| 久久国内精品一国内精品| 日韩精品小视频| 亚洲色在线视频| 国产精品一二三在线| 亚洲国语精品自产拍在线观看| 亚洲精品国产成人| 91精品在线影院| 久久精品久久久久| 色偷偷偷亚洲综合网另类| 国产亚洲a∨片在线观看| 国产精品成人aaaaa网站| 91在线看www| 91九色国产在线| 国模精品系列视频| 亚洲国产精品999| 国内外成人免费激情在线视频| 欧美自拍视频在线观看| 青青在线视频一区二区三区| 亚洲精品97久久| 国产女精品视频网站免费| 国产精品h片在线播放| 欧美在线视频免费观看| 久久夜色精品亚洲噜噜国产mv| 2023亚洲男人天堂| 久久久噜噜噜久噜久久| 亚洲人成绝费网站色www| 国产+成+人+亚洲欧洲| 尤物九九久久国产精品的分类| 国自产精品手机在线观看视频| 亚洲欧美激情精品一区二区| 亚洲欧美在线免费| 日韩欧美国产免费播放| 日韩欧美成人网| 中文字幕欧美专区| 欧美激情综合色综合啪啪五月| 亚洲美腿欧美激情另类| 日韩欧美亚洲成人| 亚洲美女又黄又爽在线观看| 国产成人精品电影久久久| 亚洲欧美日韩久久久久久| 91成人在线视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产一区二区三区在线看| 国产成人精品视| 久久国产精品网站| 亚洲性猛交xxxxwww| 欧美精品激情在线观看| 亚洲欧美日韩视频一区| 高跟丝袜欧美一区| 3344国产精品免费看| 91视频免费在线| 中文字幕久久亚洲| 日韩欧美精品免费在线| 蜜月aⅴ免费一区二区三区| 久久久久久亚洲精品中文字幕| 国产精品九九久久久久久久| 国产丝袜一区视频在线观看| 日本中文字幕久久看| 日韩欧美第一页| 国产91精品久久久久久| 亚洲第一区第二区| 欧美色图在线视频| 欧美巨乳美女视频| 欧美小视频在线观看| 92国产精品视频| 成人黄色午夜影院| 欧美精品成人在线| 成人乱人伦精品视频在线观看| 日韩av一区二区在线观看| 欧美性xxxxhd| 国产精品综合不卡av| 欧美激情按摩在线| 欧美日韩国产精品一区二区不卡中文| 爽爽爽爽爽爽爽成人免费观看| 色偷偷91综合久久噜噜| 一区二区三区黄色| 国内偷自视频区视频综合| 欧美亚洲国产另类| 欧美一级视频一区二区| 欧美人交a欧美精品| 国产亚洲欧美日韩美女| 国产精品丝袜白浆摸在线| 国产精品久久一区主播| 亚洲石原莉奈一区二区在线观看| 一区二区三区精品99久久| 成人国产精品色哟哟| 久久99国产精品自在自在app| 色综合天天狠天天透天天伊人| 久久999免费视频| 欧美国产在线电影| 国产一区二区三区在线免费观看| 91超碰caoporn97人人| 国产999在线观看| 久久综合免费视频| 粉嫩老牛aⅴ一区二区三区| 中文字幕亚洲无线码在线一区| 国产精品高清在线观看| 亚州精品天堂中文字幕| 国产精品美女午夜av|