我正在尝试对齐包含3个内容块的顶部菜单。

我要实现的功能是:


块1:左对齐
块2:水平居中
块3:右对齐

如果所有3个块的大小相同,我可以使用flexbox(如代码段中所示),但是它们不是,所以不会产生我需要的输出。

相反,flexbox在3个块之间放置了相等的空间-导致中间块偏离中心对齐。

我想知道是否可以使用flexbox来实现,如果不能,则可以采用其他解决方案。这需要在生产中稳健地工作,因此由于支持不足,因此不适用“网格”解决方案。




 .container {
  margin: 20px 0;
}

.row {
  background-color: lime;
  display: flex;
  justify-content: space-between;
}

.item {
  background-color: blue;
  color: #fff;
  padding: 16px;
} 

 <div class="container">
  <div class="row">
    <div class="item">left, slightly longer</div>
    <div class="item">center, this item is much longer</div>
    <div class="item">right</div>
  </div>
</div> 




评论

我看过“重复”的答案。这是不同的情况。帖子中的所有弹性和自动边距解决方案都依赖于“相同大小”的块,这是此处的关键区别。网格支持不充分。

你能给“弹性增长:1;”用于“ .item”类并检查

我遇到了同样的问题,并遇到了出色的CSS Flexbox,为什么没有“ justify-items”和“ justify-self”属性?值得一读,并提供与以下当前接受的答案不同的解决方案。 br />

#1 楼

您可以考虑将flex-grow:1;flex-basis:0%用于左侧和右侧元素,然后使用text-align在内部对齐内容。我添加了一个额外的包装程序,以仅在文本周围保留背景。

诀窍是通过仅删除中间内容并将其平均拆分为左右元素来计算可用空间。




 .container {
  margin: 20px 0;
  padding-top:10px;
  background:linear-gradient(#000,#000) center/5px 100% no-repeat; /*the center*/
}

.row {
  background-color: lime;
  display: flex;
  color: #fff;
}

.item:not(:nth-child(2)) {
  flex-basis: 0%;
  flex-grow: 1;
}

.item:last-child {
  text-align: right;
}

.item span{
  background-color: blue;
  display:inline-block;
  padding: 16px;
  height:100%;
  box-sizing:border-box;
} 

 <div class="container">
  <div class="row">
    <div class="item"><span>left, slightly longer</span></div>
    <div class="item"><span>center, this item is much longer</span></div>
    <div class="item"><span>right</span></div>
  </div>
</div> 





还可以通过保持元素紧密来进行相同的操作。只需调整文本对齐即可:




 .container {
  margin: 20px 0;
  padding-top:10px;
  background:linear-gradient(#000,#000) center/5px 100% no-repeat; /*the center*/
}

.row {
  background-color: lime;
  display: flex;
  color: #fff;
}

.item:not(:nth-child(2)) {
  flex-basis: 0%;
  flex-grow: 1;
}

.item:first-child {
  text-align: right;
}

.item span{
  background-color: blue;
  display:inline-block;
  padding: 16px;
  height:100%;
  box-sizing:border-box;
} 

 <div class="container">
  <div class="row">
    <div class="item"><span>left, slightly longer</span></div>
    <div class="item"><span>center, this item is much longer</span></div>
    <div class="item"><span>right</span></div>
  </div>
</div> 




评论


您能解释一下.item:not(:nth-​​child(2))吗?

–科迪·布格斯坦(CodyBugstein)
19 Mar 28 '19 at 14:34

@CodyBugstein这意味着不要选择第二个孩子。所以我只将CSS应用于第一个和最后一个

– Temani Afif
19 Mar 28 '19 at 14:34

嗯,我以为您要针对3件以上的情况推广解决方案

–科迪·布格斯坦(CodyBugstein)
19 Mar 28 '19在14:37

#2 楼

您能否给flex-grow:1作为商品类别并检查

.item {
background-color: blue;
color: #fff;
padding: 16px;
flex-grow:1;
}


希望这就是您想要的

#3 楼

使用显示表的替代方法(一个古老的受支持的网格)。

引用自https://www.w3schools.com/cssref/pr_tab_table-layout.asp


如果第一行没有宽度,则无论单元格内的内容如何,​​列宽度在表中均等分配

.container {
   display: table;
   table-layout: fixed
 } // would divide cells equally along table's 100% width. 
.row {
   display: table-row
 }
.item {
   display: table-cell
 }


#4 楼

我问什么似乎是一个非常相似的问题,堆栈溢出将我引导到这里。 @Paolamoralesval的响应使我意识到可以在CSS网格中实现所需的效果。现在,网格支持已经非常普遍了,我希望这可以满足每个人的需求。我相信这种解决方案可以完全响应窗口的大小以及标题项的高度和宽度,就像您在查看片段时调整窗口的大小一样。



 .header {
  grid-row: 1;
  grid-column: 1;
  display: grid;
  grid-template-rows: min-content;
  grid-template-columns: 1fr 1fr 1fr;
}
.header-left {
  justify-self: start;
  align-self: center;
  text-align: left;
  background-color: red;
}
.header-center {
  justify-self: center;
  align-self: center;
  text-align: center;
  background-color: green;
}
.header-right {
  justify-self: end;
  align-self: center;
  text-align: right;
  background-color: blue;
}
.shrink-kitty {
    width: 200px;
} 

 <html>
  <body>
    <div class="page">
      <div class="header">
          <div class="header-left">
            <img class="shrink-kitty" src="https://upload.wikimedia.org/wikipedia/commons/thumb/b/bb/Kittyply_edit1.jpg/1280px-Kittyply_edit1.jpg"/><br/>
            By David Corby<br/>
            Edited by: <a href="//commons.wikimedia.org/wiki/User:Arad" title="User:Arad">Arad</a><br/><a href="//commons.wikimedia.org/wiki/File:Kittyplya03042006.JPG" title="File:Kittyplya03042006.JPG">Image:Kittyplya03042006.JPG<a><br/><a href="https://creativecommons.org/licenses/by/2.5" title="Creative Commons Attribution 2.5">CC BY 2.5</a>, <a href="https://commons.wikimedia.org/w/index.php?curid=1839754">Link</a>
          </div>
          <div class="header-center">In the middle</div>
          <div class="header-right">
            Much much much much more on the right hand side</br>
            Indeed two lines
          </div>
      </div>
      <div class="body">Body of the page</div>
      <div class="footer">At the bottom</div>
    </div>
  </body>
</html>