使用 flexbox 可以帮助你设计出引人注目的布局,并且在pc端或移动端能够很好的缩放。告别使用浮动的 <div>
元素、绝对定位 和一些JavaScript hacks, 使用仅仅几行 CSS 就可以构建出水平或垂直方向的布局。下面是一些基本的使用案例:
- 你想要将一个元素放在页面的中间
- 你想要一组在垂直方向可以一个紧挨一个的布局容器
- 你像要创建一行按钮或者其它元素,这些元素在小屏幕中可以垂直折叠
这篇文章只囊括了在不使用前缀就可以支持现行标准的浏览器下如何使用 flexbox 的相关信息。 想了解更多关于带有供应商前缀的老版本浏览器的资料,请点击这里 the more general guide to using CSS flexible boxes.
基础EDIT
如果你想让元素呈水平或柱状,或如果你想让元素垂直布局,在任何 <div>
元素中,通过设置 display
属性为 flex 来使用flexbox,然后设置它任意一行的 flex-flow
属性, 你就可以在其中尽情的创建元素了。如果你正在使用水平的 flexbox,并想让你的内容垂直换行,只需指定值为wrap。
接下来,只要你想让某个元素使用弹性布局,就为它添加 flex
属性。一般情况下,你将会使用下列三个值之一:
- 如果你想让元素仅仅使用它本身的宽度,比如按钮,则设置
flex: none
,none 将会被解释为0 0 auto
. - 如果想要一个固定大小的元素,则设置
flex: 0 0 size。
如:flex 0 0 60px。
- 如果你想让元素自动扩展到可以利用的空间,如果有多个这种类型的元素,它们可以平均分配空间,则设置
flex: auto,它代表
1 1 auto
.
有可能还有使用方法,但是这应该囊括了最基本的使用案例。让我们用几个例子来看看如何使用。
示例 1: 在页面中把一个元素居中EDIT
在这个例子中,要做的最简单的事情就是创建两个 flexbox,其中一个在另一个中。每个 flexbox 有三个元素:其中两个当作中间元素的垫子,另一个就是中间元素本身。
1 <html> 2 <head> 3 <meta charset="utf-8"> 4 <title>test</title> 5 <style> 6 .vertical-box { 7 display: flex; 8 height: 400px; 9 400px; 10 flex-flow: column; 11 } 12 .horizontal-box { 13 display: flex; 14 flex-flow: row; 15 } 16 .spacer { 17 /*元素自动扩展到可以利用的空间,如果有多个这种类型的元素,它们可以平均分配空间,则设置 flex: auto,它代表 1 1 auto.*/ 18 flex: auto; 19 background-color: blue; 20 } 21 .centered-element { 22 /*如果你想让元素仅仅使用它本身的宽度,比如按钮,则设置 flex: none,none 将会被解释为 0 0 auto.*/ 23 flex: none; 24 background-color: white; 25 } 26 </style> 27 </head> 28 <body> 29 <div class="vertical-box"> 30 <div class="spacer"></div> 31 <div class="centered-element horizontal-box"> 32 <div class="spacer"></div> 33 <div class="centered-element">Centered content</div> 34 <div class="spacer"></div> 35 </div> 36 <div class="spacer"></div> 37 </div> 38 </body> 39 </html>
示例2: 垂直放置一系列的容器EDIT
假设你有一个带有头部区域,内容区域,和底部区域的页面。头部和底部应该有一个固定的尺寸,但是内容区域应该根据可以利用的空间来缩放。这可以通过设置内容区域的 flex
属性,设置头部区域 flex
属性,底部区域不设置来实现自动扩展功能。
1 <html> 2 <head> 3 <meta charset="UTF-8"> 4 <title>index</title> 5 <style> 6 .vertical-box { 7 display: flex; 8 height: 400px; 9 400px; 10 flex-flow: column; 11 } 12 .fixed-size { 13 flex: none; 14 height: 30px; 15 background-color: black; 16 text-align: center; 17 } 18 .flexible-size { 19 /*这里设置为auto,意思就为让元素自动扩展到可以利用的空间, 20 如果有多个元素就可以平均分配空间,同时这样设置之后, 21 才可以使用js代码来让父元素宽度变化*/ 22 flex:auto; 23 background-color: white; 24 } 25 </style> 26 <script> 27 window.onload = function () { 28 var height = 400; 29 var a = document.getElementById('increase-size'); 30 a.onclick = function(){ 31 height += 10; 32 if (height > 500) height = 500; 33 var b = document.getElementById('document'); 34 b.style.height = height + "px"; 35 } 36 37 var c = document.getElementById('decrease-size'); 38 c.onclick=function(){ 39 height -= 10; 40 if (height < 300) height = 300; 41 var c = document.getElementById('document'); 42 c.style.height = height + "px"; 43 } 44 } 45 46 </script> 47 </head> 48 49 <!--假设你有一个带有头部区域,内容区域,和底部区域的页面。头部和底部应该有一个固定的尺寸, 50 但是内容区域应该根据可以利用的空间来缩放。这可以通过设置内容区域的 flex 属性,设置头部区域 flex 属性,底部区域不设置来实现自动扩展功能。--> 51 <body> 52 <div id="document" class="vertical-box"> 53 <div class="fixed-size"><button id="increase-size">Increase container size</button></div> 54 <div id="flexible-content" class="flexible-size"></div> 55 <div class="fixed-size"><button id="decrease-size">Decrease container size</button></div> 56 </div> 57 </body> 58 </html>
示例3: 创建一个水平折叠的容器EDIT
在某些时候,你可能想让一些信息在屏幕尺寸允许的情况下呈水平布局,但是在屏幕不允许的情况下可以水平折叠。这对 flexbox 来讲太容易实现了。你通过设置 flex-flow
的值为 wrap 来实现。
1 <html> 2 <head> 3 <meta charset="utf-16"> 4 <title>index</title> 5 <style> 6 .horizontal-container { 7 display: flex; 8 300px; 9 flex-flow: row wrap; 10 } 11 .fixed-size { 12 flex: none; 13 100px; 14 background-color: black; 15 color: white; 16 text-align: center; 17 } 18 </style> 19 <script> 20 window.onload = function () { 21 var width = 300; 22 document.getElementById('increase-size').onclick=function() { 23 width += 100; 24 if (width > 300) width = 300; 25 document.getElementById('container').style.width = (width + "px"); 26 } 27 28 document.getElementById('decrease-size').onclick=function() { 29 width -= 100; 30 if (width < 100) width = 100; 31 document.getElementById('container').style.width = (width + "px"); 32 } 33 } 34 35 </script> 36 </head> 37 <body> 38 <div id="container" class="horizontal-container"> 39 <div class="fixed-size">Element 1</div> 40 <div class="fixed-size">Element 2</div> 41 <div class="fixed-size">Element 3</div> 42 </div><button id="increase-size">Increase container size</button><button id="decrease-size">Decrease container size</button> 43 </body> 44 </html>