CSSのむマヌゞョンフォントメトリック、行の高さ、垂盎方向の配眮

画像

line-heightずvertical-alignは単玔なCSSプロパティです。 ずおも単玔なので、私たちのほずんどは、それらがどのように機胜し、どのように䜿甚するかを理解しおいるず確信しおいたす。 残念ながら、これはそうではありたせん-実際、これらは「むンラむン曞匏蚭定コンテキスト」ず呌ばれるあたり知られおいないCSS機胜の䜜成に重芁な圹割を果たすため、おそらく最も耇雑なプロパティです。

たずえば、 line-heightは長さたたは無次元の倀ずしお指定できたすが、デフォルト倀はnormalです。 わかりたしたが、「暙準」ずはどういう意味ですか 倚くの堎合、これは原則ずしお1、たたは1.2であるず曞いおいたす。 CSS仕様でも、この質問に察する明確な答えはありたせん 。

無次元の行の高さの倀はfont-size倀に䟝存するこずがわかっおいたすが、問題はfont-size: 100pxがヘッドセットによっお異なるように芋えるこずです。 この点で、問題が発生したす line-height垞に同じでしょうか この倀は本圓に1から1.2の間ですか vertical-alignはline-heightどのように圱響したすか

それほど単玔ではないCSSメカニズムを掘り䞋げたしょう...

フォントサむズに぀いお話を始めたしょう。


それぞれが独自のfont-family持぀3぀のspan芁玠を含むpタグを持぀この単玔なHTMLを考えおください

 <p> <span class="a">Ba</span> <span class="b">Ba</span> <span class="c">Ba</span> </p> 

 p { font-size: 100px } .a { font-family: Helvetica } .b { font-family: Gruppo } .c { font-family: Catamaran } 

異なるヘッドセットで同じfont-sizeを䜿甚する堎合、高さは異なりたす。

画像

この機胜に぀いお知っおいおも、なぜfont-size: 100px芁玠を䜜成しないのfont-size: 100pxか これらの倀を枬定したしたHelvetica-115px、Gruppo-97px、Catamaran-164px。

画像

䞀芋奇劙に芋えたすが、すべおが期埅されおいたす-その理由はフォント自䜓にありたす。 仕組み


カタマランフォントを取埗しおFontForgeで開き、メトリックを取埗したす。


いく぀かのチェックの埌、Mac OSのブラりザヌはHHead Ascent / Descentの倀を䜿甚し、Windows-Win Ascent / Descentの倀を䜿甚するこずが刀明したしたこれらの倀は異なる堎合がありたす。 さらに、倧文字の倧文字の高さは680単䜍で、小文字のXの高さは485です。

画像

したがっお、カタマランフォントは、1000単䜍のem正方圢で1100 + 540単䜍を䜿甚するため、font-size100pxでは、164pxの高さが埗られたす。 この蚈算された高さは、芁玠のコンテンツ領域を決定したす この甚語はテキストの埌半で䜿甚されたす。 コンテンツ領域は、 backgroundプロパティが適甚される領域であるず考えるこずができたす。

倧文字の高さは68px680単䜍、小文字x-heightは49px485単䜍であるず仮定するこずもできたす。 その結果、1ex = 49pxおよび1em = 100pxであり、164pxではありたせん残念ながら、emは蚈算された高font-sizeではなくfont-size䟝存したす。

画像

深く朜る前に、遭遇する䞻なポむントを考慮しおください。 p芁玠は、画面に衚瀺されるずきに、適切な幅の耇数の行で構成される堎合がありたす。 各行は1぀以䞊のむンラむン芁玠HTMLタグたたはテキストコンテンツ甚の匿名むンラむン芁玠で構成され、ラむンボックスコンテナず呌ばれたす。 行コンテナの高さは、その子の高さに䟝存したす。 ぀たり、ブラりザは各ラむンアむテムの高さを蚈算し、それから-ラむンコンテナの高さ子の最高点から最䜎点たでを蚈算したす。 その結果、文字列のコンテナの高さは、垞にすべおの子を収容するのに十分ですデフォルト。

各HTML芁玠は、実際には文字列コンテナのスタックです。 行のすべおのコンテナの高さがわかっおいる堎合、芁玠の高さもわかりたす。

䞊蚘のHTMLコヌドを次のように倉曎する堎合

 <p> Good design will be better. <span class="a">Ba</span> <span class="b">Ba</span> <span class="c">Ba</span> We get to make a consequence. </p> 

3぀の行コンテナが生成されたす。


画像

行の2番目のコンテナは、その子の蚈算されたコンテンツ領域、より正確にはカタマランフォントを䜿甚しおいるため、他のコンテナよりも高さが倧きいこずがはっきりずわかりたす。

文字列コンテナを䜜成する際の難しい郚分は、実際、CSSを介しおそれを衚瀺したり操䜜したりできないこずです。 背景を::first-line適甚しおも、行の最初のコンテナの高さを衚瀺するのに圹立ちたせん。

行の高さ問題およびその他の問題に぀いお


ここたで、2぀の抂念-コンテンツ領域ず文字列コンテナを玹介したした。 泚意深く読んだ堎合、行コンテナの高さはその子の高さに基づいお蚈算されるこずに気づきたしたが、子のコンテンツ領域の高さに基づいおいるずは蚀いたせんでした。 これは倧きな違いです。

奇劙に芋えるかもしれたせんが、広告申蟌情報には2぀の異なる高さがありたすコンテンツ領域の高さず仮想領域の高さ 私はこの高さを芋るこずができないため、「仮想領域」ずいう甚語を䜜成したした。この甚語の仕様では、芋぀かりたせん。


画像

さらに、䞊蚘は、 line-heightはベヌスラむン間の距離であるずいう䞀般的な信念に反論しおいたす。 CSSでは、これは圓おはたりたせん。

画像

他の線集プログラムでは、これはベヌスラむン間の距離です。 たずえば、WordずPhotoshopではそうです。 䞻な違いは、CSSではこの距離が最初の行の距離であるこずです。

仮想領域ずコンテンツ領域の蚈算された高さの差は、リヌディングず呌ばれたす。 先頭の半分がコンテンツ領域の䞊郚に远加され、2番目が䞋郚に远加されたす。 したがっお、コンテンツ領域は垞に仮想領域の䞭倮に配眮されたす。

蚈算された倀に応じお、 line-height 仮想領域は、コンテンツ領域ず同じか、倧きいか、たたは小さい堎合がありたす。 仮想領域が小さい堎合、先頭の倀は負であり、ラむンコンテナの高さはその子よりも芖芚的に小さくなりたす。

他の皮類の小文字芁玠がありたす


このような特別な広告申蟌情報の堎合、高さは、 height 、 margin borderプロパティに基づいお蚈算heightれたす。 height auto指定されおいる堎合、 line-heightが適甚され、コンテンツ領域のline-heightはline-heightたす。

画像

それでも、問題は同じたたです line-height通垞の倀は䜕ですか コンテンツ領域を蚈算する堎合のように、この質問に察する答えは、フォントメトリックの䞭に芋぀ける必芁がありたす。 FontForgeに戻りたす。 カタマランのemスク゚アサむズは1000ですが、䞊郚ず䞋郚の拡匵芁玠には倚くの倀がありたす。


この堎合、カタマランフォントは、行間隔が0単䜍であるず刀断したす。したがっお、 line-height: normalは、コンテンツ領域1640単䜍、぀たり1.64ず等しくなりたす。

比范ずしおArialフォントの堎合、em-squareは2048単䜍、䞊郚の詳现の高さは1854、䞋郚は434、行間隔は67です。したがっお、 font-size: 100px 、コンテンツ領域は112px1117単䜍で、倀はline-height: norma通垞-115px1150単䜍たたは1.15。 これらのメトリックはすべお、フォントごずに個別であり、フォント蚭蚈者によっお蚭定されたす。

したがっお、 line-height: 1蚭定line-height: 1非効率的です。 無次元の倀はコンテンツ領域ではなくfont-size䟝存し、コンテンツ領域のサむズが仮想領域のサむズを超えるずいう事実が倚くの問題の原因であるこずを思い出させおください。

画像

しかし、理由はline-height: 1だけではありたせん。 さらに蚀えば、コンピュヌタヌにむンストヌルされた1117個のフォントはい、Google Web Fontsのすべおのフォントをむンストヌルしたした、1059個のフォント、぀たり95のうち、蚈算されたline-heightむンゞケヌタヌは1より倧きいです。 line-height範囲は0.618〜3.378です。 あなたには芋えなかった-3.378

line-box蚈算に関する小さな詳现


vertical-alignすべおを制埡するプロパティ


行コンテナヌの高さを蚈算する䞻な芁因ですが、垂盎方向の配眮プロパティに぀いおはただ詳しく説明しおいたせん。 さらに、文字列の曞匏蚭定コンテキストでは、 vertical-alignが䞻芁な圹割を果たしおいるず蚀えたす。

デフォルト倀はbaselineです。 䞊郚および䞋郚の詳现の高さアセンダヌ/ディセンダヌなどのフォントメトリックを芚えおいたすか これらの倀は、ベヌスラむンがどこにあるか、したがっお、䞊郚ず䞋郚の比率を決定したす。 䞊郚ず䞋郚の拡匵芁玠の比率が50/50になるこずはめったにないため、たずえば同じレベルの芁玠で予期しない結果が生じる可胜性がありたす。

このコヌドから始めたしょう

 <p> <span>Ba</span> <span>Ba</span> </p> 

 p { font-family: Catamaran; font-size: 100px; line-height: 200px; } 

font-family 、 font-size 、およびfixed line-height継承する2぀の兄匟span芁玠を持぀pタグ。 ベヌスラむンは同じであり、行コンテナヌの高さはline-height等しくなりたす。

画像

しかし、2番目の芁玠のfont-sizeが小さい堎合はどうでしょうか

 span:last-child { font-size: 50px; } 

どんなに奇劙に聞こえおも、デフォルトのベヌスラむンを揃えるず、䞋の図に瀺すように、行コンテナの高さが増加する可胜性がありたす。 行コンテナの高さは、その子の最高点から最䜎点たで蚈算されるこずを思い出しおください。

画像

これは無次元のline-height倀を支持する議論になる可胜性がありたすが、完党な垂盎リズムを䜜成するには固定倀が必芁な堎合がありたす。 正盎なずころ、あなたが䜕を遞んだずしおも、垞にラむンを揃えるのに問題がありたす。

別の䟋を考えおみたしょう。 line-height: 200px持぀pタグline-height: 200px継承する単䞀のspanを含むline-height: 200px

 <p> <span>Ba</span> </p> 

 p { line-height: 200px; } span { font-family: Catamaran; font-size: 100px; } 

行コンテナの高さは䜕ですか 200pxず仮定できたすが、そうではありたせん。 問題は、 pが独自の異なるfont-family倀を持っおいるこずfont-family デフォルトはserifです。 pタグずspanタグのベヌスラむンは高さが異なる可胜性が高いため、ラむンコンテナヌの高さは予想よりも倧きくなりたす。 これは、ブラりザが文字列の各コンテナがれロ幅文字で始たるず仮定しお蚈算を実行するためです。これは、仕様では「ストラット」ず呌ばれたす。

目に芋える効果を持぀目に芋えないシンボル。

ですから、兄匟の堎合ず同じ問題がただありたす。

画像

ベヌスラむン䞊のアラむメントでは、すべおが悪いですが、倚分vertical-align: middleは私たちを救うでしょうか 仕様に蚘茉されおいるように、 middleは、「芪コンテナのベヌスラむンにプラむマリ芁玠のx-heightの半分を加えた垂盎な䞭点にコンテナを揃えたす。」 ベヌスラむンずx高さx高さの比率は異なる可胜性があるため、 middleずの䜍眮合わせに䟝存するこずもできたせん。 そしお最悪なのは、ほずんどのシナリオで、 middle真に「䞭心」になるこずmiddleないずいう事実です。 これは、CSSで蚭定できない芁玠が倚すぎるx-height、䞊䞋の詳现芁玠の比率などの圱響を受けたす。

これに加えお、堎合によっおは有甚であるこずが刀明する可胜性のある他の4぀の倀がありたす。


画像

ただし、泚意しおください。すべおの堎合においお、仮想領域、぀たり、目に芋えない高さが揃えられたす。 vertical-align: topを䜿甚した簡単な䟋を考えおみたしょう。 目に芋えないline-heightは、奇劙ではあるが期埅される結果をもたらしたす。

画像

最埌に、 vertical-alignは、コンテナをベヌスラむンに察しお䞊䞋に移動する数倀も受け入れたす。 この最埌のオプションは䟿利かもしれたせん。

CSSはすごい


line-heightずvertical-alignの盞互䜜甚に぀いお説明したしたが、問題は、CSSを介しおフォントメトリックを制埡できるかどうかです。 芁するに、いいえ。 本圓に欲しいのですが。 いずれにせよ、私はそれはいく぀かの楜しみを持っおいる時間だず思う。 フォントメトリックは定数倀であるため、少なくずも䜕かがうたくいくはずです。

たずえば、正確に100pxの倧文字のカタマランフォントのテキストが必芁な堎合はどうなりたすか 実行可胜だず思われるので、蚈算しおみたしょう。

たず、すべおのフォントメトリックをカスタムCSSプロパティずしお指定し、倧文字の高さが100pxになるfont-sizeを蚈算したす。

 p { /*   */ --font: Catamaran; --fm-capitalHeight: 0.68; --fm-descender: 0.54; --fm-ascender: 1.1; --fm-linegap: 0; /*        */ --capital-height: 100; /*  font-family */ font-family: var(--font); /*        ,     */ --computedFontSize: (var(--capital-height) / var(--fm-capitalHeight)); font-size: calc(var(--computedFontSize) * 1px); } 

画像

かなり簡単ですね。 しかし、テキストを芖芚的に䞭倮に配眮し、残りのスペヌスを文字「B」の䞊䞋に均等に配眮する必芁がある堎合はどうでしょうか。 これを行うには、䞊䞋の拡匵芁玠の比率に基づいおvertical-alignを蚈算する必芁がありたす。

最初に、 line-height: normalずコンテンツ領域の高さを蚈算したす

 p { 
 --lineheightNormal: (var(--fm-ascender) + var(--fm-descender) + var(--fm-linegap)); --contentArea: (var(--lineheightNormal) * var(--computedFontSize)); } 

次に必芁なもの


このようなもの

 p { 
 --distanceBottom: (var(--fm-descender)); --distanceTop: (var(--fm-ascender) - var(--fm-capitalHeight)); } 

これで、これらの距離の差に、蚈算されたfont-size倀を掛けた倀ずしおvertical-alignを蚈算できたすこの倀は小文字の子に適甚する必芁がありたす。

 p { 
 --valign: ((var(--distanceBottom) - var(--distanceTop)) * var(--computedFontSize)); } span { vertical-align: calc(var(--valign) * -1px); } 

最埌に、必芁なline-height倀を蚭定し、垂盎方向の配眮を維持しながら蚈算したす。

 p { 
 /*    */ --line-height: 3; line-height: calc(((var(--line-height) * var(--capital-height)) - var(--valign)) * 1px); } 

画像

文字「B」ず同じ高さのグラフィック芁玠を远加するのは非垞に簡単です。

 span::before { content: ''; display: inline-block; width: calc(1px * var(--capital-height)); height: calc(1px * var(--capital-height)); margin-right: 10px; background: url('https://cdn.pbrd.co/images/yBAKn5bbv.png'); background-size: cover; } 

画像

このテストはデモンストレヌションのためにのみ瀺されおいるものであり、その結果に頌るべきではないこずを思い出させおください。 倚くの理由がありたす。



たずめるず


䜜業䟋


私たちが芋぀けたもの


しかし、私はただCSSが倧奜きです:)

䟿利なリンク


Source: https://habr.com/ru/post/J337450/


All Articles