在两个不同宽度的柔性项目之间水平居中弯曲项目

时间:2015-10-22 17:54:32

标签: html css css3 flexbox

说我有3个div与flexbox水平显示:

 |     |-div1-| |-center-div-| |-wider-div-|     |

我希望中心div与父级的中间对齐。我怎么能做到这一点? justify-content将基于所有宽度的总和将所有3个div放在中心,并且将align-self: center应用于中间div不会做任何事情,因为align属性操纵另一个轴上的定位。

是否有响应式CSS解决方案,还是应该使用jQuery?



ul {
    display: flex;
    justify-content: center;
    width: 100%;
    background-color: purple;
}
li {
    background-color: red;
    border: 5px solid blue;
    list-style: none;
}

<ul>
    <li><a href = "#">short</a></li>
    <li><a href = "#">want center</a></li>
    <li><a href = "#">loooooooooooooooooong</a></li>
</ul>
&#13;
&#13;
&#13;

此问题的说明: https://jsfiddle.net/7w8mp8Lj/2/

4 个答案:

答案 0 :(得分:7)

您可以将第一个和最后一个li设置为flex: 1,并将a设置为内联块,并将1/2/3 li对齐为右/中心/左

<强> jsfiddle

&#13;
&#13;
ul {
    display: flex;
    justify-content: center;
    width: 100%;
    background-color: purple;
    list-style: none;
    padding: 0;
}
li:nth-child(1) {
    text-align: right;
    flex: 1;
}
li:nth-child(2) {
    text-align: center;
}
li:nth-child(3) {
    text-align: left;
    flex: 1;
}
li a {
    display: inline-block;
    background-color: red;
    border: 5px solid blue;
}
&#13;
<ul>
    <li><a href="#">short</a></li>
    <li><a href="#">want center</a></li>
    <li><a href="#">loooooooooooooooooong</a></li>
</ul>
&#13;
&#13;
&#13;

答案 1 :(得分:4)

这是一个灵活的方法,可以完美地将中间项目集中在:

  • 没有jQuery
  • 没有绝对定位
  • 对HTML
  • 没有任何更改

popoverMenuViewController?.permittedArrowDirections = UIPopoverArrowDirection(rawValue:0) 
ul {
  display: flex;
  padding: 0;
}
li {
  display: flex;
  justify-content: center;
  flex: 1;
  background-color: red;
  border: 2px solid blue;
}
li:first-child > a {
  margin-right: auto;
}
li:last-child > a {
  margin-left: auto;
}

jsFiddle

以下是它的工作原理:

  • <ul> <li> <a href="#">short</a> </li> <li> <a href="#">want center</a> </li> <li> <a href="#">loooooooooooooooooong</a> </li> </ul>是主要的灵活容器。
  • 每个ul弹性项目都为li,以便平均分配容器空间。
  • 现在flex: 1消耗了行中的所有空格并且宽度相等。
  • 将每个li设为灵活容器并添加li
  • 现在每个锚元素都是一个居中的弹性项目。
  • 使用flex justify-content: center边距左右移动外部锚点。

答案 2 :(得分:3)

您可以使用绝对定位来使非居中的物品不在流动状态,这样它们就不会影响居中。

ul {
  display: flex;
  justify-content: center;
  background-color: purple;
  padding: 0;
  list-style: none;
}
li {
  position: relative;
}
li > a {
  display: block;
  background-color: red;
  border: 5px solid blue;
}
li:first-child > a {
  position: absolute;
  right: 0;
}
li:last-child > a {
  position: absolute;
  left: 0;
}
<ul>
  <li><a href="#">short</a></li>
  <li><a href="#">want center</a></li>
  <li><a href="#">loooooooooooooooooong</a></li>
</ul>

但是,请注意,您将失去灵活性,因为Flex容器的绝对定位子元素不参与flex布局(重新排序步骤除外)。

答案 3 :(得分:1)

我使用一个内部有三个盒子的弹性容器,其中两个 - 左侧和右侧 - 具有相同的宽度,并且是自身的柔性容器,包裹任意宽度的内容:

[(a box)        ]     [centered content]    [    (a longer box)]
  left wrapper                                 right wrapper

以下是代码:

<div class="test">
    <div class="wrapper left">
        <div class="box one"></div>
    </div>
    <div class="box two"></div>
    <div class="wrapper right">
        <div class="box three"></div>
    </div>
</div>

CSS:

.test {
    height: 50px;
    display: flex;
    justify-content: center;
}

.wrapper {
    width: 33%;
    display: flex;
}

.wrapper.left {
    justify-content: flex-end;
}

.box {
    border: 1px solid red;
}

.one {
    width: 100px;
}

.two {
    width: 50px;
}

.three {
    width: 150px;
}