- CSS
CSS displayの種類一覧|block・inline・noneの違い
CSS の display とは、要素を「どんな箱として並べるか」と「中身(子要素)をどう並べるか」を決めるプロパティで、block は横幅いっぱいに広がって縦に積まれ、inline は文章の一部として横に並び、none は箱そのものを作りません。 inline-block・flex・grid などの値も、この「外側の並び方」と「内側の並べ方」の組み合わせとして整理できます。
この記事では、display の値の一覧表、block・inline・inline-block で幅・高さ・上下の margin / padding・改行がどう効くかの比較、主な HTML 要素の既定値、inline-block の隙間の原因と対処、display: none と visibility: hidden・opacity: 0・hidden 属性の違い、none からのアニメーション、display: contents の注意点までを扱います。比較表の数値はすべて Chromium 141(Playwright 1.56 のヘッドレス実行)で getBoundingClientRect() や getComputedStyle() を使って実測したものです。「効く・効かない」を言葉だけでなく px の数値で確かめられます。
CSS displayの早見表
よく使う値は block・inline・inline-block・flex・grid・none の6つです。 まずはこの表で全体をつかんでください。
| 値 | 外側(自分の並び方) | 内側(子の並べ方) | ひとことで | 主な用途 |
|---|---|---|---|---|
block |
ブロック(前後で改行、横幅いっぱい) | 通常の流れ | 縦に積まれる箱 | 段落、見出し、セクション |
inline |
インライン(文中に並ぶ) | 通常の流れ | 文章の一部。幅・高さの指定は効かない | 文中の強調、リンク |
inline-block |
インライン | 通常の流れ(独立した箱) | 横に並びつつ、幅・高さが効く | ボタン、バッジ、タグ |
flex |
ブロック | フレックス | 子を1方向に並べる | ナビ、横並び、中央寄せ |
inline-flex |
インライン | フレックス | 文中に置けるフレックス | アイコン付きボタン |
grid |
ブロック | グリッド | 子を行と列に並べる | カード一覧、ページ全体の枠 |
inline-grid |
インライン | グリッド | 文中に置けるグリッド | 小さな格子状の部品 |
flow-root |
ブロック | 通常の流れ(独立した箱) | 中の float や margin を閉じ込める | float の回り込み解除、margin の相殺を止める |
contents |
箱を作らない | 子が親の位置に入る | 自分の箱だけ消し、子は残す | ラッパー要素を Flex / Grid から外す |
none |
箱を作らない | 子も作らない | 表示せず、場所も取らない | 非表示の切り替え |
list-item |
ブロック | 通常の流れ + 行頭記号 | li の既定値 |
行頭記号(マーカー)を出す |
table・table-row・table-cell など |
表の各部品 | 表のレイアウト | table・tr・td の既定値 |
表、および表と同じ並べ方をさせたいとき |
inline-table |
インライン | 表のレイアウト | 文中に置ける表 | あまり使わない |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CSS displayの種類一覧|block・inline・noneの違い」
displayが決める2つのこと(外側と内側)
display の値は、次の2つを同時に決めています(MDN の display のページで確認)。
- 外側の表示型(outer display type):その要素自身が、親の中でどう並ぶか。
blockかinline。 - 内側の表示型(inner display type):その要素の子が、どのルールで並ぶか。
flow(通常の流れ)、flow-root、flex、grid、tableなど。
flowchart LR
D[display の値] --> O[外側: 自分の並び方]
D --> I[内側: 子の並べ方]
O --> O1[block: 前後で改行]
O --> O2[inline: 文中に並ぶ]
I --> I1[flow: 通常の流れ]
I --> I2[flow-root: 独立した箱]
I --> I3[flex / grid / table]
現在の仕様では display: inline flex のように 2語で「外側 内側」を並べて書くこともでき、これまでの1語の書き方はその短縮形にあたります。Chromium 141 で CSS.supports() と算出値(getComputedStyle の結果)を確かめた結果は次のとおりです。
| 2語の書き方 | CSS.supports |
算出値(1語の書き方) |
|---|---|---|
block flow |
true | block |
inline flow |
true | inline |
inline flow-root |
true | inline-block |
block flow-root |
true | flow-root |
block flex |
true | flex |
inline flex |
true | inline-flex |
inline grid |
true | inline-grid |
block flow list-item |
true | list-item |
inline-block の正体は「外側は inline、内側は flow-root」だと分かります。つまり「文中に並ぶが、中身は独立した箱」です。なお、MDN に載っている run-in と grid-lanes は、Chromium 141 では CSS.supports が false でした。
普段の CSS は1語の書き方で十分です。2語の書き方は「flex は外から見ると block と同じ」と理解するための見取り図として役立ちます。
block・inline・inline-blockの違い(実測比較)
比較に使ったコード
同じスタイル(width: 200px; height: 100px; margin: 20px; padding: 10px)を付けた span の display だけを切り替え、前後に文字を置いて寸法と位置を測りました。親の幅は 600px、文字は 16px、行の高さは 24px です。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<style>
body { margin: 0; font: 16px/24px monospace; }
#wrap { width: 600px; background: #eee; }
#t {
display: inline-block; /* ここを block / inline / inline-block に切り替える */
width: 200px;
height: 100px;
margin: 20px;
padding: 10px;
background: #9cf;
}
</style>
</head>
<body>
<div id="wrap"><span id="a">前</span><span id="t">対象</span><span id="b">後</span></div>
<script>
const r = document.getElementById('t').getBoundingClientRect();
const w = document.getElementById('wrap').getBoundingClientRect();
console.log(`対象: ${r.width} x ${r.height} / 親の高さ: ${w.height}`);
</script>
</body>
</html>
ブラウザで開いてコンソールを見ると、inline-block のとき 対象: 220 x 120 / 親の高さ: 160 と表示されます。
実測結果
| 項目 | block |
inline |
inline-block |
|---|---|---|---|
| 対象の箱の大きさ(padding 込み) | 220 × 120 | 52 × 39 | 220 × 120 |
width・height |
効く | 効かない(文字の幅 32px + 左右 padding 20px) | 効く |
| 前後の改行 | 入る(「後」は次の行へ) | 入らない(「後」は同じ行) | 入らない(「後」は同じ行) |
| 左右の margin | 効く | 効く(左に 20px の間隔) | 効く |
| 上下の margin | 効く | 効かない | 効く |
| 上下の padding | 効く | 背景は広がるが、行の高さは変わらない | 効く |
| 親の高さ | 208px(24 + 20 + 120 + 20 + 24) | 24px(1行分のまま) | 160px(120 + 上下 margin 40) |
| サイズ指定なしのときの箱 | 600 × 24(親の幅いっぱい) | 32 × 19(文字の分だけ) | 32 × 24(文字の分だけ) |
数値から読み取れることを整理します。
blockは幅を指定しなければ親の幅いっぱい(600px)に広がり、前後で改行します。 「前」「対象」「後」が3段に積まれたため、親の高さは 208px になりました。inlineはwidth・heightと上下の margin が効きません。 上下の padding は背景色としては描かれます(箱の高さ 39px = 文字 19px + 上下 padding 20px)が、親の高さは 24px のままで、対象の上端は親より 8px 上にはみ出していました。上下の行と重なって見える原因はこれです。inline-blockは横に並んだまま、blockと同じ 220 × 120 の箱になります。 上下の margin も親の高さに反映されました(160px)。
「横に並べたい、でも幅・高さ・上下の余白も効かせたい」ときが inline-block の出番です。複数の要素を横に並べてレイアウトする用途には、後述の隙間の問題がない flex が向いています。
text-align と vertical-align の効き方
| プロパティ | 何に効くか | 使い方 |
|---|---|---|
text-align |
ブロックの中のインライン内容(文字、inline、inline-block)を左右に寄せる |
親(ブロック)に指定する。inline-block のボタンを中央に置くなら、親に text-align: center |
vertical-align |
inline・inline-block・table-cell の縦位置 |
対象の要素自身に指定する。block に指定しても効かない |
margin: 0 auto |
幅を指定した block を左右中央に置く |
inline・inline-block には効かない |
中央寄せの方法全体は、当サイトの「CSS 中央寄せの方法」の記事で 15 パターンを実測しています。
主な要素の既定値一覧
HTML の要素には、ブラウザがあらかじめ display の値を割り当てています。Chromium 141 で各要素を作り、getComputedStyle(要素).display を読んだ結果です。
| 既定値 | 要素 |
|---|---|
block |
div p h1〜h6 section article header footer main nav ul ol dl dt dd form blockquote pre hr address figure details |
inline |
span a strong em b i code small label br img video canvas svg iframe |
inline-block |
input button select textarea |
list-item |
li、details の中の summary |
table |
table |
table-row |
tr |
table-cell |
td th |
table-header-group / table-row-group / table-footer-group |
thead / tbody / tfoot |
table-caption / table-column-group / table-column |
caption / colgroup / col |
ruby |
ruby |
none |
head title script style template、開いていない dialog、hidden 属性の付いた要素 |
img は inline ですが、width・height が効きます。 画像や動画、input のように中身が外部のコンテンツやフォーム部品である要素は「置換要素」と呼ばれ、inline でも寸法を指定できる特別な扱いになっています。
また、img の下にできる数 px の隙間は、inline として文字のベースライン(文字の下端の基準線)に揃えられるために生じます。高さ 40px の画像だけを入れた div の高さを測ると次のとおりでした。
| 画像の指定 | 親 div の高さ |
|---|---|
指定なし(inline、ベースライン揃え) |
47px(下に 7px の隙間) |
vertical-align: bottom |
40px |
display: block |
40px |
画像の下の隙間をなくしたいときは、display: block か vertical-align: bottom(または middle)を指定します。
inline-blockの隙間の原因と対処
inline-block を横に並べると、要素の間に数 px の隙間ができます。原因は、HTML のタグとタグの間の改行や空白が「半角スペース1つ」として表示されるためです。inline-block は文字と同じ扱いで並ぶので、単語の間の空白と同じものが入ります。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<style>
body { margin: 0; font: 16px/24px monospace; }
.row { width: 600px; }
.item { display: inline-block; width: 100px; height: 40px; background: #9cf; }
</style>
</head>
<body>
<div class="row">
<span class="item"></span>
<span class="item"></span>
</div>
</body>
</html>
2つの .item の間隔(右の箱の左端 − 左の箱の右端)を、条件を変えて測りました。
| 条件 | 隙間 | 説明 |
|---|---|---|
| タグの間に改行あり(文字 16px) | 9.64px | 半角スペース1つ分 |
| タグの間に改行あり(文字 32px) | 19.27px | 文字サイズに比例して広がる |
タグを詰めて書く(</span><span>) |
0px | 空白がなければ隙間もない |
親に font-size: 0 |
0px | 空白の幅が 0 になる。子で文字サイズを戻す必要がある |
親に display: flex |
0px | 子がフレックスアイテムになり、空白は表示されない |
親に display: flex; gap: 8px |
8px | 間隔を数値で決められる |
隙間の大きさはフォントと文字サイズで変わります(この測定は等幅フォントです)。間隔を自分で決めたい場合は、親を display: flex にして gap で指定する方法が、HTML の書き方に左右されず分かりやすい選択です。
/* 直す前:隙間がフォント任せになる */
.item { display: inline-block; }
/* 直した後:親で並べ、間隔は gap で決める */
.row { display: flex; gap: 8px; }
inline-block が向いているのは、文中に置くバッジやボタンのように「文字と一緒に流れてほしい」部品です。その場合、単語の間の空白と同じ隙間はむしろ自然な間隔として働きます。
display:noneとvisibility:hidden・opacity:0・hidden属性の違い
要素を見えなくする方法は複数あり、「場所を取るか」「読み上げられるか」「クリックできるか」が異なります。 「上」「保存する(ボタン)」「下」を縦に並べ、ボタンを各方法で隠して測りました。
<div id="w" style="width:300px">
<p style="margin:0">上</p>
<button id="t" style="display:none">保存する</button> <!-- ここを切り替える -->
<p style="margin:0">下</p>
</div>
<button id="after">次</button>
| 方法 | 領域(親の高さ) | ボタンの箱 | アクセシビリティのスナップショット | ボタンの位置をクリック | Tab キーでのフォーカス |
|---|---|---|---|---|---|
| 比較用(表示したまま) | 78px | 80 × 30 | button "保存する" が出る |
反応する | 当たる |
display: none |
48px(詰まる) | 0 × 0 | 出ない | 反応しない | 飛ばされる |
visibility: hidden |
78px(確保される) | 80 × 30 | 出ない | 反応しない | 飛ばされる |
opacity: 0 |
78px(確保される) | 80 × 30 | 出る | 反応する | 当たる |
hidden 属性 |
48px(詰まる) | 0 × 0 | 出ない | 反応しない | 飛ばされる |
「アクセシビリティのスナップショット」は Playwright の aria_snapshot() の結果で、スクリーンリーダー(画面読み上げソフト)に伝わる要素の目安になります。実際の読み上げソフトでの確認は行っていません。
| 方法 | 向いている用途 |
|---|---|
display: none |
完全に取り除きたいとき。タブの切り替え、開いていないメニュー |
visibility: hidden |
場所は残したまま隠したいとき。隠してもレイアウトを動かしたくない場合 |
opacity: 0 |
フェードのアニメーション。見えなくても操作できるので、隠している間は visibility: hidden や pointer-events: none と組み合わせる |
hidden 属性 |
HTML 側で「いまは関係のない内容」と示したいとき。JavaScript で el.hidden = true / false と切り替えられる |
hidden属性は display の指定で上書きされる
hidden 属性は、ブラウザの既定のスタイルで display: none になる仕組みです。そのため、自分の CSS で display を指定すると表示されます。 Chromium 141 での算出値です。
<style>.box { display: flex; }</style>
<div class="box" hidden>x</div>
getComputedStyle(要素).display → "flex"(hidden を付けているのに表示される)
hidden を使う要素にクラスで display を当てる場合は、次の1行を足しておくと意図どおりに隠れます。
[hidden] { display: none !important; }
なお、hidden="until-found" を付けた要素は、Chromium 141 では display: block・content-visibility: hidden になっていました。ページ内検索で見つかったときに開く、という用途向けの値です。
見た目だけ隠して読み上げには残す
反対に「画面には出さないが、読み上げには伝えたい」テキスト(アイコンだけのボタンの説明など)には、display: none も visibility: hidden も使えません。次のような「視覚的に隠す」クラスが広く使われています(一般に知られた書き方で、この記事では読み上げの確認は未実行です)。
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
margin: -1px;
padding: 0;
overflow: hidden;
clip-path: inset(50%);
white-space: nowrap;
border: 0;
}
display:noneからアニメーションさせる方法
display は「数値の途中」がない値(離散値)なので、これまでは display: none と display: block の切り替えに transition を組み合わせても、フェードが動きませんでした。現在は transition-behavior: allow-discrete と @starting-style の2つで、CSS だけで開閉のフェードを書けます。
対応状況
MDN では、transition-behavior と @starting-style はどちらも 「Baseline 2024(Newly available)」で、2024年8月以降の主要ブラウザの最新版で動くと案内されています(一部の機能は対応に差があるとの注記つき)。Chromium 141 では CSS.supports('transition-behavior', 'allow-discrete') が true でした。
コピペ用の完成形
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<style>
.panel {
display: none;
opacity: 0;
/* display の切り替えも transition の対象にする */
transition: opacity 0.5s linear, display 0.5s linear allow-discrete;
}
.panel.open {
display: block;
opacity: 1;
}
/* none から表示されるときの「出発点」 */
@starting-style {
.panel.open { opacity: 0; }
}
</style>
</head>
<body>
<button type="button" onclick="document.getElementById('p').classList.toggle('open')">開閉</button>
<div id="p" class="panel">パネルの内容</div>
</body>
</html>
transition の一括指定の中の allow-discrete は、transition-behavior: allow-discrete を display に対して指定したのと同じ意味です。
4パターンの実測
クラス open を付けた直後(開く)と外した直後(閉じる)から、経過時間ごとの display と opacity の算出値を記録しました(0.5 秒、linear)。
開くとき(open を付ける)
| 書き方 | 0ms | 約100ms | 約250ms | 約400ms | 約600ms |
|---|---|---|---|---|---|
1) transition: opacity のみ |
1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
2) + allow-discrete |
1.00 | 1.00 | 1.00 | 1.00 | 1.00 |
3) + allow-discrete + @starting-style |
0.00 | 0.20 | 0.50 | 0.80 | 1.00 |
4) @starting-style のみ |
0.00 | 0.20 | 0.50 | 0.80 | 1.00 |
閉じるとき(open を外す)
| 書き方 | 0ms | 約100ms | 約250ms | 約400ms | 約600ms |
|---|---|---|---|---|---|
1) transition: opacity のみ |
none / 0.00 | none | none | none | none |
2) + allow-discrete |
block / 1.00 | block / 0.77 | block / 0.47 | block / 0.17 | none / 0.00 |
3) + allow-discrete + @starting-style |
block / 1.00 | block / 0.77 | block / 0.47 | block / 0.17 | none / 0.00 |
4) @starting-style のみ |
none / 0.00 | none | none | none | none |
| 役割 | 担当 | ないとどうなるか |
|---|---|---|
| 開くときのフェード | @starting-style |
none の間は「前の状態」がないため、いきなり opacity: 1 で表示される(1・2) |
| 閉じるときのフェード | display ... allow-discrete |
すぐに display: none になり、フェードが見えない(1・4) |
閉じるときは、allow-discrete を付けると display が 0.5 秒間 block のまま保たれ、最後に none に切り替わります。 MDN にも「表示から none へのアニメーションでは、値は 100% の時点で none に切り替わる」と説明されており、実測と一致しました。開閉の両方を滑らかにするには、3) のように2つをセットで書きます。
transition と @keyframes の使い分けなど、アニメーション全般は当サイトの「CSS アニメーション」の記事で扱っています。
display:contentsの使いどころと注意
display: contents は、その要素自身の箱を作らず、子要素を「親の直接の子」であるかのように並べる値です。Flexbox や Grid の中にラッパー要素が挟まっていて、孫要素を親のレイアウトに参加させたいときに使えます。
<div style="display:flex; gap:10px; width:600px">
<div style="width:100px">A</div>
<div id="wrap" style="display:contents; background:red; padding:20px; border:5px solid; margin:30px">
<div style="width:100px">B</div>
<div style="width:100px">C</div>
</div>
</div>
| 測ったもの | 結果 |
|---|---|
#wrap の箱の大きさ |
0 × 0 |
| A・B・C の左端 | 0px・110px・220px(3つとも親の flex に直接並び、gap 10px が効く) |
#wrap の背景・padding・border・margin |
箱がないため、どれも描かれず間隔にも影響しない |
使うときに知っておきたい点は次の3つです。
| 注意点 | 内容 |
|---|---|
| 箱に関するスタイルが消える | 背景・枠線・padding・margin・幅・高さは効かない。color や font など、子に継承されるプロパティは働く |
| ボタンなどの操作できる要素には使わない | button に display: contents を指定して Tab キーを押すと、そのボタンにはフォーカスが当たらず、次のリンクへ進みました(Chromium 141)。キーボードで操作できなくなる |
| 読み上げへの影響 | MDN には、display: contents の要素がアクセシビリティツリーから外れる実装上の課題があるとの注意書きがある。Playwright のスナップショットでは button・list・navigation・row の役割は残っていたが、意味を持つ要素(リスト、表、ボタン)より、意味を持たない div のラッパーに使うのが穏当 |
Grid の入れ子で列を揃えたい場合は subgrid という選択肢もあります。Flexbox と Grid の選び方は、当サイトの「FlexboxとGridの使い分け」の記事で、同じ UI を両方で作って比較しています。
flow-root・list-item・table系の使いどころ
flow-root:中身を閉じ込める箱
display: flow-root は、外から見ると block と同じで、内側に「独立した整形の範囲(ブロック整形コンテキスト)」を作る値です。次の2つの場面で役立ちます。
| 場面 | block のとき |
flow-root にすると |
|---|---|---|
子が float している |
親の高さに float した子が含まれず、親がつぶれる | 親が float した子を含む高さになる |
| 子の上 margin が親の外に出る(margin の相殺) | 親ごと下に押し下げられる | margin が親の内側に収まる |
以前は overflow: hidden や clearfix と呼ばれる書き方で同じ効果を得ていましたが、flow-root は「はみ出しを切り取る」などの副作用がありません。
list-item:行頭記号を出す
li の既定値です。li に display: block や display: flex を指定すると、行頭記号(・や数字)が出なくなります。記号を残したまま中身を横に並べたいときは、li の中に div を1つ入れて、その div を flex にします。
table系:表の並べ方を借りる
display: table / table-row / table-cell は、table・tr・td の既定値です。反対に、table 要素に display: block や flex を指定すると、表としての意味が読み上げに伝わりにくくなると MDN に注意書きがあります。スマートフォン向けに表を縦積みにする場合は、この点を踏まえて確認します。表のレスポンシブ対応は、当サイトの「HTMLテーブルのCSSデザイン」の記事で扱っています。
目的別・displayの選び方
| やりたいこと | 選ぶ値 | 補足 |
|---|---|---|
| 縦に積む(通常の段落・セクション) | block |
div・p は既定でこの値 |
a や span に幅・高さ・上下の余白を付ける |
inline-block または block |
文中に置くなら inline-block、1行を占めるなら block |
| リンク全体をクリックできる大きさにする | display: block + padding |
メニューの項目など |
| 子を横1列に並べる、間隔をそろえる | flex + gap |
隙間の問題がない |
| 子を行と列に並べる | grid |
カード一覧など |
| アイコンと文字を並べたボタンを文中に置く | inline-flex |
align-items: center で縦位置を揃える |
| float の回り込みや margin の相殺を親の中に収める | flow-root |
|
| ラッパーを飛ばして孫を親のレイアウトに参加させる | contents |
操作できる要素には使わない |
| 完全に隠す | none |
場所を残すなら visibility: hidden |
つまずきやすい点のチェック表
| 症状 | 原因 | 直し方 |
|---|---|---|
span や a に width・height が効かない |
inline には幅・高さが効かない |
display: inline-block か block にする |
span の上下の margin が効かない |
inline には上下の margin が効かない |
inline-block にする |
span の上下の padding が前後の行と重なる |
inline の上下 padding は行の高さに反映されない |
inline-block にする、または line-height を広げる |
横に並べた inline-block の間に隙間ができる |
タグの間の改行が空白として表示される | 親を display: flex にして gap で間隔を決める |
| 画像の下に数 px の隙間ができる | img が inline でベースラインに揃う |
display: block か vertical-align: bottom |
margin: 0 auto で中央に寄らない |
inline・inline-block には効かない。block でも幅の指定が必要 |
display: block + 幅の指定。または親に text-align: center |
hidden 属性を付けたのに表示される |
自分の CSS の display 指定が上書きしている |
[hidden] { display: none !important; } を足す |
display: none からのフェードが動かない |
display は離散値。出発点の状態もない |
allow-discrete と @starting-style をセットで書く |
opacity: 0 で隠したボタンが押せてしまう |
opacity: 0 は見えないだけで操作できる |
visibility: hidden を併用する |
li の行頭記号が消えた |
li の display を list-item 以外に変えた |
li の中の要素を flex にする |
よくある質問
Q. block と inline-block はどう使い分けますか?
A. 前後で改行して1行を占めてほしいなら block、ほかの要素や文字と同じ行に並べたいなら inline-block です。どちらも幅・高さ・上下の margin / padding が効きます(実測ではどちらも 220 × 120 の箱になりました)。違いは「改行が入るか」と「幅を指定しないときに親いっぱいに広がるか(block)、中身の分だけになるか(inline-block)」の2点です。
Q. display: none にした要素は、検索エンジンや読み上げにどう扱われますか?
A. display: none の要素は箱が作られず、MDN でも「アクセシビリティツリーから取り除かれ、読み上げられない」と説明されています。実測でも Playwright のスナップショットに出ませんでした。HTML のソースには残るため、ブラウザの開発者ツールなどでは確認できます。検索エンジンでの扱いはこの記事では検証していません。伝えたい内容は表示した状態で書くのが分かりやすい方針です。
Q. flex と inline-flex の違いは何ですか?
A. 中の並べ方(フレックス)は同じで、その要素自身が外でどう並ぶかが違います。flex は block と同じく前後で改行して幅いっぱいに広がり、inline-flex は inline-block と同じく文中に並んで中身の分の幅になります。2語の書き方では block flex と inline flex です。grid と inline-grid も同じ関係です。
Q. display の切り替えを JavaScript で行うときのコツはありますか?
A. el.style.display = 'block' と直接書くと、もともと flex や grid だった要素のレイアウトが変わってしまいます。クラスの付け外し(classList.toggle('open'))か、hidden 属性の切り替え(el.hidden = true)にすると、表示時の display を CSS 側で一元管理できます。
まとめ
displayは「外側(自分の並び方)」と「内側(子の並べ方)」を決める。inline-blockは「外は inline、内は独立した箱」、flexは「外は block、内はフレックス」。inlineにはwidth・height・上下の margin が効かない。 実測では同じ指定でblockとinline-blockが 220 × 120、inlineは 52 × 39 だった。inline-blockの隙間は、タグの間の改行が空白として表示されたもの(16px の文字で 9.64px)。親をflexにしてgapで間隔を決めると解消できる。display: noneは場所も取らず、visibility: hiddenは場所を残し、opacity: 0は見えないだけでクリックもフォーカスもできる。hidden属性は自分の CSS のdisplay指定で上書きされる。[hidden] { display: none !important; }を足すと安定する。noneからのフェードはallow-discrete(閉じる側)と@starting-style(開く側)をセットで書く。display: contentsは箱だけを消して子を残す。 ボタンなど操作できる要素に使うと、Tab キーのフォーカスが当たらなくなる。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「CSS displayの種類一覧|block・inline・noneの違い」
株式会社RJCでは、CSSのdisplayをはじめとするレイアウトの基礎を仲間と学び合っています。こうした知識を共有しながら、日々技術を磨いています。
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。