CSS3ボックスサイズ:マージンボックス; 何故なの?


139

どうしてないのbox-sizing: margin-box;?通常box-sizing: border-box;、スタイルシートに入れるときは、前者を意味します。


例:

2列のページレイアウトがあるとします。両方の列の幅は50%ですが、ガター(中央にギャップ)がないため、見栄えがよくありません。以下はCSSです:

.col2 {
    width: 50%;
    float: left;
}


ガターを適用するには、2つの列の最初の列に右マージンを設定するだけでよいと考えるかもしれません。このようなもの:

.col2:first-child {
    margin-right: 24px;
}

ただし、次のことが当てはまるため、2番目の列が新しい行に折り返されます。

50% + 50% + 24px > 100%

box-sizing: margin-box;要素の計算された幅にマージンを含めることにより、この問題を解決します。これは、と同じくらい有用ではないとしても、非常に有用だと思いますbox-sizing: border-box;


30
「なぜないのbox-sizing: margin-box;?」水平マージンが崩壊しない間、そのような命題は垂直マージン崩壊を深刻に妨げるでしょう。とにかく、標準化のために何かを提案したい場合、スタックオーバーフローは適切な場所ではありません。メーリングリストを試してください。
BoltClock

16
border: xxx solid transparent;境界線はに含まれてborder-boxいるため、特定の状況では、を使用してこれを回避できます。ただし、これにより、などの他のいくつかのものが壊れbox-shadowます。
Nathan Osman

28
現在、標準に関するすべての質問を「非建設的」として閉じていますか?これは公正な質問であり、直接的な答えさえありbox-sizing: margin-boxます。マージンの縮小では機能しないため、答えはありません。
thomasrutter 2013

@thomasrutter:私がそれを閉じたとき、1年以上前だったので、それについてより良い言葉の理由はありませんでした。とにかく、「建設的ではない」はなくなりました(つまり、実際には非建設的として何もクローズしません)。そして全体として、「アイデアがあるので、これがどのように機能するか、これを標準にしましょう!」最後に閉じられてから削除されましたが、実際には「なぜXが機能しないのですか」のように聞こえます。質問。それはまだ信じられないほど投機的な質問です(上の私の推論は実際には知識に基づく推測にすぎません)が、私はそれについてこれ以上コメントしません。
BoltClock

:あなたは間隔たい場合は、単にインナーラップ/ DIVを持っていない理由codepen.io/chriscoyier/pen/eGcLwを
アシュリー

回答:


55

width: calc(50% - 24px);colsに使用できませんか?次に、マージンを設定します。


5
ブラウザに大きく依存しています。おそらく2020年頃にie15がそれをサポートし、あなたもそれをあなたの仕事で使用することが許可されます:-(
peterh-Reinstate Monica

1
Firefoxではうまく機能していないようですが?(または私が行った他のことはそうではありません)
Laurengineer '30 / 07/30

@Morgan Feeney:ええ、でもボックスサイズにはマージンボックスと呼ばれる値がありません(これがこの質問の要点です)。そのような値が今導入されたとしても、既存のブラウザにどのようにパッチ/ポリフィル/シムすることを提案しますか?
BoltClock

ええ、でも...具体的には、回避策としてcalc()を提案する回答に応答します。
モーガンフィーニー

これが特定の例に当てはまるかどうかはわかりませんが、私たちのシナリオ(FF 53.0.3など)でのcalc()の使用の主な欠点は、その動作が幅の動作と類似していないことです:X%; 「calc」は静的Xpxへの初期レンダリング時に行われていることがわかります。つまり、width:X%とは異なり、計算された列はコンテナーのサイズ変更で自動的にサイズ変更されません。
パンチョ2017年

16

私たちは持っていることができると思いますbox-sizing: margin-box。cssボックスモデルは、フレームのマージンの位置を正確に示しています。

小さな問題があります-たとえば、マージンボックスが重なる可能性があります-しかし、それらを解決するのは難しくありません。

overflow-x&のoverflow-y組み合わせ、テーブルセルに配置された絶対div、ボックスのサイズとmin | max-width | heightの組み合わせなどでわかるように、状況は同じだと思います。

ブラウザ開発者が開発していない、本当にシンプルな機能があります。

私見、box-sizing: margin-box非常に便利な機能でした。もう1つの便利な機能はでしたbox-sizing: padding-box。これは少なくとも標準には存在しますが、主要なブラウザーには実装されていません。最新のクロームにもありません!


注:@Oriolのコメント:Firefoxはbox-sizing:padding-boxを実装しました。しかし、他の人はそうせず、それは仕様から削除されました。Firefoxはバージョン50でそれを削除します。悲しいです。


2
Firefoxは実装しましたbox-sizing: padding-box。しかし、他の人はそうせず、それは仕様から削除されました。Firefoxはバージョン50でそれを削除します。悲しいです。
Oriol 2016

6

一番上の男は、パディングとボーダーを含む全体の幅にマージンを追加することを求めています。実は、マージンはボックスの外側に適用され、パディングとボーダーは適用されませんborder-box

私はそのborder-margin考えを達成しようとしました。私が見つけたのは、マージンを使用する場合.last、最後のアイテムにクラスを追加できることです(マージンを使用してから、マージン0を適用するか、を使用します:last-child/:last-of-type)。または、全体に等しいマージンを追加します(上記のパディングバージョンと同様)。

ここの例を参照してください:http : //codepen.io/mofeenster/pen/Anidc

border-box要素の幅+そのパディング+ボーダーを合計幅として計算します。したがって、div幅が50%の2 秒がある場合、それらは隣接します。8pxそれらにパディングを追加すると、の余白ができ16pxます。それをラッピング要素と組み合わせます-これもパディングがあります8px-等間隔の溝がうまく配置されたグリッドがあります。

こちらの例をご覧ください:http : //codepen.io/mofeenster/pen/vGgje

後者は私のお気に入りの方法です。


4

これはすべて明白だと思いますが、とにかくタイプアウトします。以下の結果は、単に効率的なほどではないでしょうbox-sizing: margin-box;

.col2 {
    width: 45%;
    height: 90%;
    margin: 5% 2.5%;
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    float: left;
}

http://jsfiddle.net/Fg3hg/

box-sizing要素の全体のサイズに対してパディングとボーダーが評価されるポイントを制御するために使用されます。したがってpx%幅にマージンを含めることは(通常は常にそうです)粗雑ではありませんが、定義された幅にパディングとボーダーを組み込む必要がないため、相対パーセンテージの金額を簡単に計算できます。


9
margin-boxなどの使用例は、パーセンテージ幅とピクセルマージンの混合を有効にすることです。2つの50%ボックスの間に1ピクセルのマージンが必要な場合、1%の類似のマージンでこれを達成することはできません。一部の小さな画面サイズでは、1%が0ピクセルに切り捨てられ、突然マージンがなくなります。私たちが本当に必要としているのは、@ Slouchが示すように、calc()のブラウザーサポート、またはフレックスボックスモデルです。

1
それが気になるなら、親コンテナは100px未満であり、その時点でいくつかの設計要素を再考したいと思います。ネストされた要素などを使用して実行できることは他にもいくつかありますが、そうです、変数の計算があるとかなりうまくいきます。あなたがサス以下のようなものに興味があるなら、私は彼らがこのようなことをたくさんやっていると思います。私は彼らと遊んでみましたが、まだジェダイではありません。
2014年

2
あなたが提案しているのは回避策です。複雑なレイアウトで作業している場合は、CSSを記述するのに理想的な方法ではありません。あなたは、デザイナーや作者がデザインにパーセンテージを使いたいと思っていると仮定しています。また、この問題に関係なく、calc()関数を使用してピクセルマージンを使用して間隔を計算しても、CSSを使用して上書きできるようにするのではなく、ガターを事前に決定する必要があるため、デザイナーは制限されます。
limitlessloop

あなたの言い分がわかりません。当面の問題は、余白がサイズの計算に含まれていないため、pxと%を含めると改行が発生することでした。マージンは要素のサイズには含まれません。要素の周りに表示するスペースです。さらに、margin-box多次元マージンの計算をどのように処理しますか?@mediaブレークポイント、max-widthそしてmin-widthうまく動作します。私margin-boxはいくつかの膨らみを減らすかもしれないと思いますが、それが冗長であると考えられるかもしれない理由も私は得ます。
Plummer 2014

なぜこのマージンPercentage VALUEは何らかの理由で幅のパーセンテージであると誰も言及していません...高さや幅は関係ありません。親の幅が使用されます。これは控えめに言ってもおかしなことです..したがって、上記のコードは機能しませんし、機能しません。高さと幅を等しくしない限り。
Muhammad Umer 2015年

4

これは、box-sizing属性が、特定のディメンション固有の値(パディング、ボーダー)を計算した後の要素のサイズを参照するためです。"box-sizing:border-box"は要素の高さ/幅を設定し、パディングと境界幅を考慮します。要素のマージンの範囲は要素自体よりも大きいため、ページとその周囲の要素のフローが変更され、兄弟要素と比較して要素が親内に収まる方法が直接変更されます。最終的に「マージンボックス」属性値は大きな問題を引き起こし、基本的に要素の高さ/幅を直接設定するのと同じです。


1
申し訳ありませんが、「マージンボックス」を介した空間計算にパディング、ボーダー、マージンを含めることと、「ボーダーボックス」を介したパディングおよびボーダーを含めることとの概念的な違いがわかりません。確かに同じテーマのバリエーションに過ぎないのですか?
パンチョ2017年

1

Codropsオーバーフローに強制余白と行のの効果の対象に良い記事がいくつかあります。彼らは、ノーマライザのcss設定でremまたはemユニットを使用して、すべてのブラウザのフォントサイズを100%に設定することを提案しています。全幅。16pxから1 emへの変換は、ターゲットビューポートの合計幅を計算する方法です。

少なくとも開発段階では同様に機能し、「レスポンシブ」テンプレートが必要な場合は、幅をマージン幅を含めて%に変換できます。

ガターを処理するために彼らが提案する他の、多くの場合より簡単な方法は、content: '';私が見つける各列で疑似afterとon を使用することです。endなどの定義された最後の列であるdivクラスを設定すると、そのクラスをターゲットにして、疑似afterを持たないようにするか、またはより広いクラスを持たせることができます。これは、レイアウトに最適です。

この疑似要素メソッドを使用することの追加の利点は、リーダーモニター上のフラットイメージに、より3D効果とより深い深度を与えることができるシャドウのターゲットも提供することです。現時点では、ボタンで使用されている効果をスケールアップし、グラデーションを「調整」し、Zインデックスを設定することで、この効果を実験しています。


1

通常のフローにおけるブロックレベルの非置換要素の次元は満たす必要があります

margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right =包含ブロックの幅

過剰に制約されている場合、ブラウザは左マージンまたは右マージンのいずれかを調整する必要があります。つまり、マージンボックスの幅は、それを含むブロックの幅(つまり100%)と等しくなければならないということです。

あなたの場合、透明なボーダーはbox-sizing: border-boxマージンと同じように機能します。


1

おそらくRGBAを使用してボーダーを不透明度0%に設定し、ボーダーをマージンとして使用します。


ハックのように聞こえますが、仕事をします。
モーガンフィーニー2014年

これは、ラッパーを使用して目的を達成したくない場合に役立ちます。
limitlessloop

...実際に国境が必要な場合を除き
FrancescoMM

@FrancescoMM-少し「うるさい」ですが、「マージン幅」の透明な境界線(もちろんマージンなし)でボックスを作成し、その中に表示したい幅の可視境界線を持つボックスを作成することもできます(ここでもありません)マージン)
パンチョ2017年

1
私はこの種の考え方をたどることができません。私は2つのボックスを1px離して、それぞれ50%が使用可能なスペースを使用することを望むと言うよりも自然なことはありますか?それがまさに何をmargin-boxするかです。またはマージンボックスを忘れて、利用可能なスペースを考えてください。親コンテナの50%ではなく、残っているものの50%。「計算」、「5%マージン」、混乱などな​​し
maaartinus

0

ボディコンテンツ内でボックスサイズを使用するときに興味深い状況

内容なしボーダーボックスがないため、左右のマージンに値はありません。この2つのボックスの再カウント%再カウントアルゴリズム

  .body{
    box-sizing: border-box;
    margin:0 3%;
  }

57より前のバージョンのFirefoxでは、box-sizingのpadding-box値もサポートされていましたが、この値は仕様およびそれ以降のバージョンのブラウザーから削除されました。

マージンボックスも計画されていません...

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