一篇文章徹底搞定css3布局

為了方便你的閱讀,你可以先看整個(gè)文章的提綱,挑著看,選著看,這樣更節(jié)省時(shí)間,如果對(duì)各類的標(biāo)簽都比較熟悉,閱讀起來會(huì)更方便

  • 1.了解布局必須要的基礎(chǔ)

  • 1.元素的三種顯示模式

  • 塊級(jí) , 行內(nèi), 行內(nèi)塊

  • 2.css3的三大特性

  • 繼承,優(yōu)先,層疊性

  • 3.盒子外擴(kuò)和內(nèi)減模型

  • 2.布局手段

  • 浮動(dòng)

  • 定位布局

  • 伸縮布局

布局的本質(zhì)(個(gè)人理解) :

  • 所有的標(biāo)簽都是盒子

  • 而盒子的模式有3種不同的顯示模式,有橫著走的,有豎著走的

  • 而盒子還有2種模型,內(nèi)減外擴(kuò),一個(gè)變胖,一個(gè)變瘦

  • 了解了盒子個(gè)性,再了解css3的特性就能弄明白很多了

1.布局必須要的基礎(chǔ)

元素的三種模式

在學(xué)習(xí)的過程中呢,我一直是把三種模式當(dāng)成三種不同性格的人去看待,對(duì)人說人話,對(duì)鬼說鬼話,其實(shí)跟盒子的對(duì)話也是如此,除了行內(nèi)塊元素和行內(nèi)元素的組合不是預(yù)料之內(nèi)的,其他元素的組合都還是在意料之中~

因此主要向大家說一下我對(duì)行內(nèi)塊和行內(nèi)元素組合的理解,不過先簡(jiǎn)單的介紹下各類模式下元素顯示的特點(diǎn)

塊級(jí)元素

  • 總是從新的一行開始

  • 寬高,邊距都可以控制

  • 默認(rèn)寬度是容器100%

  • 可以容納其他塊元素

在這里插入圖片描述

塊級(jí)元素最聽話的盒子,可控度極高

行內(nèi)元素

  • 靠?jī)?nèi)容撐大,不可以設(shè)置寬高,但是水平方向的padding和margin可以設(shè)置

  • 和他相鄰的兄弟一行上顯示

  • 默認(rèn)寬度是自己的寬度

  • 只能容納文本或其他行內(nèi)元素

在這里插入圖片描述

我理解起來就是一句話,內(nèi)容多大,我多大.一身功夫全靠撐,可控性較低,因?yàn)闊o(wú)法設(shè)置寬高,只可控制左右內(nèi)外邊距

行內(nèi)塊元素

  • 和相鄰的行內(nèi)塊元素,在一行上顯示,但是之間會(huì)有空白間隙

  • 默認(rèn)寬度是自身內(nèi)容的寬度

  • 寬高,內(nèi)外邊距都可以控制

最典型的行內(nèi)塊,像img,input等等,行內(nèi)塊有個(gè)很有意思的特點(diǎn),就是中間會(huì)有一個(gè)間隙,就像下圖截屏的那個(gè)樣子,原因是當(dāng)行內(nèi)元素之間有“回車”立宜、“tab”彩届、“空格”時(shí)就會(huì)出現(xiàn)間隙俩檬。但是如何把他去掉呢,有2比較個(gè)最簡(jiǎn)單的方法,當(dāng)然直接采用浮動(dòng)也是可以的,或者切換盒子的顯示模式,改為塊級(jí)元素

在這里插入圖片描述
  • 把相鄰的行內(nèi)塊的代碼塊放在一行上顯示,就可以去掉這個(gè)間隙了

  • 套一個(gè)父盒子,設(shè)置父盒子的font-size:0

在這里插入圖片描述
在這里插入圖片描述

最容易出問題的行內(nèi)與行內(nèi)塊組合,最讓人頭疼

在這里插入圖片描述

這是因?yàn)橄竦湫偷膇nput , img這些行內(nèi)塊標(biāo)簽和和行內(nèi)標(biāo)簽在行內(nèi)垂直方向默認(rèn)是以基線(baseline)對(duì)齊的,圖片基線在圖片底部,而文字基線卻在文字中點(diǎn)偏下的位置,所以才會(huì)顯示成上圖的樣子漾岳。

在這里插入圖片描述
在這里插入圖片描述

解決方案

vertical-align屬性,垂直對(duì)齊狸臣,它只針對(duì)于行內(nèi)元素或者行內(nèi)塊元素莹桅, 通常用來控制圖片/表單與文字的對(duì)齊。


vertical-align : baseline |top |middle |bottom

//頂部對(duì)齊(設(shè)置給行內(nèi)塊元素)

vertical-align : top ;

//垂直居中

vertical-align : middle ;

//底部對(duì)齊

vertical-align : bottom ;

css三大特性

了解特性可以解決很多css3中出現(xiàn)的奇怪問題

  • 繼承性

    • 子承父業(yè),子元素會(huì)繼承父元素的屬性,你會(huì)繼承你老爹的財(cái)產(chǎn)一樣去理解就好
  • 優(yōu)先性

    • 主要是要了解不同標(biāo)簽的權(quán)重不一樣,這個(gè)特性會(huì)讓布局的時(shí)候bug出現(xiàn)頻次加多,通常表現(xiàn)為選擇器不生效

一張表格足以理解各類選擇器的權(quán)重問題

|繼承的貢獻(xiàn)值 |0,0,0,0 |

|--|--|

| 每個(gè)標(biāo)簽的貢獻(xiàn)值(div) | 0,0,0,1 |

| 每個(gè)類,偽類的貢獻(xiàn)值(.box) |0,0,1,0 |

| 每個(gè)id的貢獻(xiàn)(#box) | 0,1,0,0 |

| 每個(gè)行內(nèi)樣式的貢獻(xiàn)| 1,0,0,0 |

| 每個(gè)!important的貢獻(xiàn) | 無(wú)窮大 |

  • 層疊性

    • 很好理解,就是css代碼是從上往下執(zhí)行,后面的樣式如果和前面的樣式重疊,那后面的樣式就會(huì)覆蓋前面的樣式

盒子的外擴(kuò)和內(nèi)減模型

學(xué)習(xí)盒子模型的時(shí)候烛亦,盒子真實(shí)寬高計(jì)算方式如下:

真實(shí)寬高 = 設(shè)置寬高 + border + padding诈泼;這種方式,我們成為外擴(kuò)模型煤禽。受一個(gè)屬性控制:box-sizing铐达;其實(shí)盒子主要有兩種模型,一種是外擴(kuò),另外一種是內(nèi)減,看代碼就很好理解了

1.box-sizing:content-box;(外擴(kuò)模型)


div {

    box-sizing: content-box;

width: 200px;

height: 200px;

border: 50px solid red;

}

該模型為默認(rèn)值,盒子的真實(shí)寬高 = 設(shè)置的寬高 + border + padding檬果。

2.box-sizing:border-box;(內(nèi)減模型)


div {

    box-sizing: border-box;

width: 200px;

height: 200px;

border: 50px solid red;

}

該模型下瓮孙,border與padding會(huì)首先去壓縮內(nèi)容區(qū)的空間唐断,寬高為設(shè)置寬高。如果里面的內(nèi)容全部被壓縮完了,才會(huì)向外擴(kuò)展

#布局手段

1.浮動(dòng)

剛學(xué)浮動(dòng)的時(shí)候,反正我是一臉懵逼,不知道盒子到底怎么了,是不是感冒了,不聽話,各種浮動(dòng)帶來的影響讓人錯(cuò)不及防,直到最后,理解了2句話,就慢慢開始了解浮動(dòng)了,現(xiàn)在把它分享給你

  • 浮動(dòng)的目的是為了讓多個(gè)盒子在一行上顯示

  • 頁(yè)面是一個(gè)魚塘,而浮動(dòng)的元素像飄在水上面的魚,沒浮動(dòng)的元素在水底(標(biāo)準(zhǔn)流盒子在浮動(dòng)盒子底下)


//不浮動(dòng) | 左浮動(dòng) | 右浮動(dòng)

選擇器 { float: none | left | right; }

在這里插入圖片描述

上面張圖已經(jīng)很形象的說明浮動(dòng)了,不過還需要有一個(gè)注意的點(diǎn):

float屬性會(huì)隱性改變?cè)氐膁isplay屬性為inline -block(行內(nèi)塊) 而且中間沒有間隙

當(dāng)然,其實(shí)浮動(dòng)的初始目的是為了做文字環(huán)繞效果的,所以避免不了浮動(dòng)在做布局的時(shí)候會(huì)帶來一些影響

清楚浮動(dòng)

清除浮動(dòng)主要為了解決父級(jí)元素因?yàn)樽蛹?jí)浮動(dòng)引起內(nèi)部高度為0 的問題杭抠。清除浮動(dòng)之后脸甘, 父級(jí)就會(huì)根據(jù)浮動(dòng)的子盒子自動(dòng)檢測(cè)高度。父級(jí)有了高度偏灿,就不會(huì)影響下面的標(biāo)準(zhǔn)流了


方法1:給父親添加overflow屬性方法

給父級(jí)添加: overflow為 hidden| auto| scroll  都可以實(shí)現(xiàn)丹诀。

-----------------------------------------

方法2:使用after偽元素清除 (推薦)

.clearfix:after { 

content: ""; display: block;

height: 0;

clear: both;

visibility: hidden;

} 

.clearfix {

*zoom: 1;

}  /* IE6、7 專有 */

----------------------------------------

方法3:使用雙偽元素清除浮動(dòng)

.clearfix:before,.clearfix:after {

  content:"";

  display:table;

}

.clearfix:after {

clear:both;

}

.clearfix {

  *zoom:1;

}

2.定位(position)

定位 = 定位模式 + 邊偏移

選擇器 { position: 屬性值; }

先看定位模式

1.靜態(tài)定位(static)

  • 相當(dāng)于默認(rèn)定位,靜態(tài)定位就是沒有定位,但是也算定位....好繞

  • 沒有邊偏移,沒法用position屬性動(dòng)來動(dòng)去

2.相對(duì)定位(relative)

  • 相對(duì)定位的邊偏移,相對(duì)于自己原來在標(biāo)準(zhǔn)流中位置來移動(dòng)的 , 這個(gè)定位的盒子還是標(biāo)準(zhǔn)流,在魚塘底下的

  • 后面的盒子仍然以標(biāo)準(zhǔn)流的方式對(duì)待它翁垂。

3.絕對(duì)定位(需要搭配父親一起使用)(absolute)

  • 絕對(duì)定位是元素以帶有定位的父級(jí)元素來移動(dòng)位置, 父元素沒有定位忿墅,則以瀏覽器為準(zhǔn)定位

  • 完全脫標(biāo) —— 完全不占位置 , 也就是浮在魚塘最上面的盒子

4.固定定位(fixed)

  • 完全脫標(biāo) —— 完全不占位置,也是浮起來的

  • 只認(rèn)瀏覽器的可視窗口 —— 瀏覽器可視窗口 + 邊偏移屬性 來設(shè)置元素的位置;

  • 跟父元素沒有任何關(guān)系沮峡;單獨(dú)使用的

  • 不隨滾動(dòng)條滾動(dòng)

  • IE 6 等低版本瀏覽器不支持固定定位

子絕父相

  • 子絕父相的搭配使用是比較多的,子級(jí)是絕對(duì)定位,脫標(biāo),浮在水面上

  • 父級(jí)是相對(duì)定位,標(biāo)準(zhǔn)流占有位子,老老實(shí)實(shí)躺在池塘底部

  • 理解:子元素在標(biāo)準(zhǔn)流的父親的懷里隨心所欲~

再看邊偏移

簡(jiǎn)單來說就是上下左右

在這里插入圖片描述

3.盒模型Flex布局

盒模型也叫彈性布局,這個(gè)布局的手段就就很牛逼了,雖然布局手段沒有誰(shuí)強(qiáng)誰(shuí)弱,主要看適用的場(chǎng)景(但是彈性布局真的是心中的老大哥)

他主要做了啥了?

加buff , 加buff , 加buff , 讓盒子變得異常的強(qiáng)大和聽話,就像是一位將軍,在指揮上千個(gè)將士排兵布陣一樣~

強(qiáng)大到他可以合理的去分配每一個(gè)盒子,就像是在戰(zhàn)場(chǎng)上讓士兵合理的分配站位一樣

伸縮布局三要素:

  • 子元素

  • 主軸

  • 次軸

在這里插入圖片描述

舉幾個(gè)簡(jiǎn)單的例子

我要你們每個(gè)人寬度一樣,占滿盒子


.box{

            width: 1000px;

            height: 200px;

            margin: 50px auto;

            border: 2px solid #000;

            /* 伸縮布局(彈性布局):給盒子加buff */

            display: flex;

        }

.box>div{

            flex: 1;

            /* 子元素寬度比例為1  */

        }

在這里插入圖片描述
  • 設(shè)為 Flex 布局以后疚脐,子元素的float、clear和vertical-align屬性將失效邢疙。

  • 主軸與次軸一定是垂直的棍弄,如果把主軸方向改為垂直,次軸方向自動(dòng)變成水平

  • 默認(rèn)主軸向右

主軸排列方向:(flex-direction)


row:默認(rèn)值:  主軸水平 疟游,從左往右

flex-direction: row;

主軸水平 呼畸,從右往左

flex-direction: row-reverse;

主軸垂直 ,從上往下

flex-direction: column;

主軸垂直 颁虐,從下往上

flex-direction: column-reverse;

主軸排列方式


默認(rèn):左對(duì)齊

justify-content: flex-start;

右對(duì)齊

justify-content: flex-end;

居中對(duì)齊

justify-content: center;

兩端對(duì)齊:每一個(gè)盒子中間的間距相同

justify-content: space-between;

每一個(gè)盒子兩邊間距相同(平均)

justify-content: space-around;

主軸換行(flex-wrap)

  • 生效前提: 子元素一行放不下

  • 默認(rèn)是不換行,如果一行放不下,會(huì)把子元素進(jìn)行等比例縮放


  <div class="box">

        <div style="background-color:green;font-size: 20px">1</div>

        <div style="background-color:pink">2</div>

        <div style="background-color:hotpink">3</div>

        <div style="background-color:purple">4</div>

        <div style="background-color:blue">5/div>

        <div style="background-color:yellowgreen">6</div>

        <div style="background-color:gold">7</div>

        <div style="background-color:skyblue">8</div>

    </div>



.box{

            width: 1000px;

            height: 300px;

            margin: 50px auto;

            border: 2px solid #000;

            display: flex;

        }

  .box>div{

            width: 200px;

            height: 100px;

        }

執(zhí)行效果:(等比例縮放)

在這里插入圖片描述

換行:

a.默認(rèn)值:不換行

flex-wrap: nowrap;



允許換行:第一行在上方

flex-wrap: wrap;



反向換行:第一行在下方

flex-wrap: wrap-reverse;

換行(wrap)

在這里插入圖片描述

次軸排列方式

  • 注意點(diǎn):主軸與次軸一定是垂直的蛮原,如果把主軸方向改為垂直,次軸方向自動(dòng)變成水平

頂部對(duì)齊

align-items: flex-start;

底部對(duì)齊

align-items: flex-end;

居中對(duì)齊

align-items: center;

默認(rèn)值:平鋪鋪滿. 前提是不能設(shè)置高度

align-items: stretch;

文字基線對(duì)齊

align-items: baseline;

多行排列方式(align-content)

注意點(diǎn):一行不起作用另绩,只對(duì)多行起作用

直接上代碼演示


.box{

            width: 1000px;

            height: 250px;

            margin: 50px auto;

            border: 2px solid #000;

            display: flex;

            flex-direction: row;

            justify-content: flex-start;

            align-items: flex-start;

            flex-wrap: wrap; 

            //添加的align-content 放這里

            }

.box>div{

            width: 200px;

            height: 100px;

        }



  <div class="box">

        <div style="background-color:green;font-size: 20px">1</div>

        <div style="background-color:pink">2</div>

        <div style="background-color:hotpink">3</div>

        <div style="background-color:purple">4</div>

        <div style="background-color:blue">5</div>

        <div style="background-color:yellowgreen">6                                                                                                                                    </div>

        <div style="background-color:gold">7</div>

        <div style="background-color:skyblue">8</div>

    </div>


頂部對(duì)齊

align-content: flex-start;

底部對(duì)齊

align-content: flex-end;

居中對(duì)齊

align-content: center;

兩端對(duì)齊:中間間距相等

align-content: space-between;

間距相等: 中間行的間距就是邊緣的2倍

align-content: space-around;

行平鋪

align-content: stretch;

頂對(duì)齊:

頂對(duì)齊

底對(duì)齊:
在這里插入圖片描述

居中對(duì)齊:

在這里插入圖片描述

兩端對(duì)齊:

在這里插入圖片描述

間距相等

在這里插入圖片描述

行平鋪

在這里插入圖片描述

當(dāng)然,在伸縮布局中還有很多更多強(qiáng)大的屬性和布局方式,強(qiáng)烈推薦大家可以看一下阮一峰老師寫的flex布局~

如果有寫的錯(cuò)誤的地方,還望多指正~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末儒陨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笋籽,更是在濱河造成了極大的恐慌蹦漠,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件车海,死亡現(xiàn)場(chǎng)離奇詭異笛园,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)侍芝,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門研铆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人州叠,你說我怎么就攤上這事棵红。” “怎么了留量?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵窄赋,是天一觀的道長(zhǎng)哟冬。 經(jīng)常有香客問我楼熄,道長(zhǎng)忆绰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任可岂,我火速辦了婚禮错敢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缕粹。我一直安慰自己稚茅,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布平斩。 她就那樣靜靜地躺著亚享,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绘面。 梳的紋絲不亂的頭發(fā)上欺税,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音揭璃,去河邊找鬼晚凿。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瘦馍,可吹牛的內(nèi)容都是我干的歼秽。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼情组,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼燥筷!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起院崇,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤荆责,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后亚脆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體做院,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年濒持,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了键耕。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡柑营,死狀恐怖屈雄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情官套,我是刑警寧澤酒奶,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布蚁孔,位于F島的核電站,受9級(jí)特大地震影響惋嚎,放射性物質(zhì)發(fā)生泄漏杠氢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一另伍、第九天 我趴在偏房一處隱蔽的房頂上張望鼻百。 院中可真熱鬧,春花似錦摆尝、人聲如沸温艇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)勺爱。三九已至,卻和暖如春讯检,著一層夾襖步出監(jiān)牢的瞬間琐鲁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工视哑, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绣否,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓挡毅,卻偏偏與公主長(zhǎng)得像蒜撮,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子跪呈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348