CSS奇技淫巧之負(fù)邊距的應(yīng)用

最近在學(xué)習(xí)flex布局,在贊嘆其便捷性的同時(shí)档悠,回想起之前使用css2的時(shí)候?qū)崿F(xiàn)等高或者等寬布局的麻煩。同時(shí)也看到[The Definitive Guide to Using Negative Margins這篇文章對(duì)于負(fù)邊距的介紹,這里參考并總結(jié)一二隆箩,加深理解。

我們?cè)谄綍r(shí)的開(kāi)發(fā)中很少使用負(fù)邊距羔杨,不過(guò)其實(shí)可以解決很多問(wèn)題捌臊。首先,W3C標(biāo)準(zhǔn)并不反對(duì)使用負(fù)邊距问畅,此外娃属,使用負(fù)邊距時(shí)并不會(huì)時(shí)節(jié)點(diǎn)脫離文檔流六荒,因此能夠影響后繼節(jié)點(diǎn)的布局,此外矾端,它也有著較好的兼容性掏击,在適當(dāng)?shù)臅r(shí)候合適的使用它可能解決大問(wèn)題。

我們先借用參考文章里的一張圖來(lái)回顧一下盒模型:


盒模型.png

仔細(xì)看圖中的箭頭所示秩铆,對(duì)一個(gè)非float元素來(lái)說(shuō)砚亭,top,left屬性影響元素本身的定位,而right,bottom影響的是后繼元素的定位殴玛。理解這點(diǎn)其實(shí)很重要捅膘,很多時(shí)候我們會(huì)覺(jué)得很奇怪,明明設(shè)置了margin-bottom為0滚粟,可是為什么沒(méi)有相對(duì)父元素居于底部呢寻仗。

一個(gè)有趣的現(xiàn)象是,當(dāng)我們并未對(duì)節(jié)點(diǎn)設(shè)置寬度凡壤,但是設(shè)置了負(fù)的margin-left或者margin-right時(shí)署尤,會(huì)導(dǎo)致節(jié)點(diǎn)變寬,其效果有點(diǎn)類似padding亚侠。

而對(duì)于float節(jié)點(diǎn)曹体,負(fù)的margin稍顯復(fù)雜,我們不妨先看看float方向和負(fù)邊距方向相反的情形:

#mydiv1 {
    float:left; 
    margin-right:-100px;
}

而HTML結(jié)構(gòu)為

<div id="mydiv1">First</div>
<div id="mydiv2">Second</div>

我們使用codepen來(lái)查看上述結(jié)果硝烂,不難發(fā)現(xiàn)箕别,mydiv2由于負(fù)值margin-right的重疊作用,直接覆蓋mydiv1.當(dāng)我們把mydiv1設(shè)置成寬度100%時(shí)滞谢,便輕松實(shí)現(xiàn)了mydiv2固定寬度串稀,而mydiv1占寬100%的布局,而不需使用position:absolute.

當(dāng)mydiv1和mydiv2都被設(shè)置了margin-right為-20px時(shí)狮杨,其效果是mydiv1的寬度減少了20px厨诸,因?yàn)楸籱ydiv2覆蓋的緣故。

不難想象禾酱,當(dāng)mydiv1的負(fù)margin-right設(shè)置的值超過(guò)其寬度時(shí)微酬,則完全被覆蓋。

這里可以思考一下颤陶,假設(shè)頁(yè)面布局如下:

<div id="mydiv">Start</div>
<div id="mydiv1">First</div>
<div id="mydiv2">Second</div>

而樣式如下:

#mydiv {
  float: left;
}

#mydiv1 {
  float:left; 
  margin-right:-200px;
}

#mydiv2 {
    float: left;
    margin-right: -20px;
}

那么mydiv2會(huì)否覆蓋到mydiv呢颗管?

再看一個(gè)例子,要把單列的列表改成多列混排滓走,繼續(xù)盜圖:

多列布局.png

HTML如下:

<ul>
  <li class="col1">Eggs</li>
  <li class="col1">Ham<li>
  <li class="col2 top">Bread<li>
  <li class="col2">Butter<li>
  <li class="col3 top">Flour<li>
  <li class="col3">Cream</li>
</ul>

CSS如下:

    ul {list-style:none;}
    li {line-height:1.3em;}
    .col2 {margin-left:100px;}
    .col3 {margin-left:200px;}
    .top {margin-top:-2.6em;} /* the clincher */

如此垦江,便順利的從單列布局轉(zhuǎn)為多列布局。初看這部分代碼時(shí)搅方,我也覺(jué)得很奇怪比吭,怎么第4個(gè)和第6個(gè)li標(biāo)簽無(wú)需設(shè)置margin-top就可以實(shí)現(xiàn)節(jié)點(diǎn)上移而實(shí)現(xiàn)多個(gè)塊元素相互重疊的效果绽族?這里必須提到的一點(diǎn)是,負(fù)值的margin-top會(huì)導(dǎo)致文檔流上移衩藤,想明白了這一點(diǎn)吧慢,就不難理解這里的布局為何是這樣了。關(guān)于margin的更深入的討論赏表,我會(huì)在參考文獻(xiàn)中列出检诗。

負(fù)值的margin還有其他應(yīng)用,比如氣泡文字瓢剿,文本疊加效果等逢慌,再也不用使用死板的絕對(duì)定位了。

氣泡提示文字.png

當(dāng)然间狂,要實(shí)現(xiàn)多列布局也很easy:

HTML

    <div id="content"> <p>Main content in here</p> </div>
    <div id="sidebar"> <p>I’m the Sidebar! </p> </div>

CSS
#content {width:100%; float:left; margin-right:-200px;}
#sidebar {width:200px; float:left;}
#content p {margin-right:210px;}

這里給p設(shè)置margin-right很重要攻泼,因?yàn)閏ontent的實(shí)際寬度仍然是100%,否則會(huì)導(dǎo)致p標(biāo)簽和sidebar重疊鉴象。

使用負(fù)的margin-top可能會(huì)導(dǎo)致一系列問(wèn)題坠韩,比如選擇和點(diǎn)擊頁(yè)面元素,由于節(jié)點(diǎn)相互重疊可能導(dǎo)致層級(jí)不符合預(yù)期炼列,解決方法也很簡(jiǎn)單,使用position:relative即可音比!

最后俭尖,再回顧一下經(jīng)典的等高布局代碼:

CSS

.div {
    width: 100px;
    overflow: hidden;
  }
 .div1, .div2 {
    padding-bottom: 200px;
    margin-bottom: -200px;
    float: left;
    width: 50%;
    word-wrap: break-word;
}

HTML

<div class="div">
    <div class="div1">111111111111111111111111111</div>
    <div class="div2">
       22222222222sd豆腐干豆腐豆腐干豆腐干豆腐干豆腐
    </div>
</div>

這里主要用到的原理是:

  • 未設(shè)置父節(jié)點(diǎn)高度時(shí),其高度由高度最高的子節(jié)點(diǎn)高度決定
  • 負(fù)值的margin-bottom可以減少父節(jié)點(diǎn)高度洞翩,對(duì)子節(jié)點(diǎn)高度不影響稽犁,也不影響子節(jié)點(diǎn)定位

關(guān)于margin,其實(shí)還有很多值得去深挖的東西骚亿,比如當(dāng)沒(méi)有設(shè)置padding和border時(shí)已亥,子節(jié)點(diǎn)和父節(jié)點(diǎn)的margin-to會(huì)重疊;而兩個(gè)平級(jí)的節(jié)點(diǎn)之間的margin-bottom和margin-top之間也會(huì)重疊来屠,在你不知道的CSS——BFC(塊級(jí)格式化上下文)中虑椎,我們會(huì)對(duì)此進(jìn)行詳細(xì)解釋。

參考文獻(xiàn):
你不知道的CSS——BFC(塊級(jí)格式化上下文)
The Definitive Guide to Using Negative Margins
Html+CSS__margin 負(fù)值之美:負(fù)margin在頁(yè)面布局中的應(yīng)用
深入理解margin重疊以及負(fù)margin對(duì)元素大小的影響
不要告訴我你懂margin
由淺入深漫談margin屬性

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末俱笛,一起剝皮案震驚了整個(gè)濱河市捆姜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌迎膜,老刑警劉巖泥技,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異磕仅,居然都是意外死亡珊豹,警方通過(guò)查閱死者的電腦和手機(jī)簸呈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)店茶,“玉大人蜕便,你說(shuō)我怎么就攤上這事『龆剩” “怎么了玩裙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)段直。 經(jīng)常有香客問(wèn)我吃溅,道長(zhǎng),這世上最難降的妖魔是什么鸯檬? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任决侈,我火速辦了婚禮,結(jié)果婚禮上喧务,老公的妹妹穿的比我還像新娘赖歌。我一直安慰自己,他們只是感情好功茴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布庐冯。 她就那樣靜靜地躺著,像睡著了一般坎穿。 火紅的嫁衣襯著肌膚如雪展父。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天玲昧,我揣著相機(jī)與錄音栖茉,去河邊找鬼。 笑死孵延,一個(gè)胖子當(dāng)著我的面吹牛吕漂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播尘应,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼惶凝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了犬钢?” 一聲冷哼從身側(cè)響起梨睁,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎娜饵,沒(méi)想到半個(gè)月后坡贺,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年遍坟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拳亿。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡愿伴,死狀恐怖肺魁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隔节,我是刑警寧澤鹅经,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站怎诫,受9級(jí)特大地震影響瘾晃,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幻妓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一蹦误、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肉津,春花似錦强胰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至距糖,卻和暖如春玄窝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背肾筐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缸剪,地道東北人吗铐。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像杏节,于是被迫代替她去往敵國(guó)和親唬渗。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問(wèn)答題47 /72 常見(jiàn)瀏覽器兼容性問(wèn)題與解決方案奋渔? 參考答案 (1)瀏覽器兼容問(wèn)題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,754評(píng)論 1 92
  • relative:生成相對(duì)定位的元素镊逝,通過(guò)top,bottom,left,right的位置相對(duì)于其正常位置進(jìn)行定位...
    zx9426閱讀 943評(píng)論 0 2
  • CSS布局奇淫巧計(jì)之-強(qiáng)大的負(fù)邊距css中的負(fù)邊距(negative margin)是布局中的一個(gè)常用技巧,只要運(yùn)...
    呦泥酷閱讀 447評(píng)論 0 1
  • 我喜歡一種泥土 它叫鄉(xiāng)土 對(duì)嫉鲸,是生活在鄉(xiāng)村的泥土 我喜歡把萬(wàn)物比做生命 而我會(huì)在里面尋找它的溫度與厚度 鄉(xiāng)土就是我...
    秋二生閱讀 182評(píng)論 0 0
  • 活的沒(méi)有自我的時(shí)間撑蒜,雖然我也愛(ài)你,可是我還是我,我也要有我的自由時(shí)間
    里鯊閱讀 314評(píng)論 0 0