ブートストラップ流体レイアウトでグリッド要素を下揃えする方法


123

Twitterのブートストラップを使用した滑らかなレイアウトで、1つの行に2つの列があります。最初の列には多くのコンテンツが含まれているので、通常はその範囲を満たします。2番目の列にはボタンとテキストがあり、最初の列のセルを基準にして下揃えにしたいのです。

ここに私が持っているものがあります:

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

ここに私が欲しいものがあります:

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

最初のスパンを絶対的な高さにして、2番目のスパンをそれに相対的に配置するソリューションを見てきましたが、divの絶対的な高さを指定する必要がないソリューションが推奨されます。また、同じ効果を達成する方法を完全に再考することにも心がけています。私はこの足場の使用とは結婚していませんが、私にとって最も理にかなっているように見えました。

フィドルとしてのこのレイアウト:

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


.rightspanに約200pxのマージントップを追加できませんか?
Richlewis

CSSへのショートカットはこの質問にのみ答えます:stackoverflow.com/a/14223553/259725
Adam

bootply.com/125740#(申し訳ありませんが、このリンクからのSOの質問に対する回答を忘れてしまいました。)
ToolmakerSteve

回答:


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など)で再利用可能
  • かなりよくサポートされています(すべての主要ブラウザがマージントップをサポートしています)

悪いニュース:

  • jQueryが必要です
  • それは、書かれているとおり、反応していません(申し訳ありません)

3
応答性のために、おそらくwindow.resizeをフックしますか?stackoverflow.com/a/2969091/244811
Scott Weaver

22
CSSソリューションになる可能性のあるものにjQueryソリューションを使用しないでください。スタイリングの目的でDOM操作を回避する理由はたくさんあります。
Archonic、2015年

1
@Archonic:そのCSSのみのソリューションは何ですか?また、JSに依存するソリューションよりもそれを好みます。OPの規定に注意してください。「
div

1
@cfx絶対的な高さを必要としないフィドルを使用したcssのみのソリューションを投稿しました。
Archonic、2015年

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年

両方divのをに設定してみてくださいvertical-align: middle;
cfx 2015年

6
これが唯一の受け入れられる答えです!@Lukasは、行を埋めない列の幅を無視します。そして、スタイリングのためのDOM操作... SMH。
Archonic、

CSSが行(特に.myrow)から外れている...これは、1列を上揃え、1列を下揃え、3列目を上揃えにすることができないことを意味しませんか?
Jeromy French、

よろしくお願いします!Bootstrap 4で問題なく動作します
Elie Teyssedou

33

あなたはフレックスを使うことができます:

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

私の意見では、felxを使用することは非常に素晴らしく簡単です。「align-items:baseline」を使用するもう1つの利点は、整列するさまざまなアイテムの異なるフォントで優れていました。
アレッサンドロデンテラ2016年

フレックスを使用するための優れた提案。単純で、まっすぐで、Bootstrapを使用してBootstrapの問題を解決します。
CheddarMonkey 2017

1
素晴らしい答えであり、javascript / jqueryを必要としないブートストラップで完全に動作します。
2017年

1
うん、これを通常のブートストラップ行とBAMに追加すると、機能します。綺麗な。応答しないjqueryソリューションがどのようにしてトップの答えになりましたか?私たちは決して知りません。
Levi Fuller

@LeviFuller私の推測では、このソリューションは1つのブレークポイントしかサポートしていないためです
clamchoda

27

span6ようなスタイルを追加する必要があります。

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

これはあなたのフィドルです:http : //jsfiddle.net/sgB3T/


4
span6に設定するのではなく、特定のcssクラスを作成しますが、テーブルセル戦略はうまく機能します!また、幅を正しく設定するには、「display:table-row」をコンテナのdivに設定する必要がありました。
Meta-Knight

3
Bootstrap 3の場合、次のルールを追加しました:.row.align-bottom> [class ^ = col] {display:table-cell; 垂直方向に揃える:下; float:なし。}行にalign-bottomを適用< div class = "row align-bottom">
マーティン

@ Martin、.align-bottom {display:table-row;}も設定すると、ルールは正常に機能しますが、テーブルの行はブートストラップのmargin-leftおよびmargin-rightを考慮しないため、行の配置はオフになります:-15px ……考えましたか?
アレックスホワイト

@AlexWhite- その行のすべてのcols padding-left: 0padding-right: 0オンおよびオフにします。
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親要素または親要素内の対象の子要素よりも大きい別の要素の高さがある場合、値を計算する必要はありません。


これは受け入れられる答えになるはずです。短くてシンプルで、フレックスをサポートするすべてのブラウザで機能します。唯一の欠点は、応答性が損なわれることです。
tbm 2017

4

ここでの他の回答に基づいて、さらに応答性の高いバージョンがあります。幅768ピクセル未満のビューポートをサポートし、遅いウィンドウのサイズ変更をより適切にサポートするために、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);

この改良のおかげで、私は現在のプロジェクトにそれを取り入れただけで、うまく機能しています。
14

1
なぜmargin-top0に設定してから、それを新しい値に再度設定するのですか?また、なぜこれらのことを2つのeach()「ループ」で行うのでしょうか。
Jeromy French、2015

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 2017年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.