學(xué)習(xí)布局前須知道 CSS 中的定位機(jī)制。
標(biāo)準(zhǔn)文檔流,從上到下,從左到右的輸出文檔內(nèi)容。它由塊級(jí)(block)元素和行級(jí)元素組成,且它們都是盒子模型。
下面為 Firefox 布局可視化 Gecko Reflow Visualisation,布局是指瀏覽器將元素以正確的大小擺放在正確的位置上。
設(shè)置元素的顯示方式
display | 默認(rèn)寬度 | 可設(shè)置寬高 | 起始位置 |
---|---|---|---|
block | 父元素寬度 | 是 | 換行 |
inline | 內(nèi)容寬度 | 否 | 同行 |
inline-block | 內(nèi)容寬度 | 是 | 同行 |
<div>
, <p>
, <h1>
~ <h6>
, <ul>
, <form>
<span>
, <a>
, <label>
, <cite>
, <em>
<input>
, <textarea>
, <select>
, <button>
display:none
與 visibility:hidden
的區(qū)別為 display:none
不顯示且不占位,但 visibility:hidden
不顯示但占位。
position
用于設(shè)置定位的方式與top
right
bottom
left
z-index
則用于設(shè)置參照物位置(必須配合定位一同使用)。
三種定位形式
position: static | relative | absolute | fixed
/* 默認(rèn)值為 static */
NOTE:最常用的目的為改變?cè)貙蛹?jí)和設(shè)置為絕對(duì)定位的參照物。
建立以包含塊為基準(zhǔn)的定位,其隨即擁有偏移屬性和 z-index
屬性。
<html>
元素)NOTE:寬高的100%的參照依然為視窗(例:網(wǎng)頁(yè)遮罩效果)
其用于設(shè)置元素邊緣與參照物邊緣的距離,且設(shè)置的值可為負(fù)值。在同時(shí)設(shè)置相對(duì)方向時(shí),元素將被拉伸。
其用于設(shè)置 Z 軸上得排序,默認(rèn)值為 0 但可設(shè)置為負(fù)值。(如不做設(shè)置,則按照文檔流的順序排列。后面的元素將置于前面的元素之上)
父類容器的 z-index
優(yōu)于子類 z-index
如圖
CSS 中規(guī)定的定位機(jī)制,其可實(shí)現(xiàn)塊級(jí)元素同行顯示并存在于文檔流之中。浮動(dòng)僅僅影響文檔流中下一個(gè)緊鄰的元素。
float: left | right | none | inherit
position
脫離文檔流的方式不同)float 元素在同一文檔流中,當(dāng)同時(shí)進(jìn)行 float
時(shí)它們會(huì)按照文檔流中的順序排列。(當(dāng)所有父元素中的所有元素脫離文檔流之后,父元素將失去原有默認(rèn)的內(nèi)容高度)
注意:float 元素是半脫離文檔流的,對(duì)元素是脫離文檔流,但對(duì)于內(nèi)容則是在文檔流之中的(既元素重疊但內(nèi)容不重疊)。
clear: both | left | right | none | inherit
使用方法:
優(yōu)先級(jí)自上而下
.emptyDiv {clear: both}
width: 100% overflow: hidden
也可<br>
不建議使用,影響 HTML 結(jié)構(gòu)/* clearfix */
.clearfix:after {
content: "."; /* Older browser do not support empty content */
visibility: hidden;
display: block;
height: 0;
clear: both;
}
.clearfix {zoom: 1;} /* 針對(duì) IE 不支持 :after */
彈性布局可用于多行自適應(yīng),多列自適應(yīng),間距自適應(yīng)和任意對(duì)齊。
創(chuàng)建 flex container
display: flex
/* 彈性容器內(nèi)的均為彈性元素*/
flex item
只有彈性容器在文檔流中的子元素才屬于彈性元素。
<div style="display: flex;">
<div>Block Element</div>
<!-- flex item: YES-->
<span>Inline Element</span>
<!-- flex item: YES-->
<div style="position:absolute;">Absolute Block Element</div>
<!-- flex item: YES-->
</div>
<!-- 默認(rèn)值為 row -->
flex-direction: row | row-reverse | column | column-reverse
<!-- 默認(rèn)值為 nowrap -->
flex-wrap: nowrap | wrap | wrap-reverse
flex-flow
為 flex-wrap
與 flex-direction
的簡(jiǎn)寫,建議使用此屬性(避免同時(shí)使用兩個(gè)屬性來(lái)修改)。
flex-flow: <'flex-direction'> || <'flex-wrap'>
order
的值為相對(duì)的(同被設(shè)置和未被設(shè)置的值相比較),當(dāng)均為設(shè)置時(shí)默認(rèn)值為 0 則按照文檔流中的順序排列。
order: <integer>
<!-- 默認(rèn)為 0 -->
其用于設(shè)置 flex-item
的初始寬高(并作為彈性的基礎(chǔ))。如果 flex-direction
是以 row
排列則設(shè)置寬,如以 column
排列則設(shè)置高。
flex-basis: main-size | <width>
伸展因子,其為彈性布局中最重要的元素之一,flex-grow
設(shè)置元素可用空余空間的比例。flex-container
先安裝寬度(flex-basis
)進(jìn)行布局,如果有空余空間就按照 flex-grow
中的比例進(jìn)行分配。
Width/Height = flex-basis + flex-grow/sum(flow-grow) * remain
flex-grow: <number>
initial: 0
<!-- 默認(rèn)值為 0 -->
收縮因子,用于分配超出的負(fù)空間如何從可用空間中進(jìn)行縮減。
flex-shrink: <number>
initial: 1
<!-- 默認(rèn)值為 1 -->
Width/Height = flex-basis + flow-shrink/sum(flow-shrink) * remain
remain 為負(fù)值,既超出的區(qū)域。
其為 flex-grow
flex-shrink
flex-basis
的值縮寫。
flex: <'flex-grow'> || <'flex-shrink'> || <'flex-basis'>
initial: 0 1 main-size
其用于設(shè)置主軸(main-axis)上的對(duì)其方式。彈性元素根據(jù)主軸(橫向和縱向均可)定位所以不可使用 left
與 right
因?yàn)槲恢脼橄鄬?duì)的。(行為相似的屬性有 text-align
)
justify-content: flex-start | flex-end | center | space-between | space-around
<!-- 默認(rèn)值為 flex-start -->
其用于設(shè)置副軸(cross-axis)上的對(duì)其方式。(行為相似的屬性有 vertical-align
)
align-items: flex-start | flex-end | center | baseline | stretch
<!-- 默認(rèn)值為 stretch -->
其用于設(shè)置單個(gè) flex-item
在 cross-axis 方向上的對(duì)其方式。
align-self: auto | flex-start | flex-end | center | baseline | stretch
<!-- 默認(rèn)值為 auto -->
其用于設(shè)置 cross-axis 方向上的對(duì)其方式。
align-content:flex-start | flex-end | center | space-between | space-around | stretch
<!-- 默認(rèn)為 stretch -->
更多建議: