Divの配置についてサポートが必要です。 HTMLの構造は次のとおりです。
<div class="container">
<div class="item">
<div class="left">
lorem lorem
</div>
<div class="right">
<p>right</p>
<p class="bottom">bottom</p>
</div>
</div>
</div>
そして私は次のCSSを持っています:
.container {
float: left;
padding: 15px;
width: 600px;
}
.item {
float: left;
padding: 15px;
width: 570px;
}
.left {
float: left;
padding: 40px 20px;
margin-right: 10px;
}
.right {
position: relative;
float: left;
}
.bottom {
position: absolute;
bottom: 0;
}
左のdivの幅と高さは動的です。
私が達成したいのは:
item
で埋めるようにします。bottom
の段落は、右側のdivの下部にある必要があります。これが私の目標を表す簡単な画像です:
そして JSFiddleデモ へのリンク。
.bottom
の正しい位置と幅を取得することは、クロスブラウザーのCSSソリューションにとって最大のハードルのようです。
1。フロート
@joeellisが示したように、柔軟な幅は、左側の列のみをフローティングし、右側の列にoverflow:hidden
を適用することで実現できます。
.bottom
の位置は、どのブラウザでも実現できません。等しい、可変の高さの浮動列に対するCSSソリューションはありません。絶対に配置された.bottom
要素は、100%の幅で正しいサイズになるように、右側の列divの内側にある必要があります。ただし、右の列は必ずしも左の列と同じ高さになるとは限らないため、.bottom
をbottom:0
と一緒に配置しても、必ずしもコンテナの下部に配置されるとは限りません。
2。 HTMLテーブルとCSSテーブル
柔軟な幅は、左側のセルに1pxの幅を与え、右側のセルの幅を指定しないことで実現できます。両方のセルは、コンテンツに合うように成長します。余分なスペースは、右側のセルだけに追加されます。
.bottom
が右側のテーブルセル内にある場合、Firefoxではその位置に到達できません。 Firefoxのテーブルセルでは、相対位置は影響しません。絶対位置と100%の幅は、右側のテーブルセルを基準にしません。
.bottom
が右側の列の個別のテーブルセルとして扱われる場合、Firefox以外のブラウザでは、右側と下部のテーブルセルの正しい高さを実現できません。テーブルセルの高さは、幅と同じように柔軟ではありません(Firefoxを除く)。
3。 CSS3 flexboxおよびCSS3グリッド
Flexboxとグリッドは、近い将来の有望なレイアウトツールです。ただし、flexboxはIE9以前ではサポートされておらず、グリッドはIE10以外のブラウザーではサポートされていません。どちらかがこのレイアウトを実現できるかどうかはテストされていませんが、ブラウザーのサポートにより妨げられる可能性があります現在のオプションから。
現在、適切なCSSソリューションはないようです。これは、flexbox(IE9以前のサポートが必要ない場合)を除いて、十分な関連ブラウザで機能するソリューションです)。 。
これは、jQueryを使用して列を同じ高さに強制するいくつかの変更されたデモです。両方のデモのCSSとjQueryは同じです。 HTMLは、左右の列にあるコンテンツの量によってのみ異なります。どちらのデモも、すべてのブラウザで正常にテストされました。同じ基本的なアプローチをプレーンJavaScriptに使用できます。
簡単にするために、左右のdivの内部パディングを子要素(.content
)に移動しました。
同じ高さで同じ行にとどまる兄弟要素は、それらをtable-cell
として表示し、親をdisplay: table
として表示することで実現できます。
作業中のフィドル: http://jsfiddle.net/SgubR/2/ (フローティング要素に沿ってoverflow: hidden
も表示されます列を作成するためのテクニック。後者には明確な修正が必要です)
CSSのテーブルセルは任意のHTML要素(section、div、span、liなど)を使用し、そのセマンティクスはテーブルレイアウトに使用されるtable、tr、およびtd要素とは無関係です(視覚的な結果が同じであることを除いて、それが何です)欲しい)。
display: table
は親に設定されていますdisplay: table-row
は中間の要素で使用できますが、それがなくても機能する場合は問題ありませんdisplay: table-cell
は各子に設定されますtable-layout: fixed
は、ブラウザにotherテーブルレイアウトアルゴリズムに切り替えるように指示します。ここでは、コンテンツの量は気にせず、CSSで設定された幅のみに切り替えます。vertical-align: top
が必要になります(ただし、複雑なレイアウトに最適な他の値を設定することもできます)border-collapse: separate
および/またはborder-spacing: 4px 6px
で「セル」を区切ることはできますが互換性:IE8 +
必要に応じてIE6/7のフォールバックは、インラインブロックの場合とまったく同じです。
以前の回答でのより長い説明:ここおよびそこ古き良き方法faux-columns(この手法を念頭に置いて設計を検討する必要があります)
右の列にoveflow
を追加するだけで、フロートしないでください。
.right {
position: relative;
overflow: hidden;
}
これにより、right
が残りの幅を埋めるようになります。
このようなものが機能する可能性があります:
あなたが探しているものの主な鍵は次のとおりです。
.right {
overflow: hidden;
background-color: #C82927;
}
これは、「ブロックフォーマットコンテキスト」と呼ばれるものが原因です。ここでの理由に関する優れた推論とチュートリアル: http://colinaarts.com/articles/the-magic-of-overflow-hidden/#making-room-for-floats
ただし、それらの高さは完全にはリンクされていません。この例では、左側のブロックの高さを手動で設定する必要があります(フロートコンテナであるため)