码迷,mamicode.com
首页 > 其他好文 > 详细

flexbox不能做的一件事

时间:2016-09-16 16:48:07      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

看起来flexbox能解决任何问题。垂直居中。告别浮动。列布局变得异常简单!可作者发现了flexbox的阿喀琉斯之踵——row spans.
 
flexbox——这个神奇的样式正在解放我们,让工作更加轻松。想象一下:没有浮动,没有设置margin为负值以使得一些基础样式正常工作的怪异CSS代码。你在过去十年间学到的所有技巧此刻可以完全抛弃,因为你不需要它们。
 
想实现在一个高度未知的容器里垂直居中的效果?flexbox只用了一行代码就能实现!
代码如下:
 
.container{
    display: flex;
}
.centered{
    flex: 1;
}

HTML代码如下:

<div class="container">
<div class="centered">
This is centered
</div>
</div>
 
很明显比几年前的CSS实现垂直居中的方法简单的多:这些方法包括设置负margin值和利用tabel-cell实现垂直居中。而且,对CSS而言比垂直居中更难实现的是三列等高布局。目前没有一种优秀的方法可以实现它,直到flexbox出现。
 
想实现三列等高且宽度占容器比例相同的布局?HTML代码如下:
 
<div class="container">
  <div class="column" style="background: red">
    Column 1
  </div>

  <div class="column" style="background: green">
    Column 2
  </div>

  <div class="column" style="background: blue">
    Column 3
  </div>
</div>

CSS代码如下:

.container {
  display: flex;
  width: 100%;
  height: 300px;
}

.column {
  flex: 1;
  color: white;
}

(代码链接:http://codepen.io/swizec/pen/vXONdj/

很简单对吧?将container的display属性设为flex,之后设置每个子div占据相同水平空间。在链接中你可以尝试改变窗口大小,效果不变。
 
Row Span in Flexbox
 
当设计师想到了这样的效果:
 
技术分享

 

这是一个由大小相同的按钮组成的网格,可是你却为之挠头。
 
你知道按钮必须是可配置的,也就是说你的代码能随不同的配置改变。按钮的标签内容与颜色等均可改变。
 
这些按钮相当于数据。你得到一个标签名的数组,给这些标签赋予按钮的样式。最理想的是遍历它们,在HTML中创建一个按钮列表,用CSS实现布局。
 
flex-flow: row wrap很好用,它可实现元素的换行效果。HTML代码如下:
 
<div class="container">
    <div class="button" style="background: red;">
      Column 1
    </div>

    <div class="button" style="background: green">
      Column 2
    </div>

    <div class="button" style="background: blue">
      Column 3
    </div>

   <div class="button" style="background: blue">
      Column 4
    </div>

   <div class="button" style="background: red">
      Column 5
    </div>

    <div class="button" style="background: green">
      Column 6
    </div>

    <div class="button" style="background: green;">
      Column 7
    </div>

    <div class="button" style="background: blue">
      Column 8
    </div>   

    <div class="button" style="background: red">
      Column 9
    </div>
</div>

CSS代码如下:

.container {
  display: flex;
  width: 100%;
  height: 300px;
  flex-wrap: wrap;
}

.button {
  flex: 0 33.3%;
  color: white;
}

(代码链接:http://codepen.io/swizec/pen/XjbrLP/

效果如下:

技术分享

 

实现这样的分行布局似乎一点也不难,可设计师想要第一个元素跨两行。
flexbox实现跨行效果......现在你彻底混乱了,如果你用的方法和我一样,那么得到的结果应该是这样:
 
技术分享

 

你必须承认:flexbox的跨行效果不能这样实现。你应该忍耐这种需求,将内容放在列元素中。
 
代码如下:
 
<div class="container">
  <div class="column">
    <div class="button rowspan" style="background: red;">
      Column 1 - rowspan
    </div>

    <div class="button" style="background: green;">
      Column 7
    </div>
  </div>

  <div class="column">
    <div class="button" style="background: green">
      Column 2
    </div>

    <div class="button" style="background: red">
      Column 5
    </div>

    <div class="button" style="background: blue">
      Column 8
    </div>
  </div>

  <div class="column">
    <div class="button" style="background: blue">
      Column 3
    </div>

    <div class="button" style="background: green">
      Column 6
    </div>

    <div class="button" style="background: red">
      Column 9
    </div>
  </div>
</div>

CSS代码:

.container {
  display: flex;
  width: 100%;
  height: 300px;
  flex-wrap: wrap;
}

.column {
  flex: 1;
  display: flex;
  flex-direction: column;
}

.button {
  flex: 1;
  color: white;
}

.button.rowspan {
  flex: 2;
}

(代码链接:http://codepen.io/swizec/pen/NRqGLQ/) 

用flexbox列布局实现,即分为三列。设置第一列的第一个元素占列的2/3,第二个元素占1/3。设置其他列的元素均占列的1/3。这样就实现了第一个元素的跨行效果。如下:

技术分享

 

 看,flexbox的跨行效果还不算太难。

注:本文为译文。

原文链接:https://dzone.com/articles/the-one-thing-flexbox-cant-do

 

 

flexbox不能做的一件事

标签:

原文地址:http://www.cnblogs.com/panshijie205/p/5876638.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!