See the Pen pvyjGV by lilyH (@lilyH) on CodePen.html
如上图所示,咱们你要实现的效果就是,(1)在一行中显示两块元素;(2)每块元素的长度根据它里面的文字变化android
仍是先看代码吧:ios
<ul class="flex-container"> <li class="flex-item"><div>1234567</div></li> <li class="flex-item"><div>2</div></li> <li class="flex-item"><div>2</div></li> <li class="flex-item"><div>11111</div></li> <li class="flex-item"><div>11111111111111111111</div></li> <li class="flex-item"><div>22222222222222222222222222222222222222222222222</div></li> </ul>
.flex-container { padding: 0; margin: 0; list-style: none; display: flex; -webkit-flex-flow: row wrap; justify-content: space-between; } .flex-item { flex-grow:1; min-width:40%; height: 150px; margin-top: 10px; line-height: 150px; color: white; font-weight: bold; font-size: 3em; text-align: center; } .flex-item div{ background: tomato; height: 150px; line-height: 150px; } .flex-item:nth-of-type(2n+1) div{ margin-right: 5px; } .flex-item:nth-of-type(2n) div{ margin-left:5px; }
关于flex属性的具体说明,请参考flex全揭秘web
(1)容器,flex-container上,设置display:flex;表示里面的子元素走的是flex的布局chrome
(2)容器,flex-container,设置-webkit-flex-flow: row wrap;表示子元素横向排列,多行浏览器
(3)容器,flex-container,设置justify-content: space-between;子元素在一行上散落开工具
(4)子元素,flex-item,设置flex-grow:1; 子元素充满能空间(去掉看看是什么效果)布局
(5)子元素,flex-item,设置min-width:40%; 这个是关键(能够试试其余的值)flex
a. 都知道设置50%,那么两个元素是同样大的充满空间;大于50%,那么一行上确定放不下两个元素spa
b.由于设置的最小的宽度,若是宽度太小,好比10%,而子元素中的内容又过少的时候,这个时候一行上就会出现不止2个子元素
c. 考虑到若是三个紧挨着的子元素若是都只有一个“字”的内容的话,宽度至少要设置到33.33%;因此宽度值应该是在33.33%到50%之间(假设子元素没有margin等其余让它“变大”的属性)
d. 假设咱们设置min-width:35%,(1)那么若是同一行的两个子元素a、b,a内容大于等于65%宽,当b内容超过了35%宽时,后面元素会被挤到下一行;(2)若是同一行的两个子元素a、b,a的内容不多,可是由于它至少占35%的宽,当b的内容超过了65%宽的时候,后面的子元素会被挤到下一行。
根据上面的原理,能够经过评估项目中子元素的内容的长度来设定min-width的值,因此这只能算作一种简单的方法,要真正作到按内容文字长度伸缩容器大小而且排满一行的状况,请使用JS.
ps : 代码中的flex是w3c标准的写法,兼容android和ios的写法,请利用此工具
注明:利用上面的工具生成的兼容方法在ios下有问题,没有换行,还未找到方法,先mark下~