私はTwitterのブートストラップを使用した流動的なレイアウトを持っています。そこでは、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/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())
});
プラス面では:
pull-down
としました。今は悪いニュースです。
これは、CSS/LESSのみを使用するBootstrap 3(古いバージョンでも動作するはずです)の最新の解決策です。
http://jsfiddle.net/silb3r/0srp42pb/11/
行のfont-sizeを0に設定し(そうでなければ、列の間に厄介なスペースができます)、次に列のfloatを削除し、displayをinline-block
に設定し、それらのfont-sizeを再設定し、そしてvertical-align
を必要なものに設定してください。
JQueryは必要ありません。
あなたはflexを使うことができます:
@media (min-width: 768px) {
.row-fluid {
display: flex;
align-items: flex-end;
}
}
span6
のスタイルをいくつか追加する必要があります。
.row-fluid .span6 {
display: table-cell;
vertical-align: bottom;
float: none;
}
これがあなたのフィドルです。 http://jsfiddle.net/sgB3T/
これは、この機能を実装するための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);
}
};
}
ここに他の答えに基づいて、さらに敏感なバージョンです。私は、幅が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);
親をdisplay:flex;
に、子をmargin-top:auto
に設定するだけです。これは、親要素の高さが子要素より大きいと仮定して、子コンテンツを親要素の下部に配置します。
親要素の高さ、または親要素内で関心のある子要素よりも大きい別の要素の高さがある場合、margin-top
の値を計算して試す必要はありません。
これはcfxの解決策に基づいていますが、表示によってインライン追加された列間スペースを削除するために親コンテナでフォントサイズをゼロに設定するのではなく、単純に追加しました。
.row.row-align-bottom > div {
float: none;
display: inline-block;
vertical-align: bottom;
margin-right: -0.25em;
}
補うために列divに。
まあ、私はそれらの答えのどれも好きではなかった、同じ問題の私の解決策はこれを追加することでした:<div> </div>
。ですから、あなたの計画では(多かれ少なかれ)このようになります。私の場合はスタイルの変更は必要ありませんでした。
-row-fluid-------------------------------------
+-span6----------+ +----span6----------+
| | | +---div---+ |
| content | | | & nbsp; | |
| that | | +---------+ |
| is tall | | +-----div--------+|
| | | |short content ||
| | | +----------------+|
+----------------+ +-------------------+
-----------------------------------------------