css3 flex流動自適應響應式佈局設計
一、flex應運而生
HTML是骨骼、架構,CSS是肌肉、美妝,JS是運動、表現。他們的互相配合才誕生了成千上萬的網頁,豐富多彩的前端世界讓前端開發人員越來越痴迷。尤其是HTML5、CSS3的出現,更加讓這種感覺越來越深厚。
在以往要排版一個圖片、文字的列表,如:
在做這樣的貼邊均勻等分列表,一般有2種做法。
1、浮動方法(普通)
採用ul>li的DOM結構,li左浮動(ie6需要設定為行內樣式)。假設ul的寬度為W,每個li專案的總寬度是x,每一行有4個專案。為了讓每一行的第一個li都貼邊對齊,那麼就需要設定ul左邊距為負值。可得,li之間的左邊距ML=(W-x*4)/4。詳細程式碼如下:
- <!doctype html>
- <htmllang="en">
- <head>
- <metacharset="UTF-8">
- <linkrel="stylesheet"href="http://static.qianduanblog.com/css/3/last.css">
- <title>貼邊的均勻等分列表1</title>
- <style>
- .container{
- margin:50pxauto;
- width:700px;
- overflow: hidden;
- }
- .container ul{
- width:700px;
- margin:0auto
- margin-left:-75px;
- background:#DEF3FF;
- }
- .container li{
- width:100px;
- margin-left:75px;
- margin-bottom:20px;
- }
- .container .img{
- width:100px;
- height:100px;
- }
- .container .title{
- height:20px;
- line-height:20px;
- text-align: center;
- }
- </style>
- </head>
- <body>
- <divclass="container">
- <ulclass="clearfix">
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- <liclass="pull-left">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </li>
- </ul>
- </div>
- </body>
- </html>
上述程式碼,ul應占用的寬度為700px,每個li的寬度是100px,每行4個,有3個空隙,如果要貼邊對齊,就再加一個。每個空隙的寬度為(700-100*4)/4=75px。
2、兩端對齊方法(另類)
兩端對齊方法採用的是css2中text-align:textify; 屬性,它具有良好的文字排版效果,就像word裡的兩端對齊一樣,表現效果也一致。
一般認為,兩端對齊只對行內樣式起作用,而CSS當中是可以重置任意元素為行內或者塊狀樣式的。要想目標群體兩端對齊,那麼就需要設定所有專案的display為inline-block(行內塊狀樣式)。因為每一行要兩端對齊,每行四個專案li,那麼每個專案li佔用的寬度就是25%,但在實際情況中,因為要處理空白的緣故,寫20~24%都是比較合理的,下面例子就是一個簡單的說明。
詳細的頁面程式碼如下:
- <!doctype html>
- <htmllang="en">
- <head>
- <metacharset="UTF-8">
- <linkrel="stylesheet"href="http://static.qianduanblog.com/css/3/last.css">
- <title>貼邊的均勻等分列表2</title>
- <style>
- .container{
- margin:50pxauto;
- width:600px;
- overflow: hidden;
- }
- .container ul{
- width:600px;
- margin:0auto;
- background:#DEF3FF;
- font-size:0;
- text-align: justify;
- }
- .container li{
- width:24%;
- margin-bottom:20px;
- display:inline-block;
- *display:inline;
- *zoom:1;
- background:#C23A3A;
- }
- .container .inner,
- .container .img{
- width:100px;
- height:100px;
- }
- .container .title{
- height:20px;
- line-height:20px;
- text-align: center;
- font-size:14px;
- }
- .container .break-li{
- height:0;
- width:100%;
- }
- </style>
- </head>
- <body>
- <divclass="container">
- <ulclass="clearfix">
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <li>
- <divclass="inner">
- <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
- <pclass="title"><ahref="#">標題名稱</a></p>
- </div>
- </li>
- <liclass="break-li"></li>
- </ul>
- </div>
- </body>
- </html>
這種方法工程量比較大,結果如下圖:
上面說的例子是前端開發中遇到最多的情況,處理的方式也多種多樣,並不侷限於以上2種。前端開發中要處理的排版是比較多的,上下排版最簡單,左右排版比較麻煩一點,均勻分佈、錯位排版是最難處理的,我們需要處理和計算各種寬度,這是一個很繁重的過程。
二、什麼是flex
在這種情況,CSS3的flex屬性應運而生了。它的作用是能夠按照設定好的規則來排列容器內的專案,而不必去計算每一個專案的寬度和邊距。甚至是在容器的大小發生改變的時候,都可以重新計算,以至於更符合預期的排版。不僅解放了計算器,而且更加優美的服務於響應式設計。
在使用了flex屬性之後,居左對齊、居右對齊、兩端對齊、居中對齊、頂端對齊、底部對齊,以及處理專案之間的空白和專案寬度、高度的伸縮都可以簡單的設定到。
flex的字面意思是,伸縮性的、彎曲的,引申含義為可自由配置的、靈活的意思。CSS3中的flex屬性也是這麼理解,具有flex屬性的容器和容器內的專案都具有彈性計算的能力,以至於符合預定的規則。
三、flex屬性
flex是display的屬性值,目前還處於草稿狀態中,所以在書寫的時候,需要加上各個瀏覽器的私有字首,即-webkit、-moz、-ms、-o等,下面的例子都省略了字首。
flex屬性的命名可謂是一波三折:
- 2009年以前:
display:box;
- 2011年:
display:flex-box;
- 2012年:
display:flex;
目前的格式為:
- .container{
- display:-webkit-flex;
- display:-moz-flex;
- display:-ms-flex;
- display: flex;