width
プロパティはブロックレベル要素、置換要素によって生成されるボックスの内容領域の横幅を指定するプロパティです。非置換インライン要素には適用されません。値は<長さ>、<パーセント値>、"auto
"を取ります。<長さ>に負の値は指定できません。
width
プロパティ、margin-left
プロパティ、margin-right
プロパティ、left
プロパティ、right
プロパティの利用値はボックスの種類に依存します。幅やマージンの算出は以下のように場合分けして考えます。
非置換のブロックレベル要素の横幅の利用値は以下の等式を満たすようにして決定されます。
margin-left
+ border-left-width
+ padding-left
+ width
+ padding-right
+ border-right-width
+ margin-right
(+ スクロールバーの幅) = 包含ブロックの横幅auto
"の場合、そのプロパティを変数として上記の等式を解く。width
とマージンプロパティの一つ以上が"auto
"の場合、マージンプロパティの"auto
"の値を0とし、width
について上記の等式を解く。margin-left
とmargin-right
がともに"auto
"の場合、両者の値が等しくなるように上記の等式を解く。auto
"以外の場合、上の等式を満たすには値が「制限されすぎている」状態であり、いずれかの利用値を無視しなければいけない。包含ブロックが"ltr
"("rtl
")ならmargin-right
(margin-left
)の指定値を無視し、それについて上記の等式を解く。margin-left
、margin-right
の算出値が"auto
"なら、それらの利用値は0になります。
width
の算出値が"auto
"なら、利用値は内容に合わせて縮めた幅(shrink-to-fit width)になります。
"shrink-to-fit width"は次の公式によって導き出されます。
min()関数は引数のうち最も小さいものを、max()は最も大きいものを返す関数とします。"preferred minimum width"、"available width"、"preferred width"の意味は次のようになっています。
margin-left
+ border-left-width
+ padding-left
+ padding-right
+ border-right-width
+ margin-right
(+ スクロールバーの幅))非置換で絶対位置決めされた要素に関するプロパティの利用値は以下の等式によって決まります。
left
+ margin-left
+ border-left-width
+ padding-left
+ width
+ padding-right
+ border-right-width
+ margin-right
+ right
(+ スクロールバーの幅) = 包含ブロックの横幅以下で「静的な位置」のleft
(right
)とは、その要素がposition:static
かつfloat:none
を持ち包含ブロックの最初のボックスであると仮定して配置したときの、包含ブロックの左辺(右辺)からボックスの左外辺(右外辺)までの距離を言います。
left
、width
、right
が全て"auto
"の場合、margin-left
とmargin-right
で"auto
"の値を0とする。包含ブロックが"ltr
"("rtl
")ならleft
(right
)を静的な位置に設定し、width
を「内容に合わせて縮めた幅」にする。そして、right
("left
")について等式を解く。left
、width
、right
が全て"auto
"でない場合
margin-left
とmargin-right
がともに"auto
"なら、両者の値が等しくなるように等式を解く。ただし、その結果が負の値になるなら、包含ブロックが"ltr
"("rtl
")の場合margin-left
(margin-right
)を0としてmargin-right
(margin-left
)について解く。margin-left
とmargin-right
のいずれかが"auto
"なら、そのプロパティについて等式を解く。margin-left
とmargin-right
がどちらも"auto
"でないなら、上の等式を満たすには値が「制限されすぎている」状態であり、包含ブロックが"ltr
"("rtl
")のならright
の値を無視し、それについて等式を解く。margin-left
とmargin-right
で"auto
"の値を0とする。
left
、right
、width
のいずれかが"auto
"なら、それについて等式を解く。left
かright
のいずれかとwidth
が"auto
"なら、width
を「内容に合わせて縮めた幅」にし、値が"auto
"であるプロパティについて等式を解く。left
とright
が"auto
"でwidth
が"auto
"でないなら、包含ブロックが"ltr
"("rtl
")の場合、left
(right
)を静的な位置に設定し、right
(left
)について等式を解く。width
プロパティは適用されません。また、left
プロパティ、right
プロパティ、margin-left
プロパティ、margin-right
プロパティの値が"auto
"のときは、利用値が0になります。
置換要素については位置決めスキームや要素の種類によらず、横幅の算出方法が共通しています。
height
とwidth
がともに"auto
"の場合
width
の利用値とする。width
= (高さ) * (内在比) とする。width
が"auto
"で要素がheight
の算出値を持つ場合、width
= (height
) * (内在比) とする。width
を"300px"とする。(もし300pxが大きすぎるなら、2:1の比率でデバイスにフィットする最大矩形の幅を使用するべきである。)マージン、left
、right
の算出方法は以下の通りです。
margin-left
、margin-right
の算出値が"auto
"なら、利用値は"0"とする。left
とright
がともに"auto
"なら、包含ブロックが"ltr
"("rtl
")の場合left
(right
)を静的な位置に設定する。left
とright
のいずれかが"auto
"なら、margin-left
とmargin-right
で"auto
"の値を"0"とする。margin-left
とmargin-right
がともに"auto
"なら、両者の値が等しくなるように等式を解く。ただし、その結果が負の値になるなら、包含ブロックが"ltr
"("rtl
")の場合margin-left
(margin-right
)を0としてmargin-right
(margin-left
)について解く。auto
"を取るプロパティが一つしかないなら、それについて等式を解く。ltr
"("rtl
")の場合right
(left
)を無視し、それについて等式を解く。min-width
プロパティとmax-width
プロパティにより、ボックスの最小・最大幅を指定できます。
計算方法は以下のようになります。
max-width
よりも大きいなら、今度はwidth
の算出値をmax-width
に置き換えて上述の方法で再び計算する。min-width
よりも小さいなら、今度はwidth
の算出値をmin-width
に置き換えて上述の方法で再び計算する。height
プロパティはブロックレベル要素、インラインブロック要素、置換要素の内容領域の高さを指定するプロパティです。非置換インライン要素には適用されません。値は<長さ>、<パーセント値>、"auto
"を取ります。<長さ>に負の値は指定できません。
値に<パーセント値>を指定したとき、包含ブロックの高さが明示的に示されておらず、かつ要素が絶対位置決めされていない場合は、算出値で"auto
"になります。また、ルート要素に対する<パーセント値>の指定は、初期包含ブロックを参照します。<パーセント値>を包含ブロックの高さに基づいて計算させたいときは、包含ブロックの高さを明示しなければいけません。
この節ではoverflow:visible
である非置換ブロックレベル要素について説明します。
margin-top
とmargin-bottom
で"auto
"の値は"0"になります。
height
が"auto
"のときは次のようにして高さを求めます。
height
とする。非置換で絶対位置決めされた要素に関するプロパティの利用値は以下の等式によって決まります。
top
+ margin-top
+ border-top-width
+ padding-top
+ height
+ padding-bottom
+ border-bottom-width
+ margin-bottom
+ bottom
(+ スクロールバーの高さ) = 包含ブロックの高さ以下で「静的な位置」のtop
とは、その要素がposition:static
かつfloat:none
を持ち包含ブロックの最初のボックスであると仮定して配置したときの、包含ブロックの上辺からボックスの上外辺までの距離を言います。
top
、height
、bottom
が全て"auto
"の場合、margin-top
とmargin-bottom
で"auto
"の値を0とする。、height
を「内容に基づいた高さ」にする。そして、bottom
について等式を解く。top
、height
、bottom
が全て"auto
"でない場合
margin-top
とmargin-bottom
がともに"auto
"なら、両者の値が等しくなるように等式を解く。margin-top
とmargin-bottom
のいずれかが"auto
"なら、そのプロパティについて等式を解く。margin-top
とmargin-bottom
がどちらも"auto
"でないなら、上の等式を満たすには値が「制限されすぎている」状態である。よって、bottom
の値を無視し、それについて等式を解く。margin-top
とmargin-bottom
で"auto
"の値を0とする。
top
、bottom
、height
のいずれかが"auto
"なら、それについて等式を解く。top
かbottom
のいずれかとheight
が"auto
"なら、height
を「内容に基づいた高さ」にし、値が"auto
"であるプロパティについて等式を解く。top
とbottom
が"auto
"でheight
が"auto
"でないなら、top
を静的な位置に設定し、bottom
について等式を解く。height
プロパティは適用されません。非置換インライン要素の高さはフォントに基づいて算出されますが、具体的な方法はユーザーエージェントの実装に任されています。(例えば、エムボックスを使う、アセンダとディセンダの幅の最大ととるなど。)
置換要素については位置決めスキームや要素の種類によらず、横幅の算出方法が共通しています。
height
とwidth
がともに"auto
"の場合
height
の利用値とする。height
= (横幅) * (内在比) とする。height
が"auto
"で要素がwidth
の算出値を持つ場合、height
= (width
) * (内在比) とする。height
を、2:1の比率で高さが150pxを超えず横幅がデバイスの横幅を超えない最大矩形の高さとしなければならない。マージン、left
、right
の算出方法は以下の通りです。
margin-left
、margin-right
の算出値が"auto
"なら、利用値は"0"とする。top
とbottom
がともに"auto
"なら、top
を静的な位置に設定する。bottom
が"auto
"なら、margin-top
とmargin-bottom
で"auto
"の値を"0"とする。margin-top
とmargin-bottom
がともに"auto
"なら、両者の値が等しくなるように等式を解く。ただし、その結果が負の値になるなら、包含ブロックが"ltr
"("rtl
")の場合margin-top
(margin-bottom
)を0としてmargin-bottom
(margin-top
)について解く。auto
"を取るプロパティが一つしかないなら、それについて等式を解く。bottom
を無視し、それについて等式を解く。overflow:visible
でないブロックレベル要素以上の場合は、次のようになります。
margin-top
とmargin-bottom
で"auto
"の値を"0"とする。height
とする。height
とする。min-height
プロパティとmax-height
プロパティにより、ボックスの最小・最大の高さを指定できます。
計算方法は以下のようになります。
max-height
よりも大きいなら、今度はheight
の算出値をmax-height
に置き換えて上述の方法で再び計算する。min-height
よりも小さいなら、今度はheight
の算出値をmin-height
に置き換えて上述の方法で再び計算する。vertical-align
プロパティに従って、インラインボックスの垂直方向の位置揃えを行う。line-height
プロパティで指定した行ボックスの最小の高さより小さいなら、その最小の高さに必要な高さを加える。インラインレベル要素から成るブロックレベル要素、セル要素、表題要素、インラインブロック要素に対して、line-height
プロパティはその要素が持つ行ボックスの最小の高さを指定します。
インラインレベル要素に対しては、行ボックスの高さの計算に使われる高さを指定します。ただし、置換インライン要素はline-height
プロパティではなくheight
プロパティを用います。
line-height
プロパティには以下の値が利用できます
normal
normal
"は"1.0"から"1.2"までの値として扱うことが推奨されています。<長さ>と<パーセント値>は算出値の段階で絶対的な値に解決されます。それに対して<数値>は利用値になってから値が決まります。よって、<長さ>と<パーセント値>は絶対的な値が継承され、<数値>は指定値がそのまま継承されることになります。
<p><em>強調</em>された文。</p>
p {
line-height: 1.2;
font-size: 10px
}
em {
font-size: 15px;
}
line-height
プロパティを<数値>で指定した場合、p要素のline-height
プロパティは算出値が"1.2"、利用値は10px * 1.2 = 12pxとなります。em要素は算出値の"1.2"が継承されるので、利用値は15px * 1.2 = 18pxとなります。
p {
line-height: 1.2em;
font-size: 10px
}
em {
font-size: 15px;
}
一方、このようにline-height
プロパティを相対単位の<長さ>で指定した場合、p要素のline-height
プロパティの算出値は10px * 1.2 = 12px、利用値も"12px"となり上記の例と同じです。しかし、em要素に継承されるのは算出値の"12px"なので、em要素の利用値は上の例と異なり"12px"となります。font-size
プロパティが"16px"なので、グリフが行ボックスを突き抜ける形になります。
要素 | 指定値 | 算出値 | 利用値 | |
---|---|---|---|---|
指定値が<数値> | p要素 | 1.2 | 1.2 | 10px * 1.2 = 12px |
em要素 | 1.2 (継承) | 1.2 | 15px * 1.2 = 18px | |
指定値が<長さ>(相対単位) | p要素 | 1.2em | 10px * 1.2em = 12px | 12px |
em要素 | 12px (継承) | 12px | 12px |
vertical-align
プロパティは行ボックス内におけるインラインボックスの垂直方向の位置揃えを指定します。
baseline
middle
sub
super
text-top
text-bottom
line-height
プロパティに対するパーセント値の量だけボックスを上に持ち上げます(負の値なら下げます)。"0%"は"baseline
"と同じです。baseline
"と同じです。以下の値は行ボックスに関連して要素の位置を揃えます。要素は自身に関連して位置を揃える子要素を持つかもしれず、またその子要素は自身に関連して位置を揃える子孫を持つかもしれないため、以下の二つの値は整列されたサブツリーの境界を利用します。インライン要素の整列されたサブツリー(aligned subtree)は、その要素とvertical-align
プロパティの算出値が"top
"か"bottom
"でないインラインレベルの子要素のサブツリーを包含します。サブツリーの上辺はサブツリーの中で最も高い位置にあるボックスの上辺、下辺は最も低い位置にあるボックスの下辺になります。
top
bottom
<p>sample <span class="top">top</span></p>
span.top {
vertical-align: top;
font-size: 15px;
border: 1px solid red
}
p {
font-size: 30px;
border: 1px solid blue
}
vertical-align:top
である要素が子要素を持たなければ、自身の上辺が行ボックスの上辺に揃います。
<p>sample <span class="top">top <span class="super">super</span></span></p>
span.top { vertical-align: top }
span.super { vertical-align: super }
span {
font-size: 15px;
border: 1px solid red
}
p {
font-size: 30px;
border: 1px solid blue
}
vertical-align:top
である要素が子孫要素を持つなら、自身と子孫要素の内で最も高い位置にあるボックスの上辺が行ボックスの上辺に揃います。