【问题标题】:Vertically center in viewport using CSS使用 CSS 在视口中垂直居中
【发布时间】:2009-03-18 19:07:16
【问题描述】:

我希望在视口(浏览器窗口)中垂直居中 <div>,而不使用 Javascript(仅限纯 HTML 和 CSS)。我有几个限制:

  • div 必须在视口中垂直居中。 我见过的方法只支持在另一个 <div> 中居中,这不是我想要的。
  • div 的高度未知。

其他限制:

  • div 必须向右对齐。
  • div 具有恒定宽度。
  • div 必须支持填充。
  • 其他元素将被放置在网页上。 div 充当菜单。
  • div 必须支持背景颜色/图像。

这让我接近我想要的,但不完全是:

#nav {
    position: fixed;
    right: 0;
    top: 50%;
}

但是,导航的顶部在中间,而不是导航的中间

是否有一些技术可以让我将div 置于这些约束的中心?

【问题讨论】:

  • 这篇文章可能会有所帮助:http://www.jakpsatweb.cz/css/css-vertical-center-solution.html 在它似乎可以在 Safari/Firefox 中运行之前,我已经使用过它。
  • @Ólafur Waage,您编辑的骗子都不是我的问题的副本。也就是说,他们都没有解决我的问题。
  • @Adam Davis,我已经更新了我的主要约束。
  • strager - 请编辑问题。您的大多数问题都在其他问题中讨论。尝试解决方案,然后发布一个非常具体的问题,重点关注剩余问题
  • 更好的是,贴出最接近你的代码,然后问剩下的问题。

标签: css layout center viewport styling


【解决方案1】:

那是什么?用 8 年 来得到问题的答案是不是太过分了?

好吧,迟到总比没有好!

真的接近了解决方案。我会用transform: translate()

#nav {
    position: fixed;
    right: 0;
    top: 50%;
    transform: translateY(-50%);
}

根据Can I use?,除了 IE8- 和 Opera Mini(老实说,这是一个很好的支持)之外,它得到了一切支持。

我建议你稍微矫枉过正,只需添加所有供应商前缀(只是为了确保!):

#nav {
    position: fixed;
    right: 0;
    top: 50%;

    -webkit-transform: translateY(-50%);
       -moz-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
         -o-transform: translateY(-50%);
            transform: translateY(-50%);
}

这里有一个 sn-p 来展示给你看:

#nav {
    right: 0;
    top: 50%;
    position: fixed;
    -webkit-transform: translateY(-50%);
       -moz-transform: translateY(-50%);
        -ms-transform: translateY(-50%);
         -o-transform: translateY(-50%);
            transform: translateY(-50%);

    background-color: #ccc;
    padding: 20px;
}
<div id="nav">
    ABC<br/>
    DEFGH<br/>
    IJKLMNO<br/>
    PQRS<br/>
    TUVWXYZ
</div>

希望它仍然与您相关! (开什么玩笑,已经 8 年了

【讨论】:

  • 这很好,但仍然不完美。 transform 有很多我亲身经历过的问题,包括但不限于:1. 居中 div 中的图像可能会变得模糊(不容易修复),2. 它破坏了一些插件,如 REDIPS.drag。 table-cell 技术解决了上述两个问题,但它引入了一个新问题:它相对于初始视口居中,而不是您滚动后当前所在的视口。
【解决方案2】:

您可以将其用作解决方案之一。

   <style>
   #containter {
     height: 100vh; //vh - viewport height
     display: flex;
     flex-direction: column;
     align-items: center; 
     justify-content: center;
   }
   #content {}
  </style>

 <div id="containter">
  <div id="content">
    any text<br>
    any height<br>
    any content, for example generated from DB<br>
    everything is vertically centered
 </div>
</div>

【讨论】:

    【解决方案3】:

    如果项目设置为position: fixedposition: absolute

    top: 50%; left: 50%; transform: translate(-50%, -50%)
    

    如果项目设置为position: relative,使用:

    margin-top: 50%; margin-left: 50%; transform: translate(-50%, -50%)
    

    (更多信息请访问the source。)


    示例:

    运行 sn-p 然后调整此页面的大小(或旋转设备)。该框在“sn-p 视口”中居中。

    .myContainer {  
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      border: 5px solid RebeccaPurple;
    }
    
    .myThing {
      width: 100px;
      height: 100px;
      background-color: CornflowerBlue;
    }
    <div class="myContainer">
      <div class="myThing myContents">
      </div>
    </div>

    【讨论】:

      【解决方案4】:

      最简单的方法是不使用div - 使用table 一行和一个单元格。可悲的是,CSS 不支持垂直对齐,您会发现自己在墙上和天花板上编写代码来完成它。

      我理解反对我刚才提出的语义论点 - 在大多数情况下,我是语义标记的支持者。但是,我也相信使用正确的工具来完成正确的工作。我相信在这种情况下最好牺牲一点纯度,以获得一个可行的简单解决方案。

      【讨论】:

      • 请阅读我的第一个约束。这将如何解决这个问题?
      • 表格没什么特别的。在标准模式下,在表格上设置高度与在 div 上设置高度具有完全相同的效果。默认情况下,只有 Quirks Mode 会调整相对于视口的表格高度;您可以通过在每个祖先元素上设置“高度:100%”来在标准模式下获得此行为。
      • 从可访问性的角度来看,表格虽然布局方便,但确实妨碍了屏幕阅读器的操作。是的,您可以通过将表格标记为具有 role="presentation" 在一定程度上缓解这种情况 - 但表格的目的是呈现表格数据。
      • 在 2013 年,这不是一个好建议。未来的读者不应该这样做。
      • 我相信,真正的解决方案是尽可能使用语义元素,并在不使用时承认。一大堆 CSS 调整与许多 cmets 甚至给理解的机会永远不会使您的网站更易于维护、更语义化、更现代。接受 HTML 当前状态的不完美。请。隐藏混乱,但接受这是必要的,尤其是在这种情况下。
      猜你喜欢
      • 2012-12-29
      • 2014-02-27
      • 1970-01-01
      • 2016-03-06
      • 2012-02-05
      • 1970-01-01
      • 2014-10-22
      • 1970-01-01
      • 2015-12-03
      相关资源
      最近更新 更多