https://css-tricks.com/box-sizing/
box-sizing
プロパティは、建物のCSSレイアウトを容易にし、多くのより直感的にすることができます。ここはCSS-トリックで、我々は開発者にとって、このような恩恵だ 国際ボックス・サイジング啓発デー守っ 月に。
しかし、どのようにそれはそれは、独自のインターネットの休日に値するほど役に立つと最愛のですか?CSSの歴史の少しの時間。
ボックスモデルの歴史
CSSの夜明け以来、 ボックスモデルは 、デフォルトでは、このように働いています:
要素のボックスの幅+パディング+ボーダー=実際の目に見える/レンダリング幅
要素のボックスの高さ+パディング+ボーダー=実際の目に見える/レンダリングされた高さ
あなたが要素にパディングとボーダーを追加し始めると、あなたが要素に設定された幅と高さが両方とすぐに窓の外を行くので、これは、少し直感に反することができます。
それが「Quirksモード」にあった時に戻るウェブデザインの昔では、Internet Explorer(<= IE6)の初期のバージョンが異なりボックスモデルを取り扱います。「癖」ボックスモデルは次のように働いた:幅=幅/高さに切断要素のボックスの高境界とパディング値は、要素のボックス内に移動された要素のボックスの=実際の目に見える/レンダリングされた高さの実際の可視/レンダリング幅ボックスのではなく、それを拡大します。
上部のボックスは、デフォルトのボックスモデルを示しています。一番下のボックスには、一度ボックスモデルの「Quirksモード」の解釈だったかを示しています。
一部の人々は、ボックスモデルのこの「風変わりな」解釈を優先し、より直感的に検討しました。それは有効なポイントです。ボックスの実際の表示幅を使用すると、CSSで宣言されたものとは違っ判明したことは曲げビットの心です。
あなたはそれを理解した後しかし、固定幅の設計の時代に、デフォルトのボックスモデルで動作するように特に複雑ではありませんでした。あなたはそのパディングとボーダーに対応するために、要素の宣言幅または高さのトリミングするために必要なピクセル数を把握するために、算術のビットを行うことができます。現代の開発者にとっての問題は、それらの絶対ピクセルの長さは応答デザインに変換されませんので、同じ数学はもう適用されないということです。
応答設計(または、それがかつて知られていたとして、「流体」または「液体」レイアウト)として人気、開発者を獲得するために開始し、設計者は、ボックスモデルへの更新を望みました。偉大なデザイナーの ジョン・ヒックス、彼の優れた流体幅の設計で知られ、これはの被写体に言っていた CSSウィッシュリスト 私たちが2008年にまとめました:
私は別のボックスモデルを大好きです!私はそれが奇妙なパディングとボーダーは、オブジェクトの幅を追加することがわかり、レイアウトを行うには何が起こっているかを気にすることなく、テキストエリアに100%の幅と3pxのパディングのようなものを与えることができるのが大好きです。おそらく、新しいセレクタとしてパディング内部のようなもの?
その静脈で、私はまた、私は要素のための100%の幅、マイナス幅固定セットを指定することができたいと思います。フォーム要素と流体デザインを作成するときに、再び、非常に便利!
現代 box-sizing
ときこれらの願いが付与された box-sizing
プロパティはCSS3で導入されました。しかし box-sizing
(3つの値を持ちcontent-box
、 padding-box
、および border-box
)、最も人気のある値です border-box
。
今日では、すべてのブラウザの現行バージョンは、オリジナルの「幅または高さ+パディング+ボーダー=実際の幅や高さの」ボックスモデルを使用しています。では box-sizing: border-box;
、私たちはかつて要素の指定された幅と高さは、パディングやボーダーに影響されない「風変わりな」方法で、何であったかにボックスモデルを変更することができます。これは、それがリセットスタイルにその方法を発見しています応答デザインで非常に有用であることが判明しました。
あなた自身に尋ねることもできる。この時点で、「古いIEは右の何かをしたということは可能ですか?」 人々の多くがそうだと思います。
デモ
このデモでは、方法を示して border-box
応答性のレイアウトを管理しやすくすることができます。
親 div
の幅が50%であり、そしてそれは、異なる幅、パディング、およびマージンを持つ3人の子供を持っています。
クリックして border-box
親の内部の適切な場所にあるすべての子を取得するためのボタンを。
https://codepen.io/team/css-tricks/pen/970f26f621cfa3ae3eec7e2a6b0e8c97/
グッド、ベター、および(おそらく)ベスト box-sizing
リセット方法
「古い」 border-box
リセット
最古の box-sizing: border-box;
リセットはこのように見えました:
* { ボックスサイズ:ボーダーボックス ; }
これはかなりうまく動作しますが、それはいくつかの予期しない結果につながることができ、擬似要素を、抜けて。すぐに現れた擬似要素をカバーして改訂リセット:
ユニバーサルボックスサイジング
*、*:前に、*:後 { ボックスサイズ:ボーダーボックス ; }
この方法は、正規化効果を改善、ならびに擬似要素を選択しました border-box
。
しかし、 *
セレクタは、それが困難な開発者が使用できるようになり content-box
または padding-box
CSS内の他の場所。これは、ベストプラクティスのための現在の最有力候補に私たちをもたらします:
継承とユニバーサルボックスサイズ
HTML { ボックスサイズ:ボーダーボックス ; } *、*:前に、*:後 { ボックスサイズ:継承。 }
このリセットは、あなたの前任者よりも高い柔軟性を提供します-あなたが使用することができます content-box
か padding-box
(サポートされている場合)あなたのCSSを上書きユニバーサルセレクタを心配することなく、自由に。
私たちは、この技術とその背後にある理由についてより深くに入った 「継承 box-sizing
おそらくわずかに良いベストプラクティス」を。
それで一つの潜在的不満はそれがされ box-sizing
、それはあなたが正常にリセットに入れたい何かと全く同じではない、行動を専門ですので、通常は、継承されていません。
ベンダープレフィックス
すべての現在のブラウザはサポートして box-sizing: border-box;
接頭辞、そうベンダープレフィックスの必要性が退色されます。
しかし、あなたがサファリ(<5.1)の古いバージョンをサポートする必要がある場合には、クロム(<10)、およびFirefox(<29)、あなたは接頭辞含めるべきである -webkit
と -moz
、このように、:
HTML { -webkit-ボックスサイズ:ボーダーボックス ; -moz-ボックスサイズ:ボーダーボックス ; ボックスサイズ:ボーダーボックス ; } *、*:前に、*:後 { -webkit-ボックスサイズ:継承。 -moz-ボックスサイズ:継承します。 ボックスサイズ:継承します。 }
既知の問題点
box-sizing: border-box;
すべての主要なブラウザの現在のバージョンでサポートされています。あまり一般的に使用される padding-box
だけで、現時点ではFirefoxでサポートされています。当社では、ブラウザのサポートについてのより包括的な情報があります box-sizing
アルマナックエントリが。
インターネットエクスプローラ(8歳以上)の旧バージョンといくつかの問題があります。IE 8は認識していない border-box
との要素に min/max-width
か min/max-height
(これもFirefoxの影響を与えるために使用されるが、それがされた 2012年に固定します)。以下IE 7とは認識しない box-sizing
で、すべてが、あります 助けることができるポリフィルは。