これは覚えておきたい! コンテナ・ラッパーを定義するCSSの古い書き方とモダンCSSを使用した書き方
Post on:2022年3月15日
モダンCSSは今までJavaScriptが必要だったことやできなかったことを可能にしてきましたが、今までの記述をよりシンプルにすることもできます。
コンテナ・ラッパーを定義する際に記述するCSSの古い書き方とモダンCSSを使用した書き方を紹介します。
CSSの古い書き方
まずは、CSSの古い書き方。
ぱっと見で、何が設定されているのか分かるのがよいところです。コンテナの幅を100%
にし、最大幅をmax-width
で設定し、padding
が上下左右に2rem
あって、margin: 0 auto;
で中央に配置します。
1 2 3 4 5 6 |
.old-container{ width: 100%; max-width: 70rem; padding: 2rem; margin: 0 auto; } |
auto
キーワードは、いろいろと便利ですよね。
参考: CSSのプロパティの値に「auto」を使ったテクニックのまとめ、マージンやサイズや配置やFlexboxなど
モダンCSSを使用した書き方
続いて、モダンCSSを使用した書き方。
最近のプロジェクトで見かけるのは、min()
とmargin-inline
を使用してコンテナ・ラッパーの幅を設定する方法です。
こちらもぱっと見で何が設定されているのか分かるようにならないとですね。
1 2 3 4 |
.modern-container{ width: min(100% - 2rem, 70rem); margin-inline: auto; } |
min()
に、古い書き方の3行分(幅・最大幅・パディング)が設定されています。
CSSのmin()
は、2つの値を比較する数学関数です。
参考: CSSの数学関数min()、max()、clamp()の基本的な使い方
参考: CSSの比較関数が便利すぎる!min(), max(), clamp()の使い方を詳しく解説
min(100% - 2rem, 70rem);
は、100% - 2rem
と70rem
の2つの値を比較して、小さい値が採用されます。これで、幅100%
と最大幅70rem
が設定されます。そしてパディング2rem
も含まれており、この1行で古い書き方の3行分が設定されています。
min()
は、すべてのエバーグリーンブラウザにサポートされています。
※エバーグリーンとは、最新版に自動アップデートされるブラウザのこと
margin-inline
はmargin: 0 auto;
と比べると、あまり変わらないじゃないかと思うかもしれませんが、CSSを書けば書くほど、このショートハンドが別のマージンと衝突して問題を引き起こすことがあることに気付くでしょう。
参考: marginの相殺を正しく理解しておこう!相殺はいつ起こるのか、相殺を回避するテクニック
margin-inline
は、margin-inline-start
とmargin-inline-end
のショートハンド(省略形)です。margin-left
やmargin-right
のような物理プロパティではなく、論理プロパティです。
参考: CSSのmargin-block-start, margin-inline-endなど、論理プロパティの使い方を徹底解説
strat
の先頭とend
の末尾は、writing-mode
やdirection
により、right
とleft
に、あるいはtop
とbottom
になります。
margin-inline
は、すべてのエバーグリーンブラウザにサポートされています。
また、このコンテナ・ラッパーを定義するCSSは、CSSの変数(カスタムプロパティ)を使用すると、カスタマイズがさらに簡単になります。
参考: CSSの変数(カスタムプロパティ)便利な使い方を詳しく解説
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
.container { width: min(100% - var(--padding, 2rem), var(--max-width, 70rem); margin-inline: auto; } .contatiner--narrow{ --max-width: 55rem; } .contatiner--wide{ --max-width: 90rem; } .contatiner--no-padding{ --padding: 0; } |
記事の元ネタは、下記のツイートからです。
Modern CSS can make a lot of impossible things possible, but it also simplifies some things as well.
One use case that I have on pretty much every project these days is setting up a container/wrapper width with min() and margin-inline. pic.twitter.com/ujzZQkP1WA
— Kevin Powell (@KevinJPowell) March 9, 2022
sponsors