【问题标题】:How to align an image and text vertically in the middle?如何在中间垂直对齐图像和文本?
【发布时间】:2016-04-06 15:05:08
【问题描述】:

我在顶部有一个 DIV 和几个锚点。首先是带有标志的样式,其余的是文本。我设置的样式如下。

div.nav-top {
  height: 120px;
  vertical-align: middle;
}

a.nav-logo {
  background: no-repeat url(Logo.png);
  background-size: 200px 40px;
  width: 200px;
  height: 40px;
  display: inline-block;
}

a.nav-link {
  vertical-align: middle;
}

但是,这些元素不在 div 中居中。对齐似乎遵循顶部的图像。文本位于相对于图像的中间。这不是一个坏主意我需要整个系统 img-a-a-a-a 垂直居中。目前我填充它,但一旦外部 DIV 的高度发生变化,一切都会中断。

我做错了什么?

(我找到了this post,但在这里他们应用了表格等。这似乎不是最合适的解决方案。也许我弄错了?

【问题讨论】:

  • 您是否尝试了链接到的帖子中的解决方案,或者只是找到了它?它起作用了吗?如果确实有效,为什么不合适?
  • @imjared 抱歉不清楚。对于这样一个基本功能,这似乎是一个非常庞大且复杂的方法。我不是说这是错的。只是感觉在一个 div 中垂直居中一些文本应该需要一些非常非常基本的东西。我试图区分“把它做好”和“把它做好”。

标签: html css vertical-alignment


【解决方案1】:

不是一个优雅的解决方案,但如果您制作一个表格,其中一个单元格中的文本和下一个单元格中的图像,它会在中间对齐。

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

在文本上方的 div 中使用 display: flex: 然后从那里重复

div {

display: flex;
justify-contents: center;
align-items: center;

}

【讨论】:

  • 请不要写伪代码,用真实代码举例或者sn-p总能给出更准确完整的答案
  • 这不是三件事,只是将 div 更改为包裹在 text 或 h2 或任何标签周围的类。
【解决方案3】:

您可以参考this blog,那里的所有者描述了居中问题。他从 2001 年开始要知道最后一次更新是在去年夏天进行的,我很佩服他的坚持。他提供了关于如何在不同版本的 CSS 中居中的清晰示例。

在您的情况下,我建议您像这样使用 display: flex。请注意,整个居中魔法是从包含控件完成的,并施加在底层子级上。实际上根本不需要设置 nav-link 的样式(不过,请参见示例下方的备注)。

div.nav-top {
  height: 120px;
  background-color: purple;
  padding: 10px;
  display: flex;
  align-items: center;
}

a.nav-logo {
  background: no-repeat url(Logo.png);
  background-size: 200px 40px;
  background-position: center center;
  width: 200px;
  height: 100%;
}

a.nav-link { }

这是样式方面的新事物,最近才实施。这样做的缺点是较旧的浏览器可能无法呈现它。但好处是它对设计师来说更加直观(并且获取一个像样的浏览器版本并不遥远,除非由公司集中管理)。

您可能希望将 margin 用于锚点控件,因为它们将被压在一起。此外,大小和字体也需要调整。如果你这样做,你最终可能会需要我建议不需要的样式,但这是只有你知道的细节。

a.nav-link {
  margin: 10px;
  font-size: 20px;
  font-family: "Comic Sans MS", "Comic Sans", cursive;
}

【讨论】:

    【解决方案4】:

    您可以将元素包装到 div 中,并将 margin: 0, auto; 用于元素和内部容器。

    【讨论】:

    • 只有我还是这种方法有点陈旧(当然,仍然有效,而且肯定是倒退但仍然如此)?你会说我在我的帖子中建议的解决方案太狭窄了吗?
    • @KonradViltersten,我认为解决方案是旧的还是新的并不重要。更重要的是看看它的有效性,它涵盖的问题空间有多大,副作用是什么,在这种情况下比较解决方案是可行的。因此,我对您的解决方案投了赞成票,但除非我明白为什么它不如新方法,否则我仍然会不假思索地选择好方法。向后兼容、内存使用、算法复杂度等等。
    • 这句话确实非常明智。我并不是要以任何方式暗示 modern 更好(当然,有时它是更好的,但比我们预期的更常见的是,它不是)。 经典 方法有其优势,即使没有应用,决策者仍应了解它。这就是为什么我喜欢我链接到的博客。
    【解决方案5】:

    使用填充而不是固定的高度和边距来控制高度始终是一种很好的做法。所以,请记住这一点:

    • 将带有徽标的 div 和带有锚标签的 div 包装为容器 div 的子项。
    • 给那里的紫色框(或任何代表相应填充顶部和底部的东西,以使您在其中创建的父 div 居中。

      .purple{
          background:purple;
          width:400px;
          display:inline-block;
          padding: 20px 15px;
          height:auto;
      }
      

    编辑

    或者,如果您必须在父级上具有固定高度;

        .purple{
            background:purple;
            width:400px;
            display:inline-block;
            height:60px;
            padding: 0px 15px;
        }
    

    看到这个demo

    【讨论】:

    • 顶部的紫色 div 需要设置高度。这将是菜单栏。还是我误解了你的建议?我已经测试了演示,据我了解,它使紫色高度适应内容。我希望反过来。我希望它得到修复。
    • 即使是菜单栏,您仍然可以使用填充来管理高度。但是,如果您确实想要一个固定的高度,那么您需要边距。我会在几分钟内将该方法添加到演示中
    【解决方案6】:

    使用 Flexbox

    nav, .menu {
      display: flex;
      flex-direction: row;
      align-items: center;
      list-style-type: none;
    }
    
    li {
      padding: 0 5px;
    }
    <nav>
      <div class="logo">
        <img src="http://placehold.it/150x50">
      </div>
      
      <ul class="menu">
        <li><a href="">Link</a></li>
        <li><a href="">Link</a></li>
        <li><a href="">Link</a></li>
      </ul>
    </nav>

    使用 CSS 表格

    nav, .menu {
      display: table;
    }
    
    .logo, .menu {
      display: table-cell;
      vertical-align: middle;
    }
    
    li {
      padding: 0 15px;
      display: table-cell;
      vertical-align: middle;
    }
    <nav>
      <div class="logo">
        <img src="http://placehold.it/150x50">
      </div>
      
      <ul class="menu">
        <li><a href="">Link</a></li>
        <li><a href="">Link</a></li>
        <li><a href="">Link</a></li>
      </ul>
    </nav>

    【讨论】:

    • 太好了。现在,你让我头疼,因为我无法决定使用哪一个。 flex 更现代吗?我知道这很难说,但是……一般来说哪个更推荐?哈哈,另外,一个 巨大的 +1 的片段。
    • 我会使用 flex,我是的,它更现代,但你决定 caniuse.com/#search=flexbox, caniuse.com/#search=display%3A%20table
    猜你喜欢
    • 2021-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2015-04-30
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多