如何在Bootstrap中垂直居中未知高度的浮动元素?

Posted

技术标签:

【中文标题】如何在Bootstrap中垂直居中未知高度的浮动元素?【英文标题】:How to vertically center a floating element of unknown height in Bootstrap? 【发布时间】:2017-01-18 04:35:04 【问题描述】:

相关引导层:http://www.bootply.com/OdVIzrxTV5

我正在 Bootstrap 中创建一个布局,其中部分在移动设备上相互堆叠:

|---|
| A |
|---|
| B |
|---|
| C |
|---|

但在桌面上分开:

|---|    |---|
| B |    | A |
|---|    |---|
         | C |
         |---|

我在 AC 部分使用 .pull-right 来完成这项工作,但由于 Bootstrap 使用浮动,所以部分 B 是如上所示,自动对齐到顶部。我真正想要的是 B 部分像这样垂直居中:

         |---|
|---|    | A |
| B |    |---|
|---|    | C |
         |---|

B 部分应相对于AC 垂直居中。我尝试在行上应用 flexbox,但这会破坏布局。我还尝试了各种其他 CSS hack,但似乎都无法以响应方式正常工作,从而破坏了移动设备或桌面上的布局。

当垂直居中的部分 B 高度未知时,是否有任何可靠、响应迅速的解决方案?如果有帮助,B 部分将成为图像元素。

【问题讨论】:

【参考方案1】:

您还尝试过哪些其他 CSS hack?只是好奇,我知道在使用 Bootstrap 的工厂版本(没有 sass/less)时,您确实必须对 CSS 选择器挑剔。

话虽如此,也许 javascript 方法可能会有所帮助!这是代码,我将引导您完成一些更改以满足您的需求。

变量breakpoint

将此变量更改为为断点设置的任何像素。对于 Bootstrap,xs 选择器默认在 768 处启动。如果您想在其他断点处执行操作,可以添加多个断点并使用更多 if/else 语句。

第一个if

这将在页面加载时触发,并立即测试屏幕的宽度,并在需要时更改边距。

window.resize()

每当调整窗口大小时,类似的 if 语句都会关闭并重新计算边距。如果您输入一些文本并更改高度,您会看到它保持居中。如果由于某种原因将浏览器的大小调整到低于断点的位置,则只需将边距更改为继承。

一些变化

您可能会注意到 div 略低于一半。这可能只是关于 jQuery 如何检索高度的数学错误。只需添加您想要向上或向下编辑的任何常量。

// Where 20 is in pixels
var topMargin = (totalMargin / 2) - 20;

如果您想将左侧 div 居中使其始终位于 AC 部分之间,您只需更改 topMargin 计算以使用高度A div。

如果您有任何问题,请告诉我!

$(document).ready(function() 
  var breakpoint = 768;

  if ($(window).width() > breakpoint) 
    var totalMargin = $(window).height() - $('#vertCenter').height();
    var topMargin = totalMargin / 2;
    $('#vertCenter').css('margin-top', topMargin);
  

  $(window).resize(function()
    if ($(window).width() > breakpoint) 
      var totalMargin = $(window).height() - $('#vertCenter').height();
      var topMargin = totalMargin / 2;
    
      $('#vertCenter').css('margin-top', topMargin);
     else 
      $('#vertCenter').css('margin-top', 'inherit');
    
  );
);
.section-a,
.section-c 
  font-size: 2em;

.section-b 
  font-size: 4em;
<link rel="stylesheet" type="text/css" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">

<div class="container">
  <div class="row">
    <div class="test"></div>

    <div class="col-xs-12 col-sm-6 pull-right">
      <div class="section-a well well-lg">A</div>
    </div>

    <div class="col-xs-12 col-sm-6">
      <div id="vertCenter" class="section-b well well-lg">B</div>
    </div>

    <div class="col-xs-12 col-sm-6 pull-right">
      <div class="section-c well well-lg">C</div>
    </div>
  </div>
</div>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>

【讨论】:

感谢您的回答,但如果可能的话,我正在寻找仅使用 CSS 的解决方案。为响应式框架编写依赖于屏幕大小的 JS 代码感觉太像了。如果归根结底,并且看起来可能,我会采用像您这样的解决方案。 介意指向您看过的其他一些关于纯 CSS 垂直对齐的文章吗?实际上,我过去也遇到过类似的问题,也从来没有真正想出一个好的答案,所以我也很高兴有另一个解决方案。 我发现this website 是一个非常有用的资源。

以上是关于如何在Bootstrap中垂直居中未知高度的浮动元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何垂直居中一个浮动元素(未知元素的宽高)

如何设置图标的百分比高度,并将其垂直居中,同时左浮动?

垂直居中未知高度

HTML5如何垂直居中一个浮动元素

CSS总结——元素的垂直居中(已知高度/未知高度)

div垂直居中的N种方法 单行/多行文字(未知高度/固定高度)