質問内容
text alignはブロック要素に効いて、中のインラインレベルコンテンツに作用するということは理解している上で、
下記のコードについて質問です。
bodyタグにtext align centerをかけており、孫要素のspan2にtext align centerが継承されると思っています。spanはインライン要素のため、中のテキスト「テストです。」は中央配置にならないと思っていたら、ブラウザで確認すると、中央配置になりました。
mainタグのtext align center⇨子要素span1にスタイル継承
mainタグのtext align center⇨孫要素span2にスタイル継承
‥という認識なのですが。
スタイルの継承の認識および、なぜ中央配置になったのか、教えて欲しいです。
当方、初学者です。
環境
・VSコードで作成
・Google chromeで確認
該当のソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Sample</title> <style> body{ text-align: center; } </style> </head> <body> <span id="span1"> <span id="span2"> テストです。 </span> </span> </body>気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 11:31
2020/11/01 11:50 編集
2020/11/01 12:54
回答5件
0
ベストアンサー
text-align
項目 説明 名前 text-align 値 start | end | left | right | center | justify | match-parent | justify-all 初期値 start 適用対象 ブロックコンテナ 継承 される
text-alignは子孫要素に継承しますが、display: inline
なspan要素は適用対象(ブロックコンテナ)ではない為、作用しません。
継承はされるので、display: block
を宣言してブロックコンテナに変えれば、適用対象になります。
HTML
1<span style="text-align: center;"><span style="display: block;">span</span></span>
このように、継承先に適用対象があるのなら、インラインボックスに text-align
を指定するのは無意味ではありません。
ブロックレベル要素とインライン要素
HTML4.01仕様。
7.5.3 ブロックレベル要素と行内要素
HTMLの要素のうち、BODY要素に出現し得る要素のあるものは「ブロックレベル」と呼ばれ、他のものは「行内」 (これは「テキストレベル」としても知られている)と呼ばれる。 この違いは、幾つかの点から明らかにされる。
行内要素とは**インライン要素(inline element)**のことです。
HTML4.01Strictではbody要素直下にはブロックレベル要素のみを配置できます。
CSS仕様。
2. Box Layout Modes: the display property
...中略...
Short display Full display Generated box 'block' 'block flow' block-level block container aka block box 'inline' 'inline flow' inline box aka inline block
display: block
は**ブロックボックス(block box)**を生成しますdisplay: inline
は**インラインボックス(inline box)**を生成します
下記HTMLを「W3C Markup Validation」で検証するとします。
HTML4.01Strictの「body要素直下にはブロックレベル要素のみを配置できる制限」を回避する為に、display:block
でブロックレベル要素に変化させられるか確かめます。
HTML
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> 2<html> 3<head> 4<title>sample</title> 5</head> 6<body> 7<span style="display: block">span</span> 8<div>div</div> 9</body> 10</html>
span要素を書いた7行目で下記エラーが出力されます。
Error Line 7, Column 29: document type does not allow element "SPAN" here; missing one of "P", "H1", "H2", "H3", "H4", "H5", "H6", "PRE", "DIV", "ADDRESS" start-tag
ここで <span>, <div>
をHTML4.01/CSSの名称で表すと、次のように分類されます。
HTMLタグ | インライン要素(HTML4.01) | ブロックレベル要素(HTML4.01) | インラインボックス(CSS) | ブロックボックス(CSS) |
---|---|---|---|---|
<span> | ○ | × | ○ | × |
<span style="display: block"> | ○ | × | × | ○ |
<div> | × | ○ | × | ○ |
<div style="display: inline"> | × | ○ | ○ | × |
<span style="display: block">
はインライン要素であり、ブロックボックスです<div style="display: inline">
はブロックレベル要素であり、インラインボックスです
このように解釈すれば、HTML4.01仕様、CSS仕様のそれぞれの規定を矛盾がないことが分かります。
翻って冒頭の質問に戻ると、
bodyタグにtext align centerをかけており、孫要素のspan2にtext align centerが継承されると思っています。spanはインライン要素のため、中のテキスト「テストです。」は中央配置にならないと思っていたら、ブラウザで確認すると、中央配置になりました。
spanがインライン要素であることに言及していますが、text-align
プロパティが見ているのは要素区分ではなく、ボックスなので、
HTML
1<span style="display: block; border: solid 1px black; text-align: center">span</span>
このように、インライン要素であり、ブロックボックスでもある要素には text-align
プロパティを適用できます。
Re: teratail20 さん
投稿2020/11/01 13:52
編集2020/11/03 12:58総合スコア18189
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 15:36
2020/11/03 05:23
2020/11/03 12:52
2020/11/03 13:48 編集
2020/11/03 13:50
2020/11/03 16:38
2020/11/04 22:53
2020/11/04 22:54
0
長くなりそうなので新しく書かせていただきました。
>親要素から子要素へのスタイルの継承という概念を当てはめず、要素内のコンテンツ全てに作用する、という見方でしょうか‥?
そんなことはありません。text-alignは継承されるプロパティです。そして継承されるプロパティは親要素から子要素、子要素から孫要素、孫要素からひ孫要素にもずっと継承されていきます。
このプロパティは継承されるか、継承されないかは覚えるしかありません。しかし大体インライン、インラインブロックをどのように表示するかに関係するプロパティが多いです。よく使うものが継承するプロパティかそうでないかプロパティは書いていればだいたい分かるようになりますし、継承されると思って書いて、継承されなくてもブラウザの検証モードをしっかり活用すれば、すぐにわかります。
一応以下に継承するプロパティの一覧を載せます。
azimuth border-collapse border-spacing caption-side color cursor direction elevation empty-cells font-family font-size font-style font-variant font-weight font letter-spacing line-height list-style-image list-style-position list-style-type list-style orphans pitch-range pitch quotes richness speak-header speak-numeral speak-punctuation speak speech-rate stress text-align text-indent text-transform visibility voice-family volume white-space widows word-spacing
(https://stackoverflow.com/questions/5612302/which-css-properties-are-inheritedy)より引用。
投稿2020/11/01 12:06
総合スコア67
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 13:05
0
text-align は指定した要素内のインラインコンテンツに効きます。
インラインコンテンツとは、インライン要素、インラインブロック要素、テキストです。
これが中央配置されるということです。
指定した要素内のブロック要素には効かないです。
また、スタイルの継承はありなので、子要素、孫要素に継承します。
今回の場合は、bodyに設定した text-align: center; が span1 に効いて span1 が中央配置されます。
インライン要素自体の幅は、中身の幅に合わせられますので、
span2内のテキストの幅=span2の幅= span1の幅となり、
span1自体が中央配置されれば中身も同じ配置になります。
スタイルの継承はspan2までされてますが、それぞれ幅が同じなので、中身が中央配置だろうか左寄せだろうが影響はしないということです。幅一杯なので移動する余地かないということです。display: inline
な要素には text-align は適用されません。
span要素をdisplay: inline-block;
を指定して、幅を設定すると、子要素、孫要素に継承しているのが分かると思います。下記のサンプルをみると理解できると思います。
投稿2020/11/01 12:05
編集2020/11/01 14:47総合スコア34075
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 12:56
2020/11/01 14:12 編集
2020/11/01 14:30
2020/11/01 14:44
2020/11/01 15:11 編集
2020/11/01 15:23
2020/11/01 15:32
2020/11/02 01:58 編集
2020/11/02 13:02
2020/11/03 01:41
2020/11/03 13:05
0
text-align
プロパティは、コンテンツがその親要素内でどのように整列されるかを指定します。そして、ブロック要素に指定した場合はその要素内のコンテンツすべてが、そのように整列します。
ここでコンテンツとはインライン要素、インラインブロック要素です。そして、ブロック要素に指定した場合は、そのブロック要素自体の配置には影響を与えません。ブロック要素自体の配置には、FlexBoxを使ってください。
参考:https://css-tricks.com/almanac/properties/t/text-align/
投稿2020/11/01 11:10
編集2020/11/01 11:11総合スコア67
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 11:47
0
<span>
は(あえてスタイルで指定しない限り)display: inline
ですので、行内に他の文字などと混ざって配置されます。
継承されるかとは関係なく、body
のtext-align: center
に直接したがって配置されます。
投稿2020/11/01 11:08
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/01 12:00
2020/11/01 14:08 編集
2020/11/01 13:26 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。