29

これは大変なことだと思います。

を利用したグリッドシステムを使用していfloat:leftます。で書き直すこともできますがdisplay:inline-block、それでは何も変わりません。

2 つの列があるとします。

<div class="row"> 
    <div class="column">
        <!-- some content here -->
    </div>
    <div class="column">
        <!-- some content here -->
    </div>
</div>

( のように<h1>) margin-top を含むブロック要素を配置すると、コンテンツの前にマージンが折りたたまれなくなります。浮動要素 (または表示: インライン ブロック) では常にそうであるため、これは正常です。

しかし、私はマージンを崩壊させたいと思っています。私はそれを機能させるために多くのことを試みましたが、2 つの要素を隣り合わせに配置するすべての CSS は、上記のコンテンツへの折りたたみマージンを破壊するようです。

CSS を使用して要素の最初の子を取得し、margin-top を取り除くことができます。ただし、この場合は適用されません。コンテンツは CMS で構築されており、要素に到達するまで任意のレベルの要素の深さが存在する可能性があるためです。

JavaScriptなしでこれを行う方法はありますか?

フィドル: http://jsfiddle.net/HerrSerker/ZSV3D/

h1margin-topと margin-bottom が.header折りたたまれていないことがわかります。これは によるものfloat:leftです.column

.header {
  font-size: 24px;
  background: rgba(0,255,0,0.1);
}
h1 {
  background: silver;
  margin-bottom: 50px;
  font-size: 28px;
}
.column {
  float: left;
  width: 50%;
  background: rgba(255,0,0,0.1);
}
h2 {
  background: gold;
  margin-top: 50px;
  font-size: 24px;
}
<div class="header"><h1>&lt;h1>Headerh1&lt;/h1></h1></div>
<div class="row">
    <div class="column"><h2>&lt;h2>Col 1, float: left&lt;/h2></h2></div>
    <div class="column"><h2>&lt;h2>Col 2, float: left&lt;/h2></h2></div>
</div>
<p>I want a 50 pixel margin between Header and the Cols, but the two margins don't collapse and I end up with 50 + = 100 pixel gap. If it would work, you wouldn't see the light red above col1 and col2</p>


編集

もちろん、CSS のような後継演算子を使用することもできheader + .row .column h1 { margin-top: 0;}ます。しかし、それは私が望むものではありません。私が欲しいのは、含まれている要素のマージン崩壊で機能する要素を隣り合わせに設定する方法です。


編集2

では、状況と質問をもう一度簡単に。
問題はかなり単純です。float:left; のように 2 つ以上の div を並べて設定できる CSS コードがあります。幅:50%。これらの div の内部には、上部マージンを持つ h2 のような要素があります。底マージンのある h1 がある前に div 内にある場合。この状況では、h1 と h2 のマージンが崩れることはありません。margin-collapse を使用して、マージンを手動でゼロに設定せずに要素を隣り合わせにする可能性はありますか?

もしくはそうでないか。新しいブロック書式設定コンテキストを作成せずに要素を隣り合わせに設定する可能性はありますか?


編集3:

-------------------------------------------------------------      
What it is:

 ┌─ .header ─────────────────┐
 │ ┌─ h1 ──────────────────┐ │
 │ │                       │ │
 │ └───────────────────────┘ │  ┄┄┄┬┄┄┄
 └───────────────────────────┘     ┆
                                   ┆ margin-bottom of h1
                                   ┆ 
 ┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┼┄┄┄
                                   ┆
                                   ┆ margin-top  of h2
 ┌─ .row ────────────────────┐     ┆ not collapsing
 │ ┌─ .col ───┐ ┌─ .col ───┐ │  ┄┄┄┴┄┄┄
 │ │ ┌─ h2 ─┐ │ │ ┌─ h2 ─┐ │ │
 │ │ └──────┘ │ │ └──────┘ │ │
 │ └──────────┘ └──────────┘ │
 └───────────────────────────┘
      
-------------------------------------------------------------      
What I want:

 ┌─ .header ─────────────────┐
 │ ┌─ h1 ──────────────────┐ │
 │ │                       │ │
 │ └───────────────────────┘ │  ┄┄┄┬┄┄┄
 └───────────────────────────┘     ┆ margin-bottom of h1
                                   ┆ and margin-top  of h2
 ┌─ .row ────────────────────┐     ┆ collapsing
 │ ┌─ .col ───┐ ┌─ .col ───┐ │     ┆
 │ │ ┌─ h2 ─┐ │ │ ┌─ h2 ─┐ │ │  ┄┄┄┴┄┄┄
 │ │ └──────┘ │ │ └──────┘ │ │
 │ └──────────┘ └──────────┘ │
 └───────────────────────────┘
      
-------------------------------------------------------------      
4

11 に答える 11

5

セレクターのトリッキーや JavaScript を使用せずに、実際にマージンを折りたたむ唯一のオプションは次のとおりです。

に設定しないmargin-top: 50pxでくださいh1.row

このフィドルを参照してください

HTML

<div class="header">Header is normal div</div>
<div class="row">
    <div class="column"><h1>Col 1 is float: left</h1></div>
    <div class="column"><h1>Col 2 is float: left</h1></div>
</div>
<p>I want a 50 pixel margin between Header and the Cols, but the two margins don't collapse and I end up with 50 + = 100 pixel gap.</p>

CSS

.header {
  background: silver;
  height: 50px;
  margin-bottom: 50px;
  font-size: 24px;
}
.row {
  margin-top: 50px;
}
.column {
  float: left;
  width: 50%;
}
h1 {
  background: gold;
  font-size: 24px;
}
于 2016-06-16T07:32:34.923 に答える
3

要素をに.rowしますflex。問題は解決しました...

なんで浮かせたいの?

.header {
  background: silver;
  height: 50px;
  margin-bottom: 50px;
  font-size: 24px;
}

.row {
	display: flex;
}

.column {
  width: 50%;
}
h1 {
  background: gold;
  font-size: 24px;
}

.firstcol {
   margin-top: 0;
}
<div class="header">Header is normal div</div>
<div class="row">
    <div class="column"><h1 class="firstcol">Col 1 is float: left</h1></div>
    <div class="column"><h1 class="firstcol">Col 2 is float: left</h1></div>
</div>
<p>I want a 50 pixel margin between Header and the Cols, but the two margins don't collapse and I end up with 50 + = 100 pixel gap.</p>

于 2016-06-15T10:50:00.240 に答える
1

マージンの崩壊に関するドキュメントはかなり明確です...

浮動要素と絶対配置要素のマージンは決して崩壊しません。

https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing

フレックスボックスを使用しても役に立ちません。動作は同じままです...

マージントップを持つ要素がわかっている場合は、セレクターから何かを取得できる可能性がありますfirst-of-type...スニペットを参照してください:

.header {
  background: silver;
  height: 50px;
  margin-bottom: 50px;
  font-size: 24px;
}
.column {
  float: left;
  width: 50%;
}
h1 {
  background: gold;
  margin-top: 50px;
  font-size: 24px;
}
.column h1:first-of-type {
  margin-top: 0;
}
<div class="header">Header is normal div</div>
<div class="row">
    <div class="column"><h1>Col 1 is float: left</h1></div>
    <div class="column"><h1>Col 2 is float: left</h1></div>
</div>
<p>I want a 50 pixel margin between Header and the Cols, but the two margins don't collapse and I end up with 50 + = 100 pixel gap.</p>

于 2016-06-15T09:38:32.780 に答える
1

すでに何度か聞いているように...これは不可能のようです...

すべての h1 に影響を与えないようにセレクターを使用したくないと思われ、h1 ではない可能性があり、要素の隣接する兄弟ではない可能性がある他の要素 (多分、または a など) を解決h2します (おそらくラッパーなしで、またはマージン付きボトム)...p.headerh1.headerp70px

私が正しいと仮定すると...このセレクターを使用して、そのようなすべてのケースを解決できます...

.row .column > *:first-child {
  margin-top: 0;
}

これtop-marginにより、すべての行の各列の最初の要素が に設定され0ます。

これが目的の動作に最も近いと思います...

それが役立つかどうかを教えてください。

于 2016-06-22T07:52:03.593 に答える
1

h1 のデフォルトの表示プロパティは次のとおりです。

h1{
margin-top: 0.67em;/* which is around 11px*/
margin-bottom: 0.67em;/* which is around 11px*/
margin-left: 0;
margin-right: 0;
}

したがって、h1またはh2のマージンの上または下を設定する代わりに、margin-top行に設定できます。これにより、h1およびh2に割り当てられたマージン値と同じ結果が得られます。以下のコードで説明されているように、これを使用してブラウザのサイズを変更すると、サイズを変更しているときにスペースが増減することに気付くでしょう。しかし、マージントップを割り当てているため、ある時点で停止します + すでにデフォルトの h1 および h2 マージンもあります。

.header {
font-size: 24px;
  background: rgba(0,255,0,0.1);
}
h1 {
  background: silver;
  margin-bottom: 50px;
  font-size: 28px;
}
.column {
  float: left;
  width: 50%;
  background: rgba(255,0,0,0.1);
}
h2 {
 background: gold;
  margin-top: 50px;
  font-size: 24px;
}
.row{
  margin-top:7.5%;
}

しかし、h1 と h2 のデフォルト値を削除すると、.headerとの間.columnのスペースが割り当てられたスペース.row(%) になり、ブラウザーの幅を変更すると減少します。100% の幅を .column に割り当てるには、特定のモバイル デバイスを対象とするメディア クエリを使用して実行できます。col 2 が col 1 の下に幅 100% で配置されるように

body{
margin:0;
}
.header {
  font-size: 24px;
  background: rgba(0,255,0,0.1);
}
h1 {
  background: silver;
  font-size: 28px;
  margin:0;
}
.column {
  float: left;
  width: 50%;
  background: rgba(255,0,0,0.1);
}
h2 {
  background: gold;
  font-size: 24px;
  margin:0;
  }
.row{
  margin-top:7.5%;
}
于 2016-06-20T11:03:48.523 に答える