廢話不多說,先看一下下面這段代碼:
<!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 >
</ 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代碼如下:
.ie 6 fixedTL{ position : fixed ; left : 0 ; top : 0 }
.ie 6 fixedBR{ position : fixed ; right : 0 ; bottom : 0 }
* html .ie 6 fixedTL{ position : absolute ; left :expression(eval(document.documentElement.scrollLeft)); top :expression(eval(document.documentElement.scrollTop))}
* html .ie 6 fixedBR{ 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è)像素,那就要這樣子寫:
.ie 6 fixedTL{ position : fixed ; left : 10px ; top : 10px }
* html .ie 6 fixedTL{ 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就行了。
下面附上完整代碼
.ie 6 fixedTL{ position : fixed ; left : 0 ; top : 0 }
.ie 6 fixedBR{ position : fixed ; right : 0 ; bottom : 0 }
* html,* html body{ background-image : url (about:blank); background-attachment : fixed }
* html .ie 6 fixedTL{ position : absolute ; left :expression(eval(document.documentElement.scrollLeft)); top :expression(eval(document.documentElement.scrollTop))}
* html .ie 6 fixedBR{ 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