pubDate: 2024-06-15
author: sakakibara
CSSのデザインについて、いくつかデザインパターンとも呼ぶべきものをいくつか紹介する。
marginを使うか、paddingを使うかで迷うことがある。 主な違いはpaddingは個々の要素に適用されるのに対し、 marginは要素間の関係を調整するためにつかわれる。 しかし、だからこそ、単一の要素に対してmarginを使うことは問題がある(場合がある)。
marginは要素間の関係を調整すべきなのだが、現状、個別の要素に対して適用されていることからだ。
コンテキストを考慮すべきなのである。
上の例で問題な点は
p
要素にもmarginが適用されてしまうではどのようにすればいいか。
ここで、* + *
はフクロウセレクタ(要素の前になにかしらの要素がある要素)と呼ばれる。
フクロウセレクタは、最初以外の要素に適用するセレクタと言える。
このようにすることで, .stack
の直下にあるすべての要素に対して余白を適用することができる。
また、margin-topを使うことで、最後の要素の下に余白が適用されない。
これをさらに再帰的に用いることもできる。改良は簡単、>
を取り除くだけである。
example
このようにすることで、.stack
の直下にあるすべての要素に対して再帰的にmarginを適用することができる。
CSSが直列的であることを利用すると、例外としてのセレクタの適用が有効である。
ここで.stack-exception
に対してmarginを適用したくない場合、
のようにすることで、例外を適用することができる。
この妙がわかるだろうか。
.stack
の中には.stack-exception
がある場合がある。その場合に限り、変数--space
を使用することができる。
それ以外の場合は1.5rem
が適用されるのだ。
Stackはflex
コンテキストを使うことで、カードのようなデザインを実現することができる。
要素を上のグループと下のグループにわけることができるのだ。
example
nth-child(2)
は、2番目の要素に適用されるセレクタである。
nth
というのはn-th
(n番目)の略である。
2番目の要素にmargin-bottom: auto
を適用することで、ここを境に上下に要素をわけることができる。
親要素がflex
であり、flex-direction: column
(縦方向)であることから、縦に積まれ、margin-bottomがautoであることから、左に折り返されるのだ。
テキストを中央に配置する際、text-align: center
を使うことがある。
ただし、一般的に大量の文章を中央揃えにするのは非常に読みにくい。
それよりも、コンテナが中央に配置されていると嬉しい。
そこで、水平方向に中央揃えされたカラムを作る方法を紹介する。
単純な方法は、margin: 0 auto
を使うことである。
ただし、これは本来必要ではない垂直方向の余白も0になってしまうので次が推奨される。
なお、ch
は文字の幅を表す単位である。ここでは文章を読むのに適した幅を指定している。
そのため、rem
ではなくch
を使っている。
なお、この場合だと、画面の幅が60chを下回ると画面の端に接触してしまうので、多くの場合、paddingを使って余白を作る。
paddingを使う際、box-sizing: border-box
の場合だとcontent幅が60chにはならないので、ここだけ例外的にbox-sizing: content-box
を使う。
flexにおけるレスポンシブデザインの悩みは意図した折りたたみができないことである。 例えば、横一列に並んでいる要素を縦一列に並び替えたいが、中途半端に折りたたまれてしまうことがある。 中途半端なレイアウトは、ユーザーにとって不要な情報を表示してしまうことになる。
切り替えのブレークポイントが600px
であるとする。
このようにすることで.switcherの直下の要素はflex-boxになり、
flex-grow: 1
を使うことで、アイテムが横に同じ比率で伸長される。
その下で、アイテムは600px
以下になるとflex-basis
が非常に大きな値になるため、横の領域をすべて占有することになる。
負の値になるとflex-basis
は無効になる。
要素間のマージンをとるにはgap
を使う。
横にいくつも要素を並べることができるため、要素一つ一つの幅が狭まってしまう。
そこで、.switcher
に入る要素の数を制限する必要がある。
この例では.switcher
の中で5個以上の要素がある場合に, flex-basis: 100%
を適用している。
:nth-last-child(n + 5)
は後ろから数えて5番目以降から先頭までの要素に適用されるセレクタである。
:nth-last-child(n + 5) ~ *
は後ろから5番目以降の要素に適用されるセレクタである。
なお、4つしか要素が無い場合には適用されない。
例えば、stackの中にcenterをいれる場合、
のようにショートハンドを使って宣言してしうまうと、stackで設定したmarginが上書きされてしまう。 このような問題をさけるため、本来必要でない宣言はしないようにする。 正解は
である。
BEMはBlock Element Modifierの略で、CSSの命名規則の一つであり、おそらく世界で最もよく使われている。 以下を例に説明する。
がBlockに該当する。
Blockの中にある要素がElementに該当する。
もしくは.alert--warning
のようにハイフン2つでModifierを表す。
なお、2つのハイフン--
を使う場合は単語をつなげる際には-
を使う。
(これはModifierがBlockまたはElementと対等な関係にあることを示す。)
BlockまたはElementの状態変化形がModifierに該当する。