九九热线视频精品99-动漫高h纯肉无码视频在线观看-午夜理论无码片在线观看免费-99精品国产在热久久无码-亚洲国产成人乱码

兩列自適應布局

2016/11/8 8:37:47   閱讀:2064    發布者:2064

隨便拿一個搜索引擎搜索一下"兩列自適應布局",都能得到很多種實現方法,
這篇文章的重點是這些方法的底層邏輯是什么,他們是怎么得來的。

分析:

需要滿足三個要求:

①兩個盒子在同一行

②右邊的盒子需要占滿剩下的空間

③兩個盒子不能重疊

這三個條件又分別有很多種實現方法(不考慮絕對定位):

組合起來,會有很多種實現方式。

方法:

<div class="left"></div> <div class="main"></div>

1、float+block+margin:

.left { 
    float: left; 
    width: 100px; 
} 
.main { 
    margin-left: 110px; 
    width: 100%; 
}

缺點:如果想修改.left的寬度,還需要修改.main 的margin-left。

 

2、float+BFC:

.left { 
    float: left; 
    margin-right: 10px; 
    width: 100px; 
} 
.main { 
    overflow: hidden; //或overflow:auto 
}

優點:可以設置浮動的margin來控制間距,想要修改寬度時只修改寬度就行了。

 

增加條件:

如果需要讓重要的內容先渲染,即HTML結構應該是:

<div class="main"></div> <div class="left"></div>

如果是這樣的話,第一個盒子的寬度必須是100%,因為如果想要同行,他只能是float或是display:inline-block
(不考慮絕對定位),這兩種狀態都需要設置width:100%來做到自適應。

  • 浮動:

如果.main設置float的話,根據浮動流的原理,要讓.main的右邊出現和.left寬度相同或更多的空隙,
才能讓.left到上面一行來,如果要讓.left貼住.main的左邊線,就要制造出和.main自身相等的空隙,
所以需要給.left設置margin-left:-100%;

這時候.left就疊到了.main的上面。如果給.main設置margin-left: 100px,.left還是會疊在
.main上面,因為這時候.main的寬度變小了,.left的負邊距也變小了,所以不管給
.main的margin-left值設置成多大,.left始終會覆蓋住它。

所以,如果想用float+margin讓他們不重疊的話,只能再增加一個盒子,為其設置margin。即:

<div class="main"> <div class="main-content"></div> </div> <div class="left"></div>
.left { 
    margin-left:-100%; 
    height: 400px; 
    display: inline-block;  /*或者 float:left;*/ 
    width: 100px; 
} 
.main { 
    float: left; 
    width: 100%; 
} 
.main-content { 
    margin-left: 110px; 
}

除此之外還剩下兩條路,一個是float+BFC,一個是position:relative。

先看float+BFC,.main是float,但是他已經完全被后面的浮動流蓋住了,所以他無法充當
那個"float",顯然他也無法做那個BFC,所以這條路是走不通的。

然后看position:relative。讓.main右移空出.left的位置,然后用relative將其拉出來,即:

.left { 
    margin-left:-100%; 
    position: relative; 
    left: -110px; 
    display: inline-block;  /*或者 float:left*/ 
    width: 100px; 
} 
.main { 
    margin-left: 110px; 
    float: left; 
    width: 100%; 
}

 

  • display:inline-block;

如果讓.main display:inline-block的話,必須讓當前行盒留出大于.left寬度的空隙,
并且讓.left浮動,他們才可以到一行上去。

想讓當前行盒縮短的話,可以給.main設置左邊或是右邊的負邊距,這會有一個副作用,
就是會讓.main向左或向右移動,所以,只能給他設置左邊的負邊距。

到一行上面之后.main會蓋住.left,這是因為在同一個堆疊上下文中,inline-block會在float的上面,
所以還需要給.left設置position:relative讓他顯示出來。

因為.main已經設置了負的margin-left,所以無法給.left讓出空間,position:relative這條路也是沒法走了。
float+BFC顯然也是行不通。

所以只有一種方法:

<div class="main"> <div class="main-content"></div> </div> <div class="left">/div>
.left { 
    float: left; 
    position: relative; 
    width: 100px; 
} 
.main { 
     display: inline-block; 
     margin-left: -100px; 
    width: 100%; 
} 
.main-content { 
    margin-left: 110px; 
}

 

總結:

從問題出發,結合基礎的知識點,可以得出以下5種實現方式:

 不要求重要內容先渲染的話,可以使用:

1.float+margin

2.float+BFC

要求重要內容先渲染的話,可以:

1.float+relative

2.float+新盒子

3.inline-block+新盒子

除此之外,還有CSS3的flexbox,他的缺點是不兼容低級瀏覽器并且會出現一些bug。

每個方法都有各自的優點和缺點,沒有絕對的好與壞,要使用哪種方式還是要結合具體的需求來決定。

 

主站蜘蛛池模板: 久久/这里只精品热在线获取| 国产做爰又粗又大又爽动漫| 国产欧美va欧美va香蕉在线观看| 中文在线中文资源| 综合 欧美 小说 另类 图| 精品亚洲欧美无人区乱码| 天堂最新版在线www| 久久精品国产首页027007| 亚洲中文字幕无码久久| 欧美丰腴丰满大屁股熟妇| 综合亚洲综合图区网友自拍| 成人h动漫无码网站久久| 欧美黑人又大又粗xxxxx| 美女视频黄又黄又免费| 中文字幕v亚洲日本在线| 开心五月激情综合婷婷色| 伊在人天堂亚洲香蕉精品区| 起碰免费公开97在线视频| 超清av在线播放不卡无码| 成在人线av无码免费高潮喷水| 丝袜 亚洲 另类 欧美| 东京热大乱系列无码| 综合激情亚洲丁香社区| 国产内射老熟女aaaa| 三级做爰高清视频| 中文无码不卡人妻在线看| 成·人免费午夜无码视频| 射精区-区区三区| 亚洲精品国产情侣av在线| 日本喷奶水中文字幕视频| 18禁黄网站禁片无遮挡观看| 女的被弄到高潮娇喘喷水视频| 亚洲综合伊人久久综合| 久久久精品成人免费看片| 亚洲精品无码久久毛片| 日本被黑人强伦姧人妻完整版| 麻豆最新国产av原创精品| 日本www一道久久久免费| 久热中文字幕在线精品观| 日本免费人成视频在线观看| 无码天堂亚洲国产av麻豆|