1. 程式人生 > >css3 flex流動自適應響應式佈局設計

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。詳細程式碼如下:

  1. <!doctype html>
  2. <htmllang="en">
  3. <head>
  4. <metacharset="UTF-8">
  5. <linkrel="stylesheet"href="http://static.qianduanblog.com/css/3/last.css">
  6. <title>貼邊的均勻等分列表1</title>
  7. <style>
  8. .container{
  9. margin:50pxauto;
  10. width:700px;
  11. overflow: hidden;
  12. }
  13. .container ul{
  14. width:700px;
  15. margin:0auto
    ;
  16. margin-left:-75px;
  17. background:#DEF3FF;
  18. }
  19. .container li{
  20. width:100px;
  21. margin-left:75px;
  22. margin-bottom:20px;
  23. }
  24. .container .img{
  25. width:100px;
  26. height:100px;
  27. }
  28. .container .title{
  29. height:20px;
  30. line-height:20px;
  31. text-align: center;
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <divclass="container">
  37. <ulclass="clearfix">
  38. <liclass="pull-left">
  39. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  40. <pclass="title"><ahref="#">標題名稱</a></p>
  41. </li>
  42. <liclass="pull-left">
  43. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  44. <pclass="title"><ahref="#">標題名稱</a></p>
  45. </li>
  46. <liclass="pull-left">
  47. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  48. <pclass="title"><ahref="#">標題名稱</a></p>
  49. </li>
  50. <liclass="pull-left">
  51. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  52. <pclass="title"><ahref="#">標題名稱</a></p>
  53. </li>
  54. <liclass="pull-left">
  55. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  56. <pclass="title"><ahref="#">標題名稱</a></p>
  57. </li>
  58. <liclass="pull-left">
  59. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  60. <pclass="title"><ahref="#">標題名稱</a></p>
  61. </li>
  62. <liclass="pull-left">
  63. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  64. <pclass="title"><ahref="#">標題名稱</a></p>
  65. </li>
  66. <liclass="pull-left">
  67. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  68. <pclass="title"><ahref="#">標題名稱</a></p>
  69. </li>
  70. </ul>
  71. </div>
  72. </body>
  73. </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%都是比較合理的,下面例子就是一個簡單的說明。

詳細的頁面程式碼如下:

  1. <!doctype html>
  2. <htmllang="en">
  3. <head>
  4. <metacharset="UTF-8">
  5. <linkrel="stylesheet"href="http://static.qianduanblog.com/css/3/last.css">
  6. <title>貼邊的均勻等分列表2</title>
  7. <style>
  8. .container{
  9. margin:50pxauto;
  10. width:600px;
  11. overflow: hidden;
  12. }
  13. .container ul{
  14. width:600px;
  15. margin:0auto;
  16. background:#DEF3FF;
  17. font-size:0;
  18. text-align: justify;
  19. }
  20. .container li{
  21. width:24%;
  22. margin-bottom:20px;
  23. display:inline-block;
  24. *display:inline;
  25. *zoom:1;
  26. background:#C23A3A;
  27. }
  28. .container .inner,
  29. .container .img{
  30. width:100px;
  31. height:100px;
  32. }
  33. .container .title{
  34. height:20px;
  35. line-height:20px;
  36. text-align: center;
  37. font-size:14px;
  38. }
  39. .container .break-li{
  40. height:0;
  41. width:100%;
  42. }
  43. </style>
  44. </head>
  45. <body>
  46. <divclass="container">
  47. <ulclass="clearfix">
  48. <li>
  49. <divclass="inner">
  50. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  51. <pclass="title"><ahref="#">標題名稱</a></p>
  52. </div>
  53. </li>
  54. <li>
  55. <divclass="inner">
  56. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  57. <pclass="title"><ahref="#">標題名稱</a></p>
  58. </div>
  59. </li>
  60. <li>
  61. <divclass="inner">
  62. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  63. <pclass="title"><ahref="#">標題名稱</a></p>
  64. </div>
  65. </li>
  66. <li>
  67. <divclass="inner">
  68. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  69. <pclass="title"><ahref="#">標題名稱</a></p>
  70. </div>
  71. </li>
  72. <li>
  73. <divclass="inner">
  74. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  75. <pclass="title"><ahref="#">標題名稱</a></p>
  76. </div>
  77. </li>
  78. <li>
  79. <divclass="inner">
  80. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  81. <pclass="title"><ahref="#">標題名稱</a></p>
  82. </div>
  83. </li>
  84. <li>
  85. <divclass="inner">
  86. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  87. <pclass="title"><ahref="#">標題名稱</a></p>
  88. </div>
  89. </li>
  90. <li>
  91. <divclass="inner">
  92. <pclass="img"><imgsrc="http://dummyimage.com/100x100"alt=""></p>
  93. <pclass="title"><ahref="#">標題名稱</a></p>
  94. </div>
  95. </li>
  96. <liclass="break-li"></li>
  97. </ul>
  98. </div>
  99. </body>
  100. </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;

目前的格式為:

  1. .container{
  2. display:-webkit-flex;
  3. display:-moz-flex;
  4. display:-ms-flex;
  5. display: flex;