浮動(dòng)和偏移--布局

margin-left:當(dāng)元素不存在width屬性或者(width:auto)的時(shí)候疗隶,負(fù)margin會(huì)增加元素的寬度;當(dāng)元素的width屬性一定的時(shí)候锨亏,負(fù)margin會(huì)使元素左移。
margin-top:為負(fù)值不會(huì)增加高度胖翰,只會(huì)產(chǎn)生向上位移
margin-bottom:為負(fù)值不會(huì)產(chǎn)生位移辜御,會(huì)減少自身的供css讀取的高度

image.png

想要?jiǎng)?chuàng)建上圖中黑框內(nèi)的幾個(gè)元素按順序排下來灭美,中間帶些間隔的布局要怎么做?
一般情況下养盗,我們會(huì)把黑框里面的子元素向左浮動(dòng)缚陷,然后設(shè)一個(gè)合適的margin-right,是不是就辦到了呢?不能爪瓜,因?yàn)橥膺吅诳虻膶挾仁枪潭ǖ牡旁荆褪抢锩嫠膫€(gè)子元素的寬度加上三列間隔的寬度,所以靠近右邊邊界的子元素就不應(yīng)該有正向的margin-right了铆铆,否則這一行就只能容納三個(gè)子元素了蝶缀。如下圖:


image.png

有人說那這還不簡(jiǎn)單,給靠近右邊界的那些子元素加一個(gè)class薄货,把它的margin-right設(shè)為0不就行了翁都。這當(dāng)然可以,但如果這些子元素是在模板中通過循環(huán)動(dòng)態(tài)輸出的谅猾,那在循環(huán)的時(shí)候還得判斷哪些子元素是靠近右邊邊界的柄慰,如果是就加上一個(gè)class。這樣做的話是不是就有點(diǎn)麻煩了税娜?
所以解決辦法是加大子元素的父容器的寬度坐搔,讓它能夠容納一行中有四個(gè)子元素加上四列間隔的寬度,然后最外面的的黑框的那個(gè)容器設(shè)一個(gè)overflow:hidden就行了敬矩,為什么呢概行?因?yàn)閛verflow截取的寬度是不包括負(fù)偏移的,因?yàn)楦溉萜鞯母叨仍赾ss看來是不包括偏移量的弧岳,也就是說此時(shí)文檔流向右偏移了margin-right的值凳忙,那么文檔流的實(shí)際內(nèi)容寬度就縮短了margin-right這么多业踏。

再仔細(xì)說一遍,其實(shí)就是負(fù)的邊距好像能減小元素在文檔流中的尺寸一樣涧卵,但事實(shí)上勤家,它的尺寸大小并沒變,只是文檔流在計(jì)算元素位置的時(shí)候柳恐,會(huì)認(rèn)為負(fù)邊距把元素的尺寸減小了伐脖,因?yàn)槲恢靡簿桶l(fā)生變化了。這只是打個(gè)很形象的比喻胎撤,幫助大家理解一下晓殊。還要注意的是,文檔流只能是后面的流向前面的伤提,即文檔流只能向左或向上流動(dòng)巫俺,不能向下或向右移動(dòng)。

比如肿男,一個(gè)沒有設(shè)定高度的塊狀元素介汹,其高度是自動(dòng)的,具體來說就是由它里面的文檔流最后的位置決定的舶沛。假設(shè)它里面有一個(gè)出于文檔流中的子元素嘹承,高度為100px;那這時(shí)這個(gè)父元素的高度就等于子元素的高度100px了,如果子元素繼續(xù)增高如庭,那么父元素也會(huì)跟著增高叹卷。可是如果這時(shí)子元素設(shè)一個(gè)負(fù)的margin-bottom,比如-20px坪它,因?yàn)樨?fù)邊距會(huì)影響到文檔流骤竹,本來文檔流的高度是從父元素的最頂端到子元素的最底端這段高度,現(xiàn)在子元素有一個(gè)margin-bottom:-20px;就相當(dāng)于文檔流要向上退后20px,這樣整個(gè)文檔流的高度就減少了20px了往毡,那么父元素的高度也會(huì)跟著減少20px蒙揣。在IE8+以及那些標(biāo)準(zhǔn)瀏覽器中,這還需要父元素?fù)碛幸粋€(gè)overflow:hidden的屬性开瞭,因?yàn)楦冈氐母叨茸兞死琳穑釉氐母叨炔]有變,所以需要使子元素超出隱藏嗤详,但即使不設(shè)置overflow:hidden个扰,父元素的高度也是變小了的,只不過這時(shí)子元素的高度會(huì)超出父元素葱色。在IE6中則不需要锨匆,但需要觸發(fā)它的hasLayout屬性。
上面說了負(fù)的左右邊距能加大元素的寬度,所以給子元素的父容器設(shè)一個(gè)合適的負(fù)的margin-right就可以了恐锣。
當(dāng)然你也可以直接在css中把子元素的父容器的寬度設(shè)寬一些,舉這個(gè)例子只是為了說明負(fù)邊距也是一種方法舞痰⊥亮瘢看下完整的代碼:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        body,ul,li{ padding:0; margin:0;}
        ul,li{ list-style:none;}
        .container{ height:210px; width:460px; border:5px solid #000;}
        ul{ height:210px; overflow:hidden; margin-right:-20px;}/*一個(gè)負(fù)的margin-right,相當(dāng)于把ul的寬度增加了20px*/
        li{ height:100px; width:100px; background:#09F; float:left; margin-right:20px; margin-bottom:10px;}
    </style>
</head>
<body>
    <div class="container">
    <ul>
        <li>子元素1</li>
        <li>子元素2</li>
        <li>子元素3</li>
        <li>子元素4</li>
        <li>子元素5</li>
        <li>子元素6</li>
        <li>子元素7</li>
        <li>子元素8</li>
    </ul>
</body>
</html>

雙飛翼:

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        #container { 
            width:100%;/*100%才行,不能寫死固定數(shù)據(jù)*/
            margin: 0 auto;
            overflow:hidden;
            float:left; 
        }

        #main-content { 
            background:gray; 
            margin-left:200px;  /*與left產(chǎn)生10像素間隔*/
            margin-right:200px; /*與right產(chǎn)生10像素間隔*/
        }
        #left { 
            float:left; /*在container右側(cè)浮動(dòng)响牛,即緊跟container右側(cè)*/
            width:190px; 
            background:red; 
            margin-left:-100%; /*在container右側(cè)浮動(dòng)玷禽,即緊跟container右側(cè),然后再左側(cè)偏移父元素的寬度*/
        }
        #right { 
            float:left; 
            width:190px; 
            background:green; 
            margin-left:-190px; /*在container右側(cè)浮動(dòng)呀打,即緊跟container右側(cè)矢赁,然后再左側(cè)偏移自身元素的寬度*/
        }
        
    </style>
</head>
<body>

    <div id ="container">
        <div id="main-content">main content</div>   
    </div>
    <div id="left">left</div>
    <div id="right">right</div> 

</body>
</html>

雙飛翼布局,為了中間div內(nèi)容不被遮擋贬丛,直接在中間div內(nèi)部創(chuàng)建子div用于放置內(nèi)容撩银,在該子div里用margin-left和margin-right為左右兩欄div留出位置。

如果代碼如下:

<!DOCTYPE html>
<!DOCTYPE html>
<html>
<head>
    <title></title>
    <style type="text/css">
        #container { 
/*            width:100%;100%才行豺憔,不能寫死固定數(shù)據(jù)*/
            margin: 0 auto;
            overflow:hidden;
            float:left; 
        }

        #main-content { 
            background:gray; 
/*            margin-left:200px;  與left產(chǎn)生10像素間隔*/
/*            margin-right:200px; 與right產(chǎn)生10像素間隔*/
        }
        #left { 
            float:left; /*在container右側(cè)浮動(dòng)额获,即緊跟container右側(cè)*/
            width:190px; 
            background:red; 
/*            margin-left:-100%; 在container右側(cè)浮動(dòng),即緊跟container右側(cè)恭应,然后再左側(cè)偏移父元素的寬度*/
        }
        #right { 
            float:left; 
            width:190px; 
            background:green; 
/*            margin-left:-190px; 在container右側(cè)浮動(dòng)抄邀,即緊跟container右側(cè),然后再左側(cè)偏移自身元素的寬度*/
        }
        
    </style>
</head>
<body>

    <div id ="container">
        <div id="main-content">main content</div>   
    </div>
    <div id="left">left</div>
    <div id="right">right</div> 

</body>
</html>

則出現(xiàn)效果圖:


屏幕快照 2018-01-13 下午5.48.36.png

下面分別解釋注釋掉的每一句:
1昼榛、

#container { 
/*            width:100%;100%才行境肾,不能寫死固定數(shù)據(jù)*/
            margin: 0 auto;
            overflow:hidden;
            float:left; 
        }

如果不設(shè)置最外層容器的寬度,float:left屬性會(huì)使最外層容器收縮到只包含容器內(nèi)元素為止胆屿。如果寫死固定數(shù)據(jù)則針對(duì)不同大小的瀏覽器界面顯示會(huì)有問題奥喻。

2、

#main-content { 
            background:gray; 
/*            margin-left:200px;  與left產(chǎn)生10像素間隔*/
/*            margin-right:200px; 與right產(chǎn)生10像素間隔*/
        }

為左右兩側(cè)div留出顯示位置莺掠。

3衫嵌、

#left { 
            float:left; /*在container右側(cè)浮動(dòng),即緊跟container右側(cè)*/
            width:190px; 
            background:red; 
/*            margin-left:-100%; 在container右側(cè)浮動(dòng)彻秆,即緊跟container右側(cè)楔绞,然后再左側(cè)偏移父元素的寬度*/
        }

這里的100%是相對(duì)于父元素的,相當(dāng)于全部父元素的寬唇兑,如果我們把它改成50%,效果如下:
屏幕快照 2018-01-13 下午6.01.39.png

本文第一句話:當(dāng)元素的width屬性一定的時(shí)候酒朵,負(fù)margin會(huì)使元素左移。本例中就是left元素會(huì)左移到緊貼父元素container的左側(cè)扎附。

4蔫耽、

#right { 
            float:left; 
            width:190px; 
            background:green; 
/*            margin-left:-190px; 在container右側(cè)浮動(dòng),即緊跟container右側(cè),然后再左側(cè)偏移自身元素的寬度*/
        }

同理匙铡,right元素只需要左移自身元素的位置图甜,使自己的最右邊挨著父元素container的右側(cè)即可。

雙飛翼布局主要解決倆問題:1鳖眼、三列布局黑毅,中間寬度自適應(yīng),兩邊定寬钦讳; 2矿瘦、中間欄要在瀏覽器中優(yōu)先展示渲染。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愿卒,一起剝皮案震驚了整個(gè)濱河市缚去,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌琼开,老刑警劉巖易结,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異稠通,居然都是意外死亡衬衬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門改橘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來滋尉,“玉大人,你說我怎么就攤上這事飞主∈ㄏВ” “怎么了?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵碌识,是天一觀的道長(zhǎng)碾篡。 經(jīng)常有香客問我,道長(zhǎng)筏餐,這世上最難降的妖魔是什么开泽? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮魁瞪,結(jié)果婚禮上穆律,老公的妹妹穿的比我還像新娘。我一直安慰自己导俘,他們只是感情好峦耘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著旅薄,像睡著了一般辅髓。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天洛口,我揣著相機(jī)與錄音矫付,去河邊找鬼。 笑死绍弟,一個(gè)胖子當(dāng)著我的面吹牛技即,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播樟遣,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼身笤!你這毒婦竟也來了豹悬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤液荸,失蹤者是張志新(化名)和其女友劉穎瞻佛,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體娇钱,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡伤柄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了文搂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片适刀。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖煤蹭,靈堂內(nèi)的尸體忽然破棺而出笔喉,到底是詐尸還是另有隱情,我是刑警寧澤硝皂,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布常挚,位于F島的核電站,受9級(jí)特大地震影響稽物,放射性物質(zhì)發(fā)生泄漏奄毡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一贝或、第九天 我趴在偏房一處隱蔽的房頂上張望吼过。 院中可真熱鬧,春花似錦傀缩、人聲如沸那先。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)售淡。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揖闸,已是汗流浹背揍堕。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留汤纸,地道東北人衩茸。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像贮泞,于是被迫代替她去往敵國(guó)和親楞慈。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案啃擦? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,751評(píng)論 1 92
  • css中的負(fù)邊距(negative margin)是布局中的一個(gè)常用技巧囊蓝,只要運(yùn)用得合理常常會(huì)有意想不到的效果。很...
    studystudy閱讀 1,152評(píng)論 0 0
  • CSS布局奇淫巧計(jì)之-強(qiáng)大的負(fù)邊距css中的負(fù)邊距(negative margin)是布局中的一個(gè)常用技巧令蛉,只要運(yùn)...
    呦泥酷閱讀 447評(píng)論 0 1
  • 一 外部式css樣式 (也可稱為外聯(lián)式)就是把css代碼寫一個(gè)單獨(dú)的外部文件中聚霜,這個(gè)css樣式文件以“.css...
    KunMitnic閱讀 939評(píng)論 0 1
  • 1. 浮動(dòng)元素有什么特征祷安?對(duì)父容器姥芥、其他浮動(dòng)元素、普通元素辆憔、文字分別有什么影響? 浮動(dòng)元素的特征:CSS設(shè)計(jì)flo...
    饑人谷_邵征鵬閱讀 546評(píng)論 0 0