更新日
#14 ブロック要素とインライン要素の4つの違い
HTMLとCSSの基本的な理解ができてきたので「ブロック要素」と「インライン要素」という概念について触れていきたいと思います。
「ブロック要素」と「インライン要素」とはどのHTMLタグも持っている、タグの分類の共通概念です。

身近なもので例を挙げてみます。
犬であれば個体はパグやポメラニアンなど種類の違いはあれど、必ず男の子か女の子のどちらかであり、性別という概念は共通で持っているものですよね。
タグも同様で、タグの種類は違ってもブロック要素・インライン要素というどちらかの分類に必ず振り分けられます。
ブロック要素とインライン要素の見た目の違い
詳しく掘り下げていく前に、パッとみてどのように違うのかを理解しましょう。
p
はブロック要素、span
はインライン要素です。
一見どちらも同じ見た目ですが、CSSを加えるとその違いがよくわかります。
<p>これはブロック要素です</p>
<span>これはインライン要素です</span>
これはブロック要素です
これはインライン要素ですp
とspan
に同じ緑色の背景色を付け加えてみます。
p, span{
background-color : #02C898;
}
これはブロック要素です
これはインライン要素ですすると、p
の方は画面いっぱいに背景色が広がりましたが、span
の方はテキストの幅にだけ背景色がつきましたね。
また、要素を連続で書いた場合の違いにも差があります。
p
は常に改行されているのに対し、span
はテキストが幅いっぱいになったところで折り返されています。
<p>これはブロック要素です</p>
<p>これはブロック要素です</p>
<p>これはブロック要素です</p>
<span>これはインライン要素です</span>
<span>これはインライン要素です</span>
<span>これはインライン要素です</span>
これはブロック要素です
これはブロック要素です
これはブロック要素です
これはインライン要素です これはインライン要素です これはインライン要素です
このように、ブロック要素とインライン要素では見た目にいくつかの違いをもたらします。
本講座で学習する3つのこと
- タグごとのブロック要素、インライン要素の一覧
- ブロック要素とインライン要素の4つの違い
- ブロック要素←→インライン要素と変換するテクニック
タグごとのブロック要素とインライン要素の一覧
例で挙げたp
はブロック要素、span
はインライン要素でした。
全てのHTMLのタグは以下のようにブロック要素かインライン要素に属しています。
種別 | タグ |
---|---|
ブロック要素 | h1 h2 h3 h4 h5 h6 p div ul ol li table |
インライン要素 | a br button img input span strong video |
どのタグがどちらに分類されているか知らなければ、今後「CSSが狙った通りに効かない!」という事態を引き起こしてしまいます。
ブロック要素とインライン要素の4つの大きな違い
それではブロック要素とインライン要素の違いについて実践レベルで理解していきましょう。
ブロック要素とインライン要素の違いは以下の4つです。
- 要素の広がり方
- 要素の並び方
- 余白のつき方
- 横幅・高さのつき方
違い01|要素の広がり方
まずは要素の広がり方の違いです。
ブロック要素 | インライン要素 |
---|---|
親要素の幅いっぱいに広がる | 要素の幅までしか広がらない |
<div>
親要素
<p>これはブロック要素です</p>
<span>これはインライン要素です</span>
<img src="dog.png" alt="犬">
<div>
div{
background-color : #E2FBF5;
}
p{
background-color : #02C898;
}
span, img{
background-color : #FF6658;
}
これはブロック要素です
これはインライン要素です
最初の例でも説明しましたが、ブロック要素は親要素の幅いっぱいまで広がります。
上記の例では広がりを可視化するために、ブロック要素のp
は緑、インライン要素のspna
、img
には赤の背景色をつけてみました。
すると<p>
は親要素である<div>
と同じ幅まで広がっていますが、インライン要素である<span>
と<img>
はその要素自身のサイズまでしか広がっていません。
違い02|要素の並び方
要素の広がりと関連性があるのが「並び方」です。
ブロック要素 | インライン要素 |
---|---|
改行され縦に並ぶ | 横に並び、親要素の幅いっぱいまでいくと折り返される |
<div>
親要素
<p>これはブロック要素</p>
<p>これはブロック要素</p>
<p>これはブロック要素</p>
<span>インライン要素</span>
<span>インライン要素</span>
<span>インライン要素</span>
<img src="dog.png" alt="犬">
<div>
div{
background-color : #E2FBF5;
}
p{
background-color : #02C898;
}
span, img{
background-color : #FF6658;
}
これはブロック要素
これはブロック要素
これはブロック要素
インライン要素 インライン要素 インライン要素

p(ブロック要素)とspan(インライン要素)の数をそれぞれ増やし並び方を比較してみました。(先ほどの例と同様にわかりやすく可視化するために背景色をつけています)
ブロック要素が親の幅いっぱいに広がるという特徴を持つならば、当然次に表示される要素は折り返され下に回り込みますよね。
そのため、p
で書いたテキストは縦に並び、span
とimg
は横にならび親要素の幅いっぱいまでいったところで下に折り返されています。
違い03|余白のつき方(marginとpadding)
margin
とpadding
による余白のつき方にもブロック要素とインライン要素では違いがあります。
ブロック要素 | インライン要素 |
---|---|
margin は上下左右に余白がつくpadding は上下左右に余白がつく | margin は左右だけで上下につかないpadding は上下左右につくが、上下は他の要素に被る |
少々ややこしいですが、インライン要素の場合は左右しか適用されないと思っておけばOKです👌
<span>これはインライン要素</span>
<p>これはブロック要素</p>
p{
margin: 100px 20px;
}
これはブロック要素
まずは<p>
(ブロック要素)にmargin:100px 20px
で上下に100pxと左右に20pxの余白をつけてみました。きちんと上下左右に余白が付いていますね。
しかし同じ条件で<span>
にmargin:100px 20px
つけてみると…
<span>これはインライン要素</span>
<p>これはブロック要素</p>
span{
margin: 100px 20px;
}
これはブロック要素
たしかにCSSではmarginの上下に100pxと書いてあるのにも関わらず、左右の余白しか効いていません。
このようにインライン要素は上下のmarginは効きません。これは知らないとかなりの確率で「え!?なんで余白つかないの?」と困ることになります。
padding
はまた少しだけ違います。
ブロック要素は通常通り上下左右に余白が付きます。しかしインライン要素は上下の余白は他の要素にかぶってしまいます。
<p>これはブロック要素</p>
<span>これはインライン要素</span>
<p>これはブロック要素</p>
span{
padding: 15px 30px;
}
一見何も変わっていないように見えるが…
これはブロック要素
これはインライン要素これはブロック要素
背景色をつけると被っていることがわかる
これはブロック要素
これはインライン要素これはブロック要素
違い04|高さ・横幅のつき方(widthとheight)
width
とheight
で要素の横幅と高さを指定するときにも違いがあります。
ブロック要素 | インライン要素 |
---|---|
width で横幅の指定が可能height で高さの指定が可能 | width で横幅の指定ができないheight で高さの指定ができない |
<p>ブロック要素</p>
<span>インライン要素</span>
p{
width: 200px;
height: 200px;
background-color: #02C898;
}
span{
width: 200px;
height: 200px;
background-color: #FF6658;
}
ブロック要素
インライン要素p
(ブロック要素)とspan
(インライン要素)それぞれに高さと横幅を200pxになるように指定してみました。
するとp
は200*200の正方形になったのに対し、span
は高さも横幅もそのままですね。
このようにインライン要素はwidth
とheight
を使って横幅と高さを変更できません。
imgは例外です
実は、img
だけはインライン要素であるのにも関わらず上下左右のmargin/paddingが適用できますし、width/heightでの横幅と高さの指定も可能です。
インライン要素でも上下に余白をつけたい場合は?
さて、ここまでの解説で
- 「違いは分かったけど、ただ単に不便な違いがあるってわかっただけ!」
- 「インライン要素で書いた要素の余白や幅を変えたい時どうすればいいの!?」
そんな声が聞こえてきそうですね。それを解決するテクニックを習得して次のステップへ進みましょう。
ケース01|ブロック要素→インライン要素として扱いたい時
例えば上記のようなコードで「・ささみ・チーズ・お芋」と横並びにしたいとします。
<img src="dog.jpg" alt="犬">
<div>
<h3>好きな食べ物</h3>
<p>・ささみ</p>
<p>・チーズ</p>
<p>・お芋</p>
</div>

好きな食べ物
・ささみ
・チーズ
・お芋
p
はブロック要素ですので、その特性上、縦にならんでしまいますよね。
そこで使うのがCSSプロパティのdisplay
です。
このプロパティはタグごとについているブロック要素、インライン要素という特徴を変換してしまうプロパティなんです。
試しに先ほどの例でpに対してdisplay : inline
(セレクタをインライン要素として扱う)と指示をすると…
p{
display : inline;
}

好きな食べ物
・ささみ
・チーズ
・お芋
p
がインライン要素に変換されたことで横並びになりました!
ケース02|インライン要素→ブロック要素として扱いたい時
今度は逆に「インライン要素」を「ブロック要素」として扱いたい時です。
「この犬について詳しくみる」というリンクを
- 横幅いっぱいに広げて、文字を中央寄せにする
- 上に余白をつける
ですが、a
はインライン要素であるためうまくいきませんよね。
<img src="dog.jpg" alt="犬">
<a href="~~">この犬について詳しくみる</a>
a{
color: #fff;
background: #957c68;
text-align: center; /*インラインでは効かない*/
margin-top:20px; /*インラインでは効かない*/
}

そこで先ほどと同様にdisplay
を使用します。今度はインライン要素→ブロック要素の変換なので、a{display : block}
とします。
a{
display: block;
color: #fff;
background: #957c68;
text-align: center; /*インラインでは効かない*/
margin-top:20px; /*インラインでは効かない*/
}

この犬について詳しくみる
インライン要素であるa
がブロック要素と同じように幅いっぱいに広がりmargin-top
もつけることができました。
dispaly
をうまく活用して思い通りにCSSを適用させていきます。display:block
とdisplay:inline
は頻出なので使い方を覚えておこう!ケース03|インライン要素の特徴を残しつつ、paddingとmarginを効くようにしたい場合
前述の❶と❷はブロック要素とインライン要素を逆転させる方法でしたが、便宜上インライン要素の特徴を残したまま、padding
やmargin
の余白を適用できるようにしたいケースがあります。
例えば以下のようなケースです。
これを

こうしたい

インライン要素のままだと余白が効かない
インライン要素に対して、margin
とpadding
はうまく効かないので、インライン要素のままだと次のような見た目になってしまいますよね。(padding
は他の要素と被り、margin-top
は効いていない)
a{
color: #fff;
background: #957c68;
margin-top: 10px;
padding: 20px;
}

display: blockだとブロック要素の特徴で広がりすぎる
かといって以下のようにdisplay: block
でブロック要素に変換すると、その特徴で親要素いっぱいに広がってしまいます。
a{
display: block; /*ブロック要素に変換*/
color: #fff;
background: #957c68;
margin: 10px 45px;
padding: 20px;
}

こんな時に使用するのが
display: inline-block
です!この値を使うことでインライン要素の状態で、padding
とmargin
が正常に効くようになります!
※ちなみにwidth
やheight
も効くようになります。
a{
display: inline-block;
color: #fff;
background: #957c68;
margin: 10px 45px;
padding: 20px;
}

ブロック要素とインライン要素のおさらい!
本講座のおさらいの小テストをしよう
- Q.要素の幅が親要素まで広がるのはブロック要素とインライン要素どっち?
- ブロック要素
- Q.インライン要素が連続して並ぶ時、縦と横どのように並ぶ?
- 横に並ぶ
- Q.ブロック要素とインライン要素、それぞれ3つタグを挙げてみよう
- ブロック要素:p、h1〜h6、div、ul、ol、li…etc
インライン要素:span、a、img、strong、br…etc
- Q.インライン要素にmarginをつけた時、左右と上下効かないのはどっち?
- 上下
- Q.インライン要素にpaddingをつけた時、上下の余白はどうなる?
- 他の要素と被る
- Q.インライン要素をブロック要素として使いたい時のプロパティと値は?
display : block
- Q.ブロック要素をインライン要素として使いたい時のプロパティと値は?
display : inline