CSS布局:float、position糯而、flex天通、grid

CSS是前端基礎(chǔ)技能之一,而CSS最重要的功能就是網(wǎng)站布局熄驼。
CSS布局方式有很多像寒,從遠(yuǎn)古時代的table(表格)布局-->float(浮動)布局-->position(定位)布局-->flex(彈性)布局-->grid(網(wǎng)格)布局(還未正式推出),下面咱們簡單談一談各種布局的用法及其優(yōu)缺點(diǎn)瓜贾。
table布局就是將網(wǎng)站當(dāng)做一個表單來做诺祸,這里不做展開,因?yàn)楝F(xiàn)在基本不這么用了祭芦。

1.float

float:浮動筷笨。float剛開始并不是為了用來網(wǎng)頁布局,而是用來解決圖文信息中圖片與文本沖突的問題的龟劲。
如下圖:


image.png

這種常見的圖文效果胃夏,沒有float之前是很難達(dá)到的。有了float之后只需要加一個float:left昌跌,輕松搞定仰禀。

<style>
    .content{
        margin: 100px auto;
        width: 300px;
    }
    .box{
        float: left;
    }
</style>
<body>
    <div class="content">
        <div class="box"><img src="./imgs/authority-employee.png" alt=""></div>
        <div class="text">CSS(層疊樣式表)是一種用來表現(xiàn)HTML或XML等文件樣式的計(jì)算機(jī)語言。CSS不僅可以靜態(tài)地修飾網(wǎng)頁蚕愤,還可以配合各種腳本語言動態(tài)地對網(wǎng)頁各元素進(jìn)行格式化答恶。有三種方法可以在站點(diǎn)網(wǎng)頁上使用樣式表:外部樣式表、內(nèi)部樣式表和內(nèi)聯(lián)樣式萍诱。</div>
    </div>
</body>

‘咦亥宿,如果float可以處理圖文的問題,那用來布局不也可以嗎砂沛?’烫扼,后來有人用float試著用于網(wǎng)頁布局,還真的可以碍庵。
網(wǎng)頁中最常見的布局如下:

網(wǎng)頁常見布局.png

用float做

<style>
    body,ul,li{
        padding: 0;
        margin: 0;
        list-style: none;
    }
   .header{
       height: 100px;
       background-color: hotpink;
   }
   .nav{
        height: 100px;
        line-height: 100px;
        text-align: center;
   }
   .nav li{
       float: left;
       width: 100px;
       height: 100px;
       margin-left: 20px;
       background-color: yellowgreen;
   }
   .main{
       width: 1000px;
       height: 500px;
       margin: 0 auto;
   }
   .article{
       width: 800px;
       height: 500px;
       background-color:yellow; 
       float: left;
   }
   .aside{
       width: 200px;
       height: 500px;
       background-color:skyblue; 
       float: left;
   }
   .footer{
       height: 100px;
       background-color: greenyellow;
   }
</style>

<body>
    <!--頭部start-->
    <div class="header">
        <!--導(dǎo)航start-->
        <ul class="nav">
            <li><a href="#">導(dǎo)航1</a></li>
            <li><a href="#">導(dǎo)航2</a></li>
            <li><a href="#">導(dǎo)航3</a></li>
        </ul>
        <!--導(dǎo)航end-->
    </div>
    <!--頭部end-->

    <!--主體start-->
    <div class="main">
        <!--文章start-->
        <div class="article"></div>
        <!--文章end-->

        <!--側(cè)邊欄start-->
        <div class="aside"></div>
        <!--側(cè)邊欄end-->

    </div>
    <!--主體end-->

    <!--底部start-->
    <div class="footer"></div>
    <!--底部end-->
</body>

比table布局要方便不少映企,不過float隨之而來的帶來了 “浮動高度塌陷”的問題:
如果浮動元素的父元素沒有設(shè)定高度,當(dāng)其子元素浮動后静浴,父元素就因?yàn)閮?nèi)部沒有子元素?fù)纹饛亩叨茸優(yōu)?堰氓;
引申:網(wǎng)頁元素一般分為 普通流,浮動流苹享,定位流双絮。其中普通流和浮動流在一個層級上浴麻,定位流>浮動流>普通流。
之后為了解決這個問題搞出來一系列清除“浮動高度塌陷”的策略方法囤攀,非常麻煩软免。

2.position

position:定位;顧名思義焚挠,就是確定位置膏萧。position同樣可以用做網(wǎng)頁布局。

<style>
    body,ul,li{
        padding: 0;
        margin: 0;
        list-style: none;
    }
   .header{
       height: 100px;
       background-color: hotpink;
   }
   .nav{
        height: 100px;
        line-height: 100px;
        text-align: center;
        /*父元素用相對定位*/
        position: relative;
   }
   .nav li{
       /*子元素用絕對定位*/
       position: absolute;
       width: 100px;
       height: 100px;
       background-color: yellowgreen;
   }
   .nav li:nth-child(1){
       left: 20px;
   }
   .nav li:nth-child(2){
       left: 140px;
   }
   .nav li:nth-child(3){
       left: 260px;
   }
   .main{
       width: 1000px;
       height: 500px;
       margin: 0 auto;
       position: relative;
   }
   .article{
       width: 800px;
       height: 500px;
       background-color:yellow; 
   }
   .aside{
       width: 200px;
       height: 500px;
       background-color:skyblue; 
       position: absolute;
       top: 0;
       right: 0;
   }
   .footer{
       height: 100px;
       background-color: greenyellow;
   }
</style>

<body>
    <!--頭部start-->
    <div class="header">
        <!--導(dǎo)航start-->
        <ul class="nav">
            <li><a href="#">導(dǎo)航1</a></li>
            <li><a href="#">導(dǎo)航2</a></li>
            <li><a href="#">導(dǎo)航3</a></li>
        </ul>
        <!--導(dǎo)航end-->
    </div>
    <!--頭部end-->

    <!--主體start-->
    <div class="main">
        <!--文章start-->
        <div class="article"></div>
        <!--文章end-->

        <!--側(cè)邊欄start-->
        <div class="aside"></div>
        <!--側(cè)邊欄end-->

    </div>
    <!--主體end-->

    <!--底部start-->
    <div class="footer"></div>
    <!--底部end-->
</body>

同樣的效果


image.png

不過position需要計(jì)算每一個元素的位置蝌衔,而且這個位置是定死的榛泛,略顯繁瑣和笨重。實(shí)際上position我平常只用來定位一些小的標(biāo)簽之類的東西噩斟。position優(yōu)點(diǎn)在于不像float那樣會影響其他元素曹锨。
關(guān)鍵點(diǎn):子絕父相。需要定位的元素用absolute絕對定位剃允,其父元素用 relative相對定位沛简。還有fixed固定定位,他是以html為父元素的定位硅急。

3.flex(推薦)

flex:彈性覆享;彈性布局很好的解決了float和position的問題佳遂,非常好用营袜。
使用方法:
在父元素使用 display:flex;確定彈性作用的范圍。
然后
justify-content:center(space-around丑罪,space-between等)荚板;水平方向布局;
align-items:center(flex-start,flex-end等);垂直方向布局吩屹;

<style>
    body,ul,li{
        padding: 0;
        margin: 0;
        list-style: none;
    }
   .header{
       height: 100px;
       background-color: hotpink;
   }
   .nav{
        height: 100px;
        line-height: 100px;
        text-align: center;
        display: flex;
   }
   .nav li{
       /*子元素用絕對定位*/
       width: 100px;
       height: 100px;
       margin-left: 20px;
       background-color: yellowgreen;
   }
   .main{
       width: 1000px;
       height: 500px;
       margin: 0 auto;
       display: flex;
   }
   .article{
       width: 800px;
       height: 500px;
       background-color:yellow; 
   }
   .aside{
       width: 200px;
       height: 500px;
       background-color:skyblue; 
   }
   .footer{
       height: 100px;
       background-color: greenyellow;
   }
</style>

<body>
    <!--頭部start-->
    <div class="header">
        <!--導(dǎo)航start-->
        <ul class="nav">
            <li><a href="#">導(dǎo)航1</a></li>
            <li><a href="#">導(dǎo)航2</a></li>
            <li><a href="#">導(dǎo)航3</a></li>
        </ul>
        <!--導(dǎo)航end-->
    </div>
    <!--頭部end-->

    <!--主體start-->
    <div class="main">
        <!--文章start-->
        <div class="article"></div>
        <!--文章end-->

        <!--側(cè)邊欄start-->
        <div class="aside"></div>
        <!--側(cè)邊欄end-->

    </div>
    <!--主體end-->

    <!--底部start-->
    <div class="footer"></div>
    <!--底部end-->
</body>

不過flex不兼容IE8及以下的瀏覽器跪另。

4.grid(未正式推出)

大部分情況下flex布局已經(jīng)能滿足需要,不過flex只能用作一維布局煤搜,也就是說免绿,flex一次只能作用于一條線。如果想要進(jìn)行二維布局擦盾,必須翻轉(zhuǎn)坐標(biāo)二次彈性嘲驾,這樣會顯得不夠優(yōu)雅,這時候grid(網(wǎng)格)布局就發(fā)展起來了迹卢。
grid布局用法和flex相似辽故,但是作用于二維布局。
先在父元素使用 display:grid;確定網(wǎng)格作用范圍腐碱;
然后
grid-template-columns: 40px 50px auto 50px 40px;(行)
grid-template-rows: 25% 100px auto;(列)
等等屬性誊垢,這里只簡單介紹,大家了解有這個東西就行。

在現(xiàn)實(shí)工作用喂走,以flex為主殃饿,position輔助已經(jīng)足夠應(yīng)對所有問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末缴啡,一起剝皮案震驚了整個濱河市壁晒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌业栅,老刑警劉巖秒咐,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異碘裕,居然都是意外死亡携取,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門帮孔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雷滋,“玉大人,你說我怎么就攤上這事文兢∥钫叮” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵姆坚,是天一觀的道長澳泵。 經(jīng)常有香客問我,道長兼呵,這世上最難降的妖魔是什么兔辅? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮击喂,結(jié)果婚禮上维苔,老公的妹妹穿的比我還像新娘。我一直安慰自己懂昂,他們只是感情好介时,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著凌彬,像睡著了一般沸柔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饿序,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天勉失,我揣著相機(jī)與錄音,去河邊找鬼原探。 笑死乱凿,一個胖子當(dāng)著我的面吹牛顽素,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播徒蟆,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼胁出,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了段审?” 一聲冷哼從身側(cè)響起全蝶,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎寺枉,沒想到半個月后抑淫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡姥闪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年始苇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片筐喳。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡催式,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出避归,到底是詐尸還是另有隱情荣月,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布梳毙,位于F島的核電站哺窄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顿天。R本人自食惡果不足惜堂氯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一蔑担、第九天 我趴在偏房一處隱蔽的房頂上張望牌废。 院中可真熱鬧,春花似錦啤握、人聲如沸鸟缕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽懂从。三九已至,卻和暖如春蹲蒲,著一層夾襖步出監(jiān)牢的瞬間番甩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工届搁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留缘薛,地道東北人窍育。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像宴胧,于是被迫代替她去往敵國和親漱抓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案恕齐? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標(biāo)簽?zāi)J(rèn)的外補(bǔ)...
    _Yfling閱讀 13,759評論 1 92
  • 前言 溫馨提示:本文較長乞娄,圖片較多,本來是想寫一篇 CSS 布局方式的显歧,但是奈何 CSS 布局方式種類太多并且實(shí)現(xiàn)...
    sunshine小小倩閱讀 3,142評論 0 59
  • CSS 是什么 css(Cascading Style Sheets)仪或,層疊樣式表,選擇器{屬性:值士骤;屬性:值}h...
    崔敏嫣閱讀 1,488評論 0 5