如何在自举流体布局中底部对齐网格元素


123

我使用Twitter的引导程序进行了流畅的布局,其中我有一排两列。第一列有很多内容,我想正常填充范围。第二列只有一个按钮和一些文本,我想相对于第一列中的单元格底部对齐。

这是我所拥有的:

-row-fluid-------------------------------------
+-span6----------+ +-span6----------+
|                | |short content   |
| content        | +----------------+
| that           | 
| is tall        |    
|                |
+----------------+
-----------------------------------------------

这就是我想要的:

-row-fluid-------------------------------------
+-span6----------+
|                |
| content        |
| that           | 
| is tall        | +-span6----------+    
|                | |short content   |
+----------------+ +----------------+
-----------------------------------------------

我已经看到了使第一个跨度成为绝对高度并相对于其定位第二跨度的解决方案,但是最好不要指定div的绝对高度的解决方案。我也愿意重新考虑如何实现相同的效果。我不喜欢这种脚手架的使用,对我来说似乎才是最合理的选择。

这种布局只是摆弄:

http://jsfiddle.net/ryansturmer/A7buv/3/


您不能为.rightspan添加200px左右的边距顶部吗?
Richlewis 2012年

CSS的快捷方式只能回答以下问题:stackoverflow.com/a/14223553/259725
亚当(Adam)

bootply.com/125740#(对不起,我忘记了此链接来自哪个SO问题的答案。)
ToolmakerSteve

Answers:


50

请注意:对于Bootstrap 4+及更高版本的用户,请考虑Christophe的解决方案(Bootstrap 4引入的flexbox,它提供了一种更为优雅的纯CSS解决方案)。以下内容适用于早期版本的Bootstrap ...


有关有效的解决方案,请参见http://jsfiddle.net/jhfrench/bAHfj/

//for each element that is classed as 'pull-down', set its margin-top to the difference between its own height and the height of its parent
$('.pull-down').each(function() {
  var $this = $(this);
  $this.css('margin-top', $this.parent().height() - $this.height())
});

从积极的一面:

  • 本着Bootstrap现有帮助程序类的精神,我将该类命名为pull-down
  • 仅需要对“拉下”的元素进行分类,因此...
  • ...可重用于不同的元素类型(div,span,section,p等)
  • 它得到了很好的支持(所有主流浏览器都支持margin-top)

现在的坏消息是:

  • 它需要jQuery
  • 它不是书面形式的,响应式的(抱歉)

3
为了获得响应能力,也许钩上了window.resize?stackoverflow.com/a/2969091/244811
Scott Weaver

22
不要将jQuery解决方案用于可能是CSS解决方案的事情。有很多原因可以避免出于样式目的而进行DOM操作。
Archonic

1
@Archonic:什么是仅CSS解决方案?我也希望它比依赖JS的解决方案更好。只需记住OP的规定:“最好使用一种无​​需指定div绝对高度的解决方案”
Jeromy French

1
@cfx发布了一个css唯一的解决方案,它不需要绝对的高度。
Archonic

1
另一方面,我的解决方案允许用户在不影响兄弟姐妹的情况下,使各个元素在底部对齐(行为与Bootstrap .pull-left和相似.pull-right)。可以使用仅CSS解决方案吗?
Jeromy French

68

这是仅使用CSS / LESS的Bootstrap 3(虽然应该适用于较旧版本)的更新解决方案:

http://jsfiddle.net/silb3r/0srp42pb/11/

您在行上将font-size设置为0(否则将在列之间留下讨厌的空格),然后删除列浮点,将display设置为inline-block,重新设置其font-size,然后vertical-align可以将其设置为您需要的任何东西。

无需jQuery。


我想把它放在中间。但是在您的jsfiddle中,当我尝试“ vertical-allign:middle”时,它没有用。有什么想法吗?
2015年

尝试将都设置divvertical-align: middle;
cfx

6
这是唯一可接受的答案!@Lukas将忽略不填充行的列的宽度。以及用于样式的DOM操作... SMH。
Archonic

您的CSS不在行中(特别是.myrow)...这是否意味着您不能使一列的顶部对齐,一列的底部对齐以及第三列的顶部对齐?
Jeromy French

谢谢 !正常工作与引导4
埃利Teyssedou

33

您可以使用flex:

@media (min-width: 768px) {
  .row-fluid {
    display: flex;
    align-items: flex-end;
  }
}

在我看来,使用felx非常好用和直接,而且使用“ align-items:baseline”还有另一个优势,该优点与要对齐的不同项目中的diffetet字体很好。
亚历山德罗·邓特拉

极好的建议使用flex。简单,两岸并用Bootstrap解决Bootstrap问题。
CheddarMonkey

1
出色的答案,无需使用javascript / jquery,即可完美地与引导程序一起使用。
Filth

1
是的,将其添加到常规的引导行和bam中,就可以了。美丽。无响应的jquery解决方案如何成为最佳答案?我们永远不会知道。
Levi Fuller

@LeviFuller我的猜测是因为此解决方案仅支持一个断点
Clamchoda

27

您需要为span6,smthg 添加一些样式,如下所示:

.row-fluid .span6 {
  display: table-cell;
  vertical-align: bottom;
  float: none;
}

这是您的小提琴:http : //jsfiddle.net/sgB3T/


4
我会创建一个特定的CSS类,而不是将其设置为span6,但是表单元策略效果很好!我还必须将“ display:table-row”设置为包含div的宽度,以具有正确的宽度。
Meta-Knight 2014年

3
对于Bootstrap 3,我添加了以下规则:.row.align-bottom> [class ^ = col] {display:table-cell; 垂直对齐:底部;浮动:无;}将align-bottom应用于行< div class =“ row align-bottom”>
马丁

@Martin,当您还设置.align-bottom {display:table-row;}时,您的规则可以正常工作,但是,由于表行不遵守引导程序的margin-left和margin-right:-15px,所以行对齐已关闭......有什么想法吗?
亚历克斯·怀特

@AlexWhite -将padding-left: 0padding-right: 0该行中的所有的cols。
AnalogWeapon 2015年

1
当列不填满行的宽度时,这将忽略列的宽度。例如,使用偏移量时。
Archonic

14

这也是实现此功能的angularjs指令

    pullDown: function() {
      return {
        restrict: 'A',
        link: function ($scope, iElement, iAttrs) {
          var $parent = iElement.parent();
          var $parentHeight = $parent.height();
          var height = iElement.height();

          iElement.css('margin-top', $parentHeight - height);
        }
      };
    }

7

只需将父项设置为display:flex;,子项设置为margin-top:auto。假定父元素的高度大于子元素的高度,这会将子内容放置在父元素的底部。

margin-top当您在父元素或另一个元素上的高度大于子元素内感兴趣的子元素的高度时,无需尝试计算值。


这应该是公认的答案:它简短,简单,并且可以在任何支持flex的浏览器中使用。唯一的缺点是它会破坏响应能力。
tbm

4

根据其他答案,此处提供的响应速度更快。我对Ivan的版本进行了更改,以支持小于768像素宽的视口,并更好地支持缓慢的窗口调整大小。

!function ($) { //ensure $ always references jQuery
    $(function () { //when dom has finished loading
        //make top text appear aligned to bottom: http://stackoverflow.com/questions/13841387/how-do-i-bottom-align-grid-elements-in-bootstrap-fluid-layout
        function fixHeader() {
            //for each element that is classed as 'pull-down'
            //reset margin-top for all pull down items
            $('.pull-down').each(function () {
                $(this).css('margin-top', 0);
            });

            //set its margin-top to the difference between its own height and the height of its parent
            $('.pull-down').each(function () {
                if ($(window).innerWidth() >= 768) {
                    $(this).css('margin-top', $(this).parent().height() - $(this).height());
                }
            });
        }

        $(window).resize(function () {
            fixHeader();
        });

        fixHeader();
    });
}(window.jQuery);

感谢所做的改进,我刚刚将其用于当前项目,并且运行良好。
2014年

1
为什么要设置margin-top为0,然后再次将其设置为新值?另外,为什么将这些事情分成两个each()“循环”?
Jeromy French

4

这是基于cfx的解决方案,而不是将父容器中的字体大小设置为零,以删除由于显示而添加的列间空格:内联块并必须重置它们,我只是添加了

.row.row-align-bottom > div {
    float: none;
    display: inline-block;
    vertical-align: bottom;
    margin-right: -0.25em;
}

到列div进行补偿。


0

好吧,我不喜欢这些答案,我对同一问题的解决方案是添加以下内容:<div>&nbsp;</div>。因此,在您的方案中,它看起来像这样(或多或少),在我的情况下,无需更改样式:

-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
|                | | +---div---+       |
| content        | | | & nbsp; |       |
| that           | | +---------+       |
| is tall        | | +-----div--------+|   
|                | | |short content   ||
|                | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------

4
&nbsp;如果左侧单元格的长度未知,您如何知道要添加的数量?
Gqqnbig

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.