日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

完美解決IE6不支持position:fixed的bug

 看見就非常 2013-02-08

  廢話不多說,先看一下下面這段代碼:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>IE6 position:fixed bug</title>
<style>
*{padding:0;margin:0}
p{height:2000px}
#gs{border:1px solid #000;position:fixed;right:30px;top:120px}
</style>
<!--[if IE 6]>
<style type="text/css">
html{overflow:hidden}
body{height:100%;overflow:auto}
#gs{position:absolute}
</style>
<![endif]-->
</head>
<body>
<div id="rightform">
    <p>11111111111111111</p>
    <input id="gs" name="gs" type="text" value=""  />
</div>
</body>
</html>

  以上這段代碼在網(wǎng)上很常見,通過設(shè)置html{overflow:hidden}body{height:100%;overflow:auto}來實(shí)現(xiàn)ie6下position:fixed效果,但這種辦法有個(gè)缺陷,那就是:這會使頁面上原有的absolute、relation都變成fixed的效果,在這里我就不做demo了,如果有懷疑,可以自己去試驗(yàn)一下。

  于是我找了下資料,發(fā)現(xiàn)可以通過一條Internet Explorer的CSS表達(dá)式(expression)來完美的實(shí)現(xiàn)ie6下position:fixed效果,css代碼如下:

/* 除IE6瀏覽器的通用方法 */
.ie6fixedTL{position:fixed;left:0;top:0}
.ie6fixedBR{position:fixed;right:0;bottom:0}
/* IE6瀏覽器的特有方法 */
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft));top:expression(eval(document.documentElement.scrollTop))}
* html .ie6fixedBR{position:absolute;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)))}

  上面代碼可以直接使用了,如果要設(shè)置元素懸浮邊距,要分別為設(shè)置兩次,比如我要讓某個(gè)元素距頂部10個(gè)像素,距左部也是10個(gè)像素,那就要這樣子寫:

/* 除IE6瀏覽器的通用方法 */
.ie6fixedTL{position:fixed;left:10px;top:10px}
/* IE6瀏覽器的特有方法 */
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft+10));top:expression(eval(document.documentElement.scrollTop+10))}

  這樣一來,IE6下實(shí)現(xiàn)position:fixed的效果解決了,而且也不會影響到其他的absolute、relation,但還有一個(gè)問題,就是懸浮的元素會出現(xiàn)振動(dòng)

IE有一個(gè)多步的渲染進(jìn)程。當(dāng)你滾動(dòng)或調(diào)整你的瀏覽器大小的時(shí)候,它將重置所有內(nèi)容并重畫頁面,這個(gè)時(shí)候它就會重新處理css表達(dá)式。這會引起一個(gè)丑陋的“振動(dòng)”bug,在此處固定位置的元素需要調(diào)整以跟上你的(頁面的)滾動(dòng),于是就會“跳動(dòng)”。
解決此問題的技巧就是使用background-attachment:fixed為body或html元素添加一個(gè)background-image。這就會強(qiáng)制頁面在重畫之前先處理CSS。因?yàn)槭窃谥禺嬛疤幚鞢SS,它也就會同樣在重畫之前首先處理你的CSS表達(dá)式。這將讓你實(shí)現(xiàn)完美的平滑的固定位置元素!

  然后我發(fā)現(xiàn)background-image無需一張真實(shí)的圖片,設(shè)置成about:blank就行了。

  下面附上完整代碼

/* 除IE6瀏覽器的通用方法 */
.ie6fixedTL{position:fixed;left:0;top:0}
.ie6fixedBR{position:fixed;right:0;bottom:0}
/* IE6瀏覽器的特有方法 */
/* 修正IE6振動(dòng)bug */
* html,* html body{background-image:url(about:blank);background-attachment:fixed}
* html .ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft));top:expression(eval(document.documentElement.scrollTop))}
* html .ie6fixedBR{position:absolute;left:expression(eval(document.documentElement.scrollLeft+document.documentElement.clientWidth-this.offsetWidth)-(parseInt(this.currentStyle.marginLeft,10)||0)-(parseInt(this.currentStyle.marginRight,10)||0));top:expression(eval(document.documentElement.scrollTop+document.documentElement.clientHeight-this.offsetHeight-(parseInt(this.currentStyle.marginTop,10)||0)-(parseInt(this.currentStyle.marginBottom,10)||0)))}

  至于demo我想大家都看到了吧:)

IE6完美兼容position:fixed
IE6完美兼容position:fixed
手機(jī)收藏該文章
作者:胡尐睿丶
如果你讀了我的文章,覺得有幫助,你可以選擇:支付寶贊助
本文版權(quán)歸作者和博客園共有,歡迎轉(zhuǎn)載,但未經(jīng)作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責(zé)任的權(quán)利。
標(biāo)簽: css, expression, position, fixed, 懸浮, ie6
8
2
(請您對文章做出評價(jià))
博主上一篇:【轉(zhuǎn)載】通過JS破解圖片防盜鏈限制
博主下一篇:借助Google Translate API實(shí)現(xiàn)網(wǎng)站多國語言翻譯功能
首頁上一篇:實(shí)例講解遺傳算法——基于遺傳算法的自動(dòng)組卷系統(tǒng)【實(shí)踐篇】
首頁下一篇:(譯)如何使用cocos2d制作一個(gè)打地鼠的游戲:(第二部分。完)
posted @ 2011-05-20 18:42 胡尐睿丶 閱讀(34189) 評論(38) 編輯 收藏
  
#1樓 2011-05-20 21:33 sxwgf  
這種方法用了expression,請教lz有不用expression的方法嗎?
  
#2樓[樓主] 2011-05-20 22:49 胡尐睿丶  
@sxwgf
不用expression就是我文章開頭那短代碼,設(shè)置html{overflow:hidden}和body{height:100%;overflow:auto},但這樣會造成頁面上所有absolute都變成fixed的效果,所以還是推薦用expression
  
#3樓 2011-05-21 07:21 劉覽器  
文章很有深度,簽定完畢。。。
  
#4樓 2011-05-21 09:52 john23.net  
恩學(xué)習(xí)了

  
#5樓 2011-05-21 10:57 鈞梓昊逑  
我認(rèn)為這不算是BUG
  
#6樓 2011-05-21 11:45 超級奶崽  
不錯(cuò)啊
  
#7樓 2011-05-21 12:17 賣身葬小強(qiáng)  
禁用javascript這段css表達(dá)式會不會失效?
  
#8樓[樓主] 2011-05-21 12:43 胡尐睿丶  
@賣身葬小強(qiáng)
這問題不錯(cuò),我沒測試過,應(yīng)該是會失效的,我沒考慮到,看來還是得留個(gè)備用方案,當(dāng)IE6在禁用js的情況下,采用我文章中的第一種辦法
  
#9樓 2011-05-21 21:49 西狐  
堅(jiān)定不移的,拋棄IE6
  
#10樓 2011-08-16 15:24 ilbefun  
請問50%邊距要怎么寫呢
  
#11樓[樓主] 2011-08-16 15:30 胡尐睿丶  
@ilbefun
什么叫50%邊距?
  
#12樓 2011-08-30 22:08 翼飛  
relative寫成relation了 汗一個(gè) 這個(gè)真不應(yīng)該有
  
#13樓[樓主] 2011-08-30 22:23 胡尐睿丶  
@翼飛
我的錯(cuò),絕對是我的錯(cuò)。
  
#14樓 2011-09-22 10:04 Rex.He  
真沒看出有什么完美的..expression基本都不會使用的...
樓主一點(diǎn)都不考慮性能問題...
  
#15樓[樓主] 2011-09-22 10:08 胡尐睿丶  
@Rex.He
真要考慮性能,那就只能屏蔽IE6了,或者不管IE6了,但這真的是為用戶考慮么?這又回到的開頭的問題,我們考慮性能的最終目的還不是為了用戶考慮。
  
#16樓 2011-09-22 10:15 Rex.He  
@胡尐睿丶
屏蔽IE6? 做東西就是為了滿足客戶需求...
expression性能損耗太大,使用position:absolute模擬會比較好
  
#17樓[樓主] 2011-09-22 10:19 胡尐睿丶  
@Rex.He
是用position:absolute模擬的啊,文章里我都寫的很清楚了,但是top,left的值你要怎么計(jì)算?還不是要用JS實(shí)時(shí)計(jì)算出來。不然你怎么實(shí)現(xiàn)?
  
#18樓 2011-09-22 10:23 Rex.He  
expression 和 JS計(jì)算模擬 在性能上的問題
在于頻率,expression在你任何位置任何時(shí)候微小的移動(dòng)都會計(jì)算很多次,你可以測試下.... JS只針對在你的使用范圍內(nèi),所以前端才不建議使用expression
  
#19樓[樓主] 2011-09-22 10:33 胡尐睿丶  
@Rex.He
原來是這樣,受教了,我一直以為expression和js沒區(qū)別,就干脆把js代碼用expression寫在css里了
  
#20樓 2011-11-23 10:49 nono_jia  
會和其他的js有沖突..單用還是可以的..
  
#21樓 2012-02-21 13:58 Zigzag  
真正最完美的方式,假設(shè)box需要fixed,如下
1
2
3
<div class="box">
 這是需要絕對定位的文字。
</div>

使用以下css來實(shí)現(xiàn)ie6的fixed:
1
2
3
4
5
6
7
.box {
  position: fixed;
  
}
* html .box { 
  position: absolute;
}
  
#22樓 2012-04-05 10:45 象牛  
引用Zigzag:
真正最完美的方式,假設(shè)box需要fixed,如下
1
2
3
<div class="box">
 這是需要絕對定位的文字。
</div>

使用以下css來實(shí)現(xiàn)ie6的fixed:
1
2
3
4
5
6
7
.box {
  position: fixed;
  
}
* html .box { 
  position: absolute;
}

厲害!?。。。。?/div>
  
#23樓[樓主] 2012-04-05 10:51 胡尐睿丶  
@Zigzag
你這哪里解決ie6 position: fixed; 的問題了?
  
#24樓[樓主] 2012-04-05 10:51 胡尐睿丶  
@象牛
演員?
  
#25樓 2012-04-05 10:54 象牛  
引用Zigzag:
真正最完美的方式,假設(shè)box需要fixed,如下
1
2
3
<div class="box">
 這是需要絕對定位的文字。
</div>

使用以下css來實(shí)現(xiàn)ie6的fixed:
1
2
3
4
5
6
7
.box {
  position: fixed;
  
}
* html .box { 
  position: absolute;
}

呃。。。。。。。。發(fā)現(xiàn)問題了。。。發(fā)現(xiàn)IE6下不會隨屏幕動(dòng)。。。或者是我沒有理解你的意思吧
  
#26樓 2012-04-13 10:03 象牛  
引用胡尐睿丶:
@象牛
演員?

你說話用的著這么偏激嗎?
  
#27樓 2012-04-28 10:39 前端組qianduanzu.com  
這樣比較耗資源,有沒有更好的解方案呢?
  
#28樓[樓主] 2012-04-28 10:41 胡尐睿丶  
@前端組qianduanzu.com
不管IE6是最好的解決方案=D
  
#29樓 2012-04-28 10:42 前端組qianduanzu.com  
@胡尐睿丶
哈哈,我博客就是。沒管它IE6
  
#30樓 2012-05-03 10:28 chloe_t  
QAQ可惜老板用的IE6啊…………
  
#31樓 2012-06-04 11:14 天地人廣告  
為什么我的下面的定位也總是跟著動(dòng)??? WHY??
  
#32樓[樓主] 2012-06-04 11:16 胡尐睿丶  
@天地人廣告
fixed不就是跟隨滾動(dòng)的
  
#33樓 2012-06-04 11:18 天地人廣告  
@胡尐睿丶
我只要頂部跟著滾??! 我用你的方法下面的那些用了絕對定位的也是和頂部一樣的滾了!
  
#34樓[樓主] 2012-06-04 11:19 胡尐睿丶  
@天地人廣告
檢查你的樣式,肯定有沖突了
  
#35樓 2012-06-04 11:24 天地人廣告  
.ie6fixedTL{position:absolute;left:expression(eval(document.documentElement.scrollLeft+10));top:expression(eval(document.documentElement.scrollTop+10))}
是只要把這句放上就行了吧! 把.ie6fixedTL 改成我的??
  
#36樓 2012-10-11 14:52 iamzou  
Body如果本身有背景呢 而且不能fixed呢?
  
#37樓 2012-10-25 22:33 偷懶小小貓  
使用以下css來實(shí)現(xiàn)ie6的fixed:
7 .box {
position: fixed;
}
* html .box {
position: absolute;
}
* html .box 這種寫法是專門針對IE6 嗎 可是我記得hack是_box{。。}吧
  
#38樓 2013-02-02 10:39 Moon_Jacob  
想不到今天在這邊把遇到的問題解決了,哈哈
ps:當(dāng)初沒和你們好好學(xué)習(xí)真是我的損失啊

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多