显示 flexbox 居中但左对齐项目像文本左对齐

Displaying flexbox centered but align items left like text align left

我正在尝试将这些 div 设置为显示在中心,但将它们的项目保持在左侧显示,就像 text-align: left 那样。

这是我的例子:https://jsfiddle.net/gr5Lmos1/

#donateList {
  display: flex;
  justify-content: center;
  align-items: center;
  align-self: center;
  flex-direction: column;
  flex-wrap: wrap;
}

.donateItem {
  flex: 0 1 auto;
  align-items: flex-start;
  justify-content: flex-start;
  align-self: center;
}

.donateItem * {
  display: inline-block;
}

.donateItem p {
  vertical-align: bottom;
}

.donateItem img {
  height: 64px;
  width: 64px;
}
<div id="donateList">
  <div class="donateItem">
    <img src="/images/icons/bitcoin.png">
    <p>Bitcoin:</p>
    <p>fkewjhf;eiwhf;iewfhwehfewifhew</p>
  </div>
  <div class="donateItem">
    <img src="/images/icons/paypal.png">
    <p>Paypal:</p>
    <p>eijfhewfwifhefefewf</p>
  </div>
</div>

我正在尝试将 donateItem 的内容显示在所有左侧,但保持所有 donateItem 的 div 中心不变。

如果您愿意在标记中包含另一个 wrapper,这很容易:

  1. #donateList

  2. 使用 align-items: flex-start(或让它采用默认的 stretch 值)
  3. 垂直和水平居中对齐新包装 div。

请参阅下面的演示(还删除了一些 冗余 样式):

main { /* ADDED */
  display: flex;
  align-items: center;
  justify-content: center;
}
#donateList {
  display: flex;
  justify-content: center;
  align-items: flex-start; /* CHANGED */
  /*align-self: center;*/
  flex-direction: column;
  flex-wrap: wrap;
}

.donateItem {
  flex: 0 1 auto;
  /*align-items: flex-start;
  justify-content: flex-start;
  align-self: center;*/
}

.donateItem * {
  display: inline-block;
}

.donateItem p {
  vertical-align: bottom;
}

.donateItem img{
  height: 64px;
  width: 64px;
}
<main>
  <div id="donateList">
    <div class="donateItem">
      <img src="http://placehold.it/100x100">
      <p>Bitcoin:</p>
      <p>fkewjhf;eiwhf;iewfhwehfewifhew</p>
    </div>
    <div class="donateItem">
      <img src="http://placehold.it/100x100">
      <p>Paypal:</p>
      <p>eijfhewfwifhefefewf</p>
    </div>
  </div>
</main>

你必须这样做:

#donateList
{ 
    margin: 0px auto;
    width: 50%;
    padding: 20px;
}

并在.donateItem.donateItem p#

中添加display:flex;

#donateList

{
    margin: 0px auto;
    width: 50%;
    padding: 20px;
    
}

.donateItem
{
  flex: 0 1 auto;
  align-items: flex-start;
  justify-content: flex-start;
  align-self: center;
  display:flex;
}

.donateItem p
{
  vertical-align: bottom;
 display:flex;
}


.donateItem *
{
  display: inline-block;
}

.donateItem img
{
  height: 64px;
  width: 64px;
}
<div id="donateList">

<div class="donateItem">

  <img src="http://icons.iconarchive.com/icons/froyoshark/enkel/96/Bitcoin-icon.png">

  <p>Bitcoin:</p>

  <p>fkewjhf;eiwhf;iewfhwehfewifhew</p>

</div>

<div class="donateItem">

  <img src="http://axisj.com/assets/images/donate-how-paypal.png">

  <p>Paypal:</p>

  <p>eijfhewfwifhefefewf</p>

</div>

这是一个解决方案,但它有点 hacky,需要根据特定情况调整容器宽度。容器获取这些设置以在主体内居中:

width: 50%;
margin: 0 auto;
overflow: visible;
white-space: nowrap;

...弹性项目得到 align-self: flex-start; 以在容器内左对齐:

#donateList {
  display: flex;
  justify-content: center;
  align-items: center;
  align-self: center;
  flex-direction: column;
  flex-wrap: wrap;
  width: 50%;
  margin: 0 auto;
  overflow: visible;
  white-space: nowrap;
}

.donateItem {
  flex: 0 1 auto;
  align-items: flex-start;
  justify-content: flex-start;
  align-self: flex-start;
}

.donateItem * {
  display: inline-block;
}

.donateItem p {
  vertical-align: bottom;
}

.donateItem img {
  height: 64px;
  width: 64px;
}
<div id="donateList">
  <div class="donateItem">
    <img src="/images/icons/bitcoin.png">
    <p>Bitcoin:</p>
    <p>fkewjhf;eiwhf;iewfhwehfewifhew</p>
  </div>
  <div class="donateItem">
    <img src="/images/icons/paypal.png">
    <p>Paypal:</p>
    <p>eijfhewfwifhefefewf</p>
  </div>
</div>

对于现代浏览器,将项目对齐方式更改为 flex-start 并通过 width: max-content 使容器与最长项目一样宽,这样就可以将其与通常的 margin:auto:

#donateList {
  display: flex;
  justify-content: center;
  align-items: flex-start;
  flex-direction: column;
  width: max-content;
  margin: auto;
}

.donateItem {
  flex: 0 1 auto;
  align-items: flex-start;
  justify-content: flex-start;
}

.donateItem * {
  display: inline-block;
}

.donateItem p {
  vertical-align: bottom;
}

.donateItem img {
  height: 64px;
  width: 64px;
}
<div id="donateList">
  <div class="donateItem">
    <img src="/images/icons/bitcoin.png">
    <p>Bitcoin:</p>
    <p>fkewjhf;eiwhf;iewfhwehfewifhew</p>
  </div>
  <div class="donateItem">
    <img src="/images/icons/paypal.png">
    <p>Paypal:</p>
    <p>eijfhewfwifhefefewf</p>
  </div>
</div>

不幸的是,max-content 的浏览器支持是 far from ideal,所以@kukkuz 的带有额外包装器的解决方案可能更实用(除非容器的左对齐对你来说是可以接受的优雅降级) .