質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

Q&A

解決済

2回答

1657閲覧

flex-direction: column; とインライン要素の関係が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

0グッド

0クリップ

投稿2019/03/30 06:34

編集2019/03/30 06:36

環境:MacBook Pro Chrome Atomエディタ

flex-direction: column; にすると、インライン要素はブロック要素に変化するのでしょうか?

コード

HTML

1<div class="test1"> 2 <button type="button">ボタンタグtest1</button> 3 <a href="#">aタグtest1</a> 4</div> 5 6<div class="test2"> 7 <button type="button">ボタンタグtest2</button> 8 <a href="#">aタグtest2</a> 9</div> 10

CSS

1.test1{ 2 display: flex; 3 flex-direction: column; 4} 5.test1 button{ 6 height: 100px; 7} 8.test1 a{ 9 border: 3px solid blue; 10 height: 100px; 11} 12 13.test2 button{ 14 height: 100px; 15} 16.test2 a{ 17 border: 3px solid blue; 18 height: 100px; 19} 20

↑このコードのブラウザ画面
イメージ説明

以下、質問内容になります。

① インライン要素がブロック要素に変化したと思った理由。
columnにすると、「ボタンタグtest1」と、borderで囲った「aタグtest1」が、
・画面の端から端まで広がる
・heightが効いている。
以上の事から、ブロック要素に変化しているという解釈で良いのでしょうか?

② ①の解釈が正しかったとしても、大きな疑問が。
「ボタンタグtest2」 はインライン要素のはずなのに、
heightが効いているのは何故ですか?
もしかして、button要素はインライン要素でもありブロック要素でもある的な概念ですか?
だとしてもその意味がよく理解できません。

.test2 button{ height: 100px; display: block; } .test2 a{ border: 3px solid blue; height: 100px; display: block; } 

イメージ説明
このようにした場合、「aタグtest2」のみが画面端から端まで広がるのですが、
何故、「ボタンタグtest2」は広がらないのでしょうか?
規則性がまるでわかりません。
・columnしたら、「button要素」も「borderで囲ったa要素」も横に広がりheightも効く。

・flex無しで、普通に「button要素」と「borderで囲ったa要素」に heightを適用させた場合、「button要素」のみに効く。(buttonはインライン要素ではない?)

・flex無しで、「button要素」と「borderで囲ったa要素」をdisplay: block;を適用させた場合、「button要素」と「borderで囲ったa要素」両者がheightは効き、「borderで囲ったa要素」のみが画面端から端まで広がる。

以上、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

順番に回答します。

①ブロック要素に変化しているという解釈で良いのでしょうか?

はい。そうです。
しかし、

>・画面の端から端まで広がる

これは「ブロック要素に変化」したからではなく、親要素のflex(flex-direction: column;)により、「align-items: stretch;」初期値のためストレッチ効果で広げられています。
例えば、初期値以外の「align-items: flex-start;」を設定すると、広がらないので分かるかと思います。


② ①の解釈が正しかったとしても、大きな疑問が。・・・

もしかして、button要素はインライン要素でもありブロック要素でもある的な概念ですか?

button要素は、少し特殊で、インライン要素ですが、「インラインブロック要素」みたいな部分もあります。


③何故、「ボタンタグtest2」は広がらないのでしょうか?

見た目は違いますが、「ボタンタグtest2」要素は広がっています。なので「aタグtest2」が横並びから、縦並びになっています。

見た目が広がって見えないのはブラウザによるデフォルトスタイルが適用されているからです。

投稿2019/03/31 08:21

yoshinavi

総合スコア3523

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

そもそもブロック要素とは何でしょうか?
HTML4 にはブロックレベル要素やインライン要素という分類があってHTMLを書くときに注意を払うこともありましたが、HTML5 では別の分類となっています。
HTML の入れ子のルールは CSS のレイアウトによらず変わりません(要素が変わることはありません)。

レイアウトに関していえば、
CSS Flexible Box Layout Module Level 1 で
https://www.w3.org/TR/css-flexbox-1/#flex-items

The display value of a flex item is blockified: if the specified display of an in-flow child of an element generating a flex container is an inline-level value, it computes to its block-level equivalent.

フレックスアイテムの display 値はブロック化されます:フレックスコンテナを生成する要素のフロー内にある子に指定された display がインラインレベルの値であるなら、ブロックレベル相当の値に計算されます。

CSS Display Module Level 3 で、
https://www.w3.org/TR/css-display/#transformations

Note: Authors reading this spec may want to skip past the following box-generation and static position details.

詳細を読み飛ばしてもよいと注意書きしたうえで、

A parent with a grid or flex display value blockifies the box’s display type.

grid または flex の display 値を持つ親は、子の表示タイプをブロック化します。

なお、レンダリングに関しては HTML 仕様でウィジェットという用語で触れていて、button は inline-block のようにレンダリングすることが期待されています。
width を指定したほうがいいでしょう。
https://html.spec.whatwg.org/multipage/rendering.html#widgets

投稿2019/04/02 07:36

x_x

総合スコア13749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshinavi

2019/04/03 01:27

>そもそもブロック要素とは何でしょうか? HTML4 にはブロックレベル要素やインライン要素という分類があってHTMLを書くときに注意を払うこともありましたが、HTML5 では別の分類となっています。 → 確かにHTML5では「ブロックレベル要素やインライン要素」の分類がなくなりましたが、考え自体は継承されており、また、cssでの分類がなくなってはいないので、便宜上、簡潔に「ブロック要素・インライン要素」の呼称でも、実際のレイアウトには支障はなく、意味はとおりやすいかと、思っております。
x_x

2019/04/03 02:23

HTML4 で使っていたのと同じ「インライン要素」を別の意味で使えば混乱しませんか? 実際フレックスアイテムは要素である必要はなく匿名のボックスかもしれません。 CSS仕様ではきちんとブロックレベル、インラインレベルなどの用語で言っているわけですが、MDNでの記述が誤解を招いているのでしょうか? https://www.w3.org/TR/css-display/#glossary
yoshinavi

2019/04/03 02:49

HTML5で「ブロックレベル要素やインライン要素」の分類をなくしたのが混乱の原因かと、個人的には思います。 いちいち「フローコンテンツとは、従来のブロックレベル要素であり、CSSでは、従来どおりのブロックレベルに変わりはありません」等の説明をしなければ、理解が追い付いていかないのではと思います。 確かに、HTML5の考えで行けば、「フロー」や「フレージング」が従来の呼称に該当はしますが、他の意味合いも持たせたかったので、新名称にしたのかと、思えるところはあります。 そして、CSSで「display:block;」や「display:inline;」の記述をするところから、単に「ブロック(レベル)要素」や「インライン(レベル)要素」と簡潔に略しても、実際のコーディング時に大きな支障とならないので、その辺りから、きているのではないのでしょうか? せっかく覚えた単語呼称を、HTMLの仕様変更の都度に変更するのを嫌がっているのも、あるのかもしれません。 例えば、これは「フローコンテンツ」「ブロックレベル」と区分けするよりも、単に「ブロック要素」と一括りにしているだけが、現状ではないのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問