【问题标题】:Centering elements vertically & horizontally while aligning text horizontally垂直和水平居中元素,同时水平对齐文本
【发布时间】:2017-02-28 06:16:57
【问题描述】:

我们的网站需要为我们的产品提供一些颜色样本,而老板希望它们看起来与印刷目录中的完全一样。这意味着一排水平的正方形,每个正方形都有不同的颜色,并且该颜色的名称覆盖在其绝对中心。像这样:

我已经尝试了两种不同的方法来使我们网站上的样本遵循这个既定的惯例,但由于某种原因没有发生。而且,是的,看起来我还是个新手。

这是我的第一次尝试,使用display:table/display:table-cell 方法:

JSFiddle

<p>Standard Ink Colors</p>
<ul class="color-list">
  <li id="thumb-red">
    <p>Red</p>
  </li>
  <li id="thumb-orange">
    <p>Orange</p>
  </li>
  <li id="thumb-athleticgold">
    <p>Athletic Gold</p>
  </li>
</ul>
<p>Be sure to specify Standard ink color above or provide us with your PMS ink number. </p>

所有内容都沿着文本的最后一个基线排列。

所以我尝试使用Flexbox:

JSFiddle

<p>Standard Ink Colors</p>
<ul class="color-list">
  <li id="thumb-red">Red</li>
  <li id="thumb-orange">Orange</li>
  <li id="thumb-athleticgold">Athletic Gold</li>
</ul>
<p>Be sure to specify Standard ink color above or provide us with your PMS ink number. </p>

类似的问题,只是现在事情在 first 基线上排列。

有什么解决办法吗?

【问题讨论】:

    标签: html css flexbox centering


    【解决方案1】:

    将单个项目的父项设为弹性容器。这将激活几个默认设置:

    • flex-direction: row - 每个子元素(“flex item”)被强制排成一行
    • flex-wrap: nowrap - 物品将无法包装

    然后将主容器的每个弹性项目都作为(嵌套的)弹性容器。这将允许您控制子元素(在本例中为文本)的对齐方式。

    justify-contentalign-itemstext-align 全部设置为center,文本将始终垂直和水平居中。

    .color-list {
       display: flex;
       justify-content: center;
       padding: 0;
    }
    .color-list li {
       display: flex;
       justify-content: center;
       align-items: center;     
       text-align: center;
       width: 4em;
       height: 4em;
    }
    #thumb-red          { background-color: #CE1126; }
    #thumb-orange       { background-color: #FE5000; }
    #thumb-athleticgold { background-color: #FFB81C; }
    <ul class="color-list">
      <li id="thumb-red">Red</li>
      <li id="thumb-orange">Orange</li>
      <li id="thumb-athleticgold">Athletic Gold</li>
    </ul>

    关于原始代码中的错位...

    一般来说,没有理由在每个项目上使用display: inline-flex。但是,如果这是您的要求,则只需将vertical-align: middletop 添加到每个li。解释如下:Why is there a vertical scroll bar if parent and child have the same height?

    浏览器支持:

    所有主流浏览器都支持 Flexbox,except IE < 10。一些最新的浏览器版本,例如 Safari 8 和 IE10,需要vendor prefixes。要快速添加前缀,请使用Autoprefixer。更多详情请见this answer

    【讨论】:

    • 我真的很喜欢这个答案,因为它使所有色板保持完全相同的宽度。它还允许在我打开flex-wrap: wrap 后包装每个li 元素以用于响应目的。我还需要从.color-list 选择器中删除justify-content: center 样式,因为我希望它们回绕到左边距而不是中心。很棒的答案,@Michael_B,感谢您如此彻底!
    【解决方案2】:

    我对你的 CSS 做了一些修改。在容器中添加了 display: table 和 display: talbe-cell。

    .color-list {
      display: table;
    }
    .color-list li {
      width: 4em;
      height: 4em;
      display: table-cell;
      vertical-align: middle;
      text-align: center;
    }
    
    .color-list li > p {
      text-align: center;
    }
    
    #thumb-red {
      background-color: #CE1126;
    }
    
    #thumb-orange {
      background-color: #FE5000;
    }
    
    #thumb-athleticgold {
      background-color: #FFB81C;
    }
    <p>Standard Ink Colors</p>
    <ul class="color-list">
      <li id="thumb-red">
        <p>Red</p>
      </li>
      <li id="thumb-orange">
        <p>Orange</p>
      </li>
      <li id="thumb-athleticgold">
        <p>Athletic Gold</p>
      </li>
    </ul>
    <p>Be sure to specify Standard ink color above or provide us with your PMS ink number. </p>

    希望对你有帮助

    【讨论】:

    • 这很有帮助,是的。唯一的问题是需要从 HTML 中删除 p 标签。完成此操作后,您的建议就完美了……嗯,几乎。事实上,我几乎采用了这个解决方案,直到我发现它的一个问题:没有包装。我认为display: table 风格是它的原因。在添加了大约十几个 li 元素后,样本行被压扁,然后流到它所在的 Bootstrap 列的右侧。因此,我决定采用 Flex 的答案,即使它没有得到广泛支持。感谢您的出色帮助!
    • 没问题,@Sturm!我的意图是以某种方式提供帮助。真的,我认为包含 flex-box 的响应是最好的选择。最重要的是知识交流。感谢您的反馈。
    【解决方案3】:

    您可以使用任何方法。只需在 .color-list li

    中应用 vertical-align: top;

    【讨论】:

    • 这绝对有效。我必须记下它以备将来参考,谢谢!