您當(dāng)前位置:圖趣網(wǎng)(Tuquu) >> 網(wǎng)頁設(shè)計教程 >> 移動前端 >> 瀏覽設(shè)計教程

網(wǎng)頁前端IE-BUG系列-3像素縫隙錯誤,也稱文本慢跑錯誤

受影響的IE版本

IE6

癥狀

緊接浮動元素的元素或者與浮動元素之間會有3像素的縫隙,或者會位于浮動元素下面,或者會在有數(shù)個浮動元素時保持這個3像素的偏移。

說明

這是一個頗為有趣的bug.在IE中haslayout屬性為true的元素在浮動元素周圍在不同情況下會有不同的表現(xiàn)。他們不愿屈居浮動元素之下,甚至都不愿觸碰到浮動元素。實際上,為元素賦予’layout’是IE使其能包含浮動元素的方式。然而,這個bug有三種呈現(xiàn)方式。下面是demo:

BUG  DEMO

點擊查看

HTML  Code:

		<div id="container">
    <div id="bugger">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim">*cry*</div>
</div>

<div id="container2">
    <div id="bugger2">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim2">*cry*</div>
</div>

<div id="container3">
    <div id="bugger3">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim3">*cry*</div>
</div>
<div id="container4">
    <div id="bugger4">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim4">*cry*</div>
</div>

CSS  Code:

		#container,
#container2,
#container3,
#container4 {
    width: 500px;
    overflow: hidden; /* just containing floats */

}
    #bugger,
    #bugger2,
    #bugger3 {
        float: left;
        width: 300px;
        background: #65A5E1;
    }
    #bugger3 {
        background: none;
        border-right: 1px solid #000;
    }
    #victim {
        width: 200px;
        margin-left: 300px;
    }
    #victim2 {
        height: 1.5em; /* just to give "layout" */
        margin-left: 300px;
    }
    #bugger4 {
        float: right;
        width: 300px;
    }
    #victim4 {
        width: 200px;
        margin-right: 300px;
    }

我們一個個地分析這些demo。第一個demo中有三個元素:固定寬度的#container,它里面的浮動元素#bugger和另一個元素#victim,其左margin設(shè)置為#bugger元素的寬度。盡管你可能不會在專業(yè)代碼中看到這些,但由于可以說為第二個孩子結(jié)點#victim設(shè)置寬度沒有任何用處,而也正是這一點使這個bug更加突出,即添加寬度后#victim就位于浮動元素之下了。如果沒有#victim{width:200px;},而haslayout仍為true,這個bug的呈現(xiàn)方式將是#victim和#bugger之間的3像素的縫隙,這可以從第二個demo也就是#container2看出來。最終,如果緊鄰浮動元素的元素沒有’layout’,這個bug將無從察覺。第三個demo,即#container3顯示了這個效果。#victim3中的文本仍然偏移了3px,這說明這個bug會影響由文本,圖像和類似元素產(chǎn)生的inline盒子,這個bug也因此而另外得名”Text jog Bug”.在第三個demo中,這個bug可能還沒有這么明顯。然而,如果用200px寬的圖像替換文本,它會如同我們在第一個demo中看到的一樣沉下去??纯醋詈笠粋€demo,即#container4,很明顯,就算將左浮動float:left改為右浮動float:right,這個bug依然存在。

解決方案

以下是按解決方案類型排列的解決方案:

條件注釋方案

修復(fù)版本

所有受影響的版本

描述

盡管這個bug的修復(fù)有些像虎口奪食的情景,“把我的那塊還給我”,但它真的很有效。

大家也注意到了,這些demo中的所有縫隙都是整整3px,這也是我們在修復(fù)中將要加以利用的,這些修復(fù)方法會隨這個bug的呈現(xiàn)方式而有些微小的改變。

HTML Code:

		<div id="container">
    <div id="bugger">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim">*cry*</div>
</div>

<div id="container2">
    <div id="bugger2">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim2">*cry*</div>
</div>

<div id="container3">
    <div id="bugger3">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim3">*cry*</div>
</div>
<div id="container4">
    <div id="bugger4">
        Lorem ipsum dolor sit amet,
        consectetuer adipiscing elit.
    </div>
    <div id="victim4">*cry*</div>
</div>

CSS Code:

		#container,
#container2,
#container3,
#container4 {
    width: 500px;
    overflow: hidden; /* just containing floats */

}
    #bugger,
    #bugger2,
    #bugger3 {
        float: left;
        width: 300px;
        background: #65A5E1;
    }
    #bugger3 {
        background: none;
        border-right: 1px solid #000;
    }
    #victim {
        width: 200px;
        margin-left: 300px;
    }
    #victim2 {
        height: 1.5em; /* just to give "layout" */
        margin-left: 300px;
    }
    #bugger4 {
        float: right;
        width: 300px;
    }
    #victim4 {
        width: 200px;
        margin-right: 300px;
    }

條件注釋:

		<!--[if lt IE 7]>
        <style type="text/css">
            #bugger,
            #bugger2,
            #bugger3 { margin-right: -3px; }

            #bugger4 { margin-left: -3px; }

            #victim,
            #victim2 { margin-left: 0; }

            #victim4 { margin-right: 0; }
        </style>
    <![endif]-->

上面的代碼除了條件注釋,與原始demo中的代碼一樣。條件注釋會應(yīng)用于所有低于IE7的IE版本匹配,它們也正是這個bug所影響的版本。

這個解決方案包含應(yīng)用一個-3px到浮動元素上bug出現(xiàn)的那一邊的margin。所以根據(jù)其float值,頭三個demo中我們使用了margin-left,而最后一個demo我們使用了margin-right。

在我們的demo中使用的margin值為-3px的原因不是因為3的神奇而是因為其原始值為0.而需要傳遞給低于7的IE版本的值是比原始值小3.所以,如果我們已經(jīng)在第一個demo中使用了#bugger{margin-right:30px},我們應(yīng)當(dāng)在條件注釋中使用#bugger{margin-right:27px}

修復(fù)方案的第二個部分,需要將#victim,#victim2和#victim4的margin設(shè)置為0.為什么呢,由于IE處理浮動元素周圍有l(wèi)ayout的元素的方式,從而在IE中,#victim , #victim2 , #victim4的margin將從#bugger的邊沿開始而不是位于其下(在正常的瀏覽器中會沉下)。

#victim3上的margin并沒有設(shè)置為0,因為它并沒有’layout’,從而它會位于浮動元素下面。

 

原文鏈接: http://haslayout.net/css/3px-Gap-Bug-aka-Text-Jog-Bug

[教程作者:admin]
免責(zé)聲明:本站文章系圖趣網(wǎng)整理發(fā)布,如需轉(zhuǎn)載,請注明出處,素材資料僅供個人學(xué)習(xí)與參考,請勿用于商業(yè)用途!
本文地址:http://m.likemindfilms.com/tutorial/wd1420.html
Div標(biāo)簽在網(wǎng)站建設(shè)中的一些規(guī)范
網(wǎng)頁前端開發(fā)browserhacks-集合所有瀏覽器CSS和JavaScript的HACK寫法
圖趣網(wǎng)微信
建議反饋
×