非同步和執行緒池
CSS flex佈局(彈性佈局/彈性盒子)
Flex 是 Flexible Box 的縮寫,意為“彈性佈局”或者“彈性盒子”,是 CSS3 中的一種新的佈局模式,可以簡便、完整、響應式地實現各種頁面佈局,當頁面需要適應不同的螢幕大小以及裝置型別時非常適用。目前,幾乎所有的瀏覽器都支援 Flex 佈局。
1. 基本概念
採用 Flex 佈局的元素,稱為 Flex 容器(flex container),簡稱“容器”。它的所有子元素自動成為容器成員,稱為 Flex 專案(flex item),簡稱“專案”。容器預設存在兩根軸,分別為水平的主軸(main axis)和垂直的交叉軸(cross axis)。主軸的開始位置叫做 main start,結束位置叫做 main end;交叉軸的開始位置叫做 cross start,結束位置叫做 cross end。專案預設沿主軸排列。單個專案佔據的主軸空間叫做 main size,佔據的交叉軸空間叫做 cross size。如下圖所示:
圖:Flex 容器
提示:您可以通過將元素的 display 屬性設定為 flex(生成塊級 flex 容器)或 inline-flex(生成類似 inline-block 的行內塊級 flex 容器)。當一個元素設定了 Flex 佈局以後,其子元素的 float、clear 和 vertical-align 等屬性將失效。
CSS 中提供了以下屬性來實現 Flex 佈局:
屬性 | 描述 |
---|---|
display | 指定 HTML 元素的盒子型別 |
flex-direction | 指定彈性盒子中子元素的排列方式 |
flex-wrap | 設定當彈性盒子的子元素超出父容器時是否換行 |
flex-flow | flex-direction 和 flex-wrap 兩個屬性的簡寫 |
justify-content | 設定彈性盒子中元素在主軸(橫軸)方向上的對齊方式 |
align-items | 設定彈性盒子中元素在側軸(縱軸)方向上的對齊方式 |
align-content | 修改 flex-wrap 屬性的行為,類似 align-items,但不是設定子元素對齊,而是設定行對齊 |
order | 設定彈性盒子中子元素的排列順序 |
align-self | 在彈性盒子的子元素上使用,用來覆蓋容器的 align-items 屬性 |
flex | 設定彈性盒子中子元素如何分配空間 |
flex-grow | 設定彈性盒子的擴充套件比率 |
flex-shrink | 設定彈性盒子的收縮比率 |
flex-basis | 設定彈性盒子伸縮基準值 |
按照作用範圍的不同,這些屬性可以分為兩類,分別為容器屬性(flex-direction、flex-wrap、flex-flow、justify-content、align-items、align-content)和專案屬性(order、align-self、flex、flex-grow、flex-shrink、flex-basis)。下面就來介紹一下這些屬性的使用。
2. 容器屬性
1) flex-direction
flex-direction 屬性用來決定主軸的方向(即專案的排列方向),屬性的可選值如下:
值 | 描述 |
---|---|
row | 預設值,主軸沿水平方向從左到右 |
row-reverse | 主軸沿水平方向從右到左 |
column | 主軸沿垂直方向從上到下 |
column-reverse | 主軸沿垂直方向從下到上 |
initial | 將此屬性設定為屬性的預設值 |
inherit | 從父元素繼承此屬性的值 |
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- #main {
- border: 1px solid #CCC;
- padding: 5px;
- position: relative;
- }
- .row, .row_reverse, .column, .column_reverse{
- display: flex;
- margin-bottom: 5px;
- }
- .row {
- flex-direction: row;
- }
- .row_reverse {
- flex-direction: row-reverse;
- }
- .column {
- flex-direction: column;
- }
- .column_reverse {
- flex-direction: column-reverse;
- position: absolute;
- top: 120px;
- left: 400px;
- }
- .row div, .row_reverse div, .column div, .column_reverse div {
- width: 50px;
- height: 50px;
- border: 1px solid black;
- }
- </style>
- </head>
- <body>
- <div id="main">
- <div class="row">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- <div class="row_reverse">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- <div class="column">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- <div class="column_reverse">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:flex-direction 屬性演示
2) flex-wrap
flex-wrap 屬性用來設定當彈性盒子的子元素(專案)超出父容器時是否換行,屬性的可選值如下:
值 | 描述 |
---|---|
nowrap | 預設值,表示專案不會換行 |
wrap | 表示專案會在需要時換行 |
wrap-reverse | 表示專案會在需要時換行,但會以相反的順序 |
initial | 將此屬性設定為屬性的預設值 |
inherit | 從父元素繼承屬性的值 |
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- #main {
- border: 1px solid #CCC;
- padding: 5px;
- }
- .nowrap, .wrap, .wrap_reverse {
- display: flex;
- flex-direction: row;
- margin-bottom: 15px;
- }
- .nowrap {
- flex-wrap: nowrap;
- }
- .wrap {
- flex-wrap: wrap;
- }
- .wrap_reverse {
- flex-wrap: wrap-reverse;
- }
- .nowrap div, .wrap div, .wrap_reverse div {
- width: 70px;
- height: 50px;
- border: 1px solid black;
- }
- </style>
- </head>
- <body>
- <div id="main">
- <div class="nowrap">
- <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div>
- </div>
- <div class="wrap">
- <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div>
- </div>
- <div class="wrap_reverse">
- <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div>
- </div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:flex-wrap 屬性演示
3) flex-flow
flex-flow 屬性是 flex-direction 和 flex-wrap 兩個屬性的簡寫,語法格式如下:
flex-flow: flex-direction flex-wrap;
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- .flex_flow {
- display: flex;
- flex-flow: row-reverse wrap;
- }
- .flex_flow div {
- width: 60px;
- height: 60px;
- margin-bottom: 5px;
- border: 1px solid black;
- }
- </style>
- </head>
- <body>
- <div class="flex_flow">
- <div>1</div><div>2</div><div>3</div><div>4</div><div>5</div><div>6</div><div>7</div><div>8</div><div>9</div><div>10</div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:flex-flow 屬性演示
4) justify-content
justify-content 屬性用於設定彈性盒子中元素在主軸(橫軸)方向上的對齊方式,屬性的可選值如下:
值 | 描述 |
---|---|
flex-start | 預設值,左對齊 |
flex-end | 右對齊 |
center | 居中 |
space-between | 兩端對齊,專案之間的間隔是相等的 |
space-around | 每個專案兩側的間隔相等 |
initial | 將此屬性設定為屬性的預設值 |
inherit | 從父元素繼承屬性的值 |
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- .flex {
- display: flex;
- flex-flow: row wrap;
- margin-top: 10px;
- }
- .flex div {
- width: 60px;
- height: 60px;
- margin-bottom: 5px;
- border: 1px solid black;
- }
- .flex-start {
- justify-content: flex-start;
- }
- .flex-end {
- justify-content: flex-end;
- }
- .center {
- justify-content: center;
- }
- .space-between {
- justify-content: space-between;
- }
- .space-around {
- justify-content: space-around;
- }
- </style>
- </head>
- <body>
- <div class="flex flex-start">
- <div>A</div><div>B</div><div>C</div><div>D</div>
- </div>
- <div class="flex flex-end">
- <div>A</div><div>B</div><div>C</div><div>D</div>
- </div>
- <div class="flex center">
- <div>A</div><div>B</div><div>C</div><div>D</div>
- </div>
- <div class="flex space-between">
- <div>A</div><div>B</div><div>C</div><div>D</div>
- </div>
- <div class="flex space-around">
- <div>A</div><div>B</div><div>C</div><div>D</div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:justify-content 屬性演示
5) align-items
align-items 屬性用來設定彈性盒子中元素在側軸(縱軸)方向上的對齊方式,屬性的可選值如下:
值 | 描述 |
---|---|
stretch | 預設值,專案將被拉伸以適合容器 |
center | 專案位於容器的中央 |
flex-start | 專案位於容器的頂部 |
flex-end | 專案位於容器的底部 |
baseline | 專案與容器的基線對齊 |
initial | 將此屬性設定為屬性的預設值 |
inherit | 從父元素繼承屬性的值 |
幾個屬性值的效果如下圖所示:
圖:align-items 屬性演示
6) align-content
align-content 屬性與 justify-content 屬性類似,可以在彈性盒子的側軸還有多餘空間時調整容器內專案的對齊方式,屬性的可選值如下:
值 | 描述 |
---|---|
stretch | 預設值,將專案拉伸以佔據剩餘空間 |
center | 專案在容器內居中排布 |
flex-start | 專案在容器的頂部排列 |
flex-end | 專案在容器的底部排列 |
space-between | 多行專案均勻分佈在容器中,其中第一行分佈在容器的頂部,最後一行分佈在容器的底部 |
space-around | 多行專案均勻分佈在容器中,並且每行的間距(包括離容器邊緣的間距)都相等 |
initial | 將此屬性設定為屬性的預設值 |
inherit | 從父元素繼承該屬性的值 |
幾個屬性值的效果如下圖所示:
圖:align-content 屬性演示
3. 專案屬性
1) order
order 屬性用來設定專案在容器中出現的順序,您可以通過具體的數值來定義專案在容器中的位置,屬性的語法格式如下:
order: number;
其中 number 就是專案在容器中的位置,預設值為 0。
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- .flex {
- display: flex;
- flex-flow: row wrap;
- margin-top: 10px;
- }
- .flex div {
- width: 60px;
- height: 60px;
- margin-bottom: 5px;
- border: 1px solid black;
- }
- .flex div:nth-child(1) {
- order: 5;
- }
- .flex div:nth-child(2) {
- order: 3;
- }
- .flex div:nth-child(3) {
- order: 1;
- }
- .flex div:nth-child(4) {
- order: 2;
- }
- .flex div:nth-child(5) {
- order: 4;
- }
- </style>
- </head>
- <body>
- <div class="flex">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:order 屬性演示
2) align-self
align-self 屬性允許您為某個專案設定不同於其它專案的對齊方式,該屬性可以覆蓋 align-items 屬性的值。align-self 屬性的可選值如下:
值 | 描述 |
---|---|
auto | 預設值,表示元素將繼承其父容器的 align-items 屬性值,如果沒有父容器,則為“stretch” |
stretch | 專案將被拉伸以適合容器 |
center | 專案位於容器的中央 |
flex-start | 專案位於容器的頂部 |
flex-end | 專案位於容器的底部 |
baseline | 專案與容器的基線對齊 |
initial | 將此屬性設定為屬性的預設值 |
inherit | 從父元素繼承屬性的值 |
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- .flex {
- display: flex;
- flex-flow: row wrap;
- align-items: flex-end;
- border: 1px solid #CCC;
- height: 150px;
- }
- .flex div {
- width: 60px;
- height: 60px;
- border: 1px solid black;
- }
- .flex div:nth-child(4) {
- align-self: flex-start;
- }
- </style>
- </head>
- <body>
- <div class="flex">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:align-self 屬性演示
3) flex
flex 屬性是 flex-grow、flex-shrink 和 flex-basis 三個屬性的簡寫,語法格式如下:
flex: flex-grow flex-shrink flex-basis;
引數說明如下:
- flex-grow:(必填引數)一個數字,用來設定專案相對於其他專案的增長量,預設值為 0;
- flex-shrink:(選填引數)一個數字,用來設定專案相對於其他專案的收縮量,預設值為 1;
- flex-basis:(選填引數)專案的長度,合法值為 auto(預設值,表示自動)、inherit(表示從父元素繼承該屬性的值) 或者以具體的值加 "%"、"px"、"em" 等單位的形式。
另外,flex 屬性還有兩個快捷值,分別為 auto(1 1 auto)和 none(0 0 auto)。
示例程式碼如下:
- <!DOCTYPE html>
- <html lang="en">
- <head>
- <style>
- .flex {
- display: flex;
- flex-flow: row wrap;
- align-items: flex-end;
- border: 1px solid #CCC;
- }
- .flex div {
- width: 60px;
- height: 60px;
- border: 1px solid black;
- }
- .flex div:nth-child(2) {
- flex:0;
- }
- .flex div:nth-child(4) {
- flex:1 1 auto;
- }
- </style>
- </head>
- <body>
- <div class="flex">
- <div>A</div><div>B</div><div>C</div><div>D</div><div>E</div>
- </div>
- </body>
- </html>
執行結果如下圖所示:
圖:flex 屬性演示
另外,除了可以使用 flex 屬性外,您也可以使用 flex-grow、flex-shrink、flex-basis 幾個屬性來分別設定專案的增長量、收縮量以及專案長度,例如:
- .flex div:nth-child(4) {
- flex-grow: 1;
- flex-shrink: 1;
- flex-basis: auto;
- /* 等同於 flex:1 1 auto; */
- }