【问题标题】:How do I bottom-align grid elements in bootstrap fluid layout如何在引导流体布局中底部对齐网格元素
【发布时间】:2012-11-30 06:04:42
【问题描述】:

我使用 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/

【问题讨论】:

标签: html css layout twitter-bootstrap


【解决方案1】:

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

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

您将行上的字体大小设置为 0(否则您最终会在列之间出现令人讨厌的空间),然后删除列浮动,将显示设置为 inline-block,重新设置它们的字体大小,然后vertical-align 可以设置为您需要的任何内容。

不需要 jQuery。

【讨论】:

  • 我想保持在中间。但是,在您的 jsfiddle 中,当我尝试“vertical-allign:middle”时,它不起作用。有什么想法吗?
  • 尝试将divs 都设置为vertical-align: middle;
  • 这是唯一可以接受的答案! @Lukas's 将忽略不填满一行的列的宽度。以及用于样式的 DOM 操作...... SMH。
  • 你的 CSS 被锁定在行之外(具体来说,.myrow)...这不意味着你不能让一列顶部对齐,一列底部对齐,第三列列顶部对齐?
  • 谢谢!与 Bootstrap 4 配合使用。
【解决方案2】:

请注意:对于 Bootstrap 4+ 用户,请考虑Christophe's solution(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's existing helper classes 的精神,我将课程命名为pull-down
  • 只有被“下拉”的元素需要被分类,所以...
  • ...它可重复用于不同的元素类型(div、span、section、p 等)
  • 它得到了很好的支持(所有主流浏览器都支持 margin-top)

现在是坏消息:

  • 需要 jQuery
  • 它不是如所写的那样响应式(抱歉)

【讨论】:

  • 为了响应性,也许挂钩 window.resize? stackoverflow.com/a/2969091/244811
  • 不要对可能是 CSS 解决方案的东西使用 jQuery 解决方案。出于样式目的而避免 DOM 操作的原因有很多。
  • @Archonic :纯 CSS 解决方案是什么?我也更喜欢它而不是依赖于 JS 的解决方案。请记住 OP 的规定:“最好不要指定我的 div 的绝对高度的解决方案”
  • @cfx 发布了一个仅使用 css 的解决方案,其中包含不需要绝对高度的小提琴。
  • 另一方面,我的解决方案允许用户底部对齐单个元素(提供与 Bootstrap 的 .pull-left.pull-right 类似的行为),而不会影响兄弟姐妹。这可以通过纯 CSS 解决方案来完成吗?
【解决方案3】:

你可以使用弹性:

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

【讨论】:

  • 在我看来,使用 felx 非常简单直接,使用“align-items:baseline”还有一个优势,它非常适合在不同的项目中使用不同的字体来对齐。
  • 使用 flex 的绝佳建议。简单,直截了当,并使用 Bootstrap 来解决 Bootstrap 问题。
  • 出色的答案,与引导程序完美配合,无需 javascript / jquery。
  • 是的,将它添加到常规引导行中,然后 bam,它可以工作。美丽的。无响应的 jquery 解决方案如何成为最佳答案?我们永远不会知道。
  • @LeviFuller 我的猜测是因为这个解决方案只支持一个断点
【解决方案4】:

你需要为span6添加一些样式,像这样:

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

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

【讨论】:

  • 我会创建一个特定的 css 类而不是将其设置为 span6,但表格单元格策略效果很好!我还必须将“显示:表行”设置为包含的 div 以具有正确的宽度。
  • 对于 Bootstrap 3 我添加了这条规则: .row.align-bottom > [class^=col]{ display: table-cell;垂直对齐:底部;浮动:无; } 将 align-bottom 应用于行 <div class="row align-bottom">
  • @Martin,当您还设置 .align-bottom { display: table-row;} 时,您的规则工作正常,但是,行对齐已关闭,因为表行不尊重引导边距-左右边距:-15px......想法?
  • @AlexWhite - 将padding-left: 0padding-right: 0 放在该行的所有列上。
  • 当列不填满行宽时,这将忽略列宽。例如,当使用偏移量时。
【解决方案5】:

这里还有一个 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);
        }
      };
    }

【讨论】:

    【解决方案6】:

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

    当您的父元素或其他元素的高度大于父元素中您感兴趣的子元素时,无需尝试计算 margin-top 的值。

    【讨论】:

    • 这应该是公认的答案:它简短、简单,适用于任何支持 flex 的浏览器。唯一的缺点是它破坏了响应能力。
    【解决方案7】:

    根据此处的其他答案,这是一个响应速度更快的版本。我对 Ivan 的版本进行了更改,以支持

    !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);
    

    【讨论】:

    • 感谢您的改进,我刚刚将它用于当前项目并且运行良好。
    • 为什么将margin-top设置为0,然后再设置为新值?还有,为什么要把这些东西放在两个each()“循环”里?
    【解决方案8】:

    这是基于cfx的解决方案,但我没有在父容器中将字体大小设置为零以删除由于 display: inline-block 而添加的列间空格并且必须重置它们,我只是添加了

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

    到列divs来补偿。

    【讨论】:

      【解决方案9】:

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

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

      【讨论】:

      • 如果左侧单元格的长度未知,如何知道要添加的&amp;nbsp;的数量?
      【解决方案10】:
      .align-bottom {
          position: absolute;
          bottom: 10px;
          right: 10px;
      }
      

      【讨论】:

      • 你应该尝试在你的答案中添加一些信息来解释为什么它回答了 OP 问题
      猜你喜欢
      • 2015-06-21
      • 2013-11-06
      • 2021-01-30
      • 2016-04-22
      • 1970-01-01
      • 2014-06-25
      • 2021-04-20
      • 2014-04-01
      • 2017-02-16
      相关资源
      最近更新 更多