@hyacca

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【HTML】<picture>タグを<p>で囲んではいけないのはなぜ?

解決したいこと

テキスト画像を配置する際、
<picture><p>で囲んではいけない理由が分かりません。
※下部に追記事項があります。

❌NG

html
<p>
    <picture>
        <source media="(min-width: 769px)" srcset="/img/img-pc.webp" width="800" height="400">
        <img src="/img/img-sp.webp" width="400" height="200" loading="lazy" alt="画像">
    </picture>
</p>

⭕️OK

html
<div>
    <picture>
        <source media="(min-width: 769px)" srcset="/img/img-pc.webp" width="800" height="400">
        <img src="/img/img-sp.webp" width="400" height="200" loading="lazy" alt="画像">
    </picture>
</div>

納得できない点

  • コンテンツカテゴリ的に、pの下にpictureは置けるはずなのになぜ?
  • sourceが原因なのであれば、divpictureを囲む形もNGになるのでは?
  • pictureはブロック要素と同じ扱いをされる、みたいなことを言われたが、ブロック要素ではないよな?
コンテンツカテゴリ 配置できる場所 配置できる子要素
p フローコンテンツ フローコンテンツを配置可能な場所 フレージングコンテンツ(インライン要素)
div フローコンテンツ フローコンテンツを配置可能な場所 フローコンテンツ(ブロック/インライン要素)
picture フローコンテンツ、フレージングコンテンツ、組み込みコンテンツ 組み込みコンテンツを配置可能な場所 0個以上のsource要素を配置し、最後にimg要素を配置
source なし audiovideopicture なし(空要素)

各要素のコンテンツカテゴリは、上記の通りだと思います。

pはフレージングコンテンツを内包できます。
それなのに、フレージングコンテンツに属しているpictureを配置できない理由が分かりません。
コンテンツカテゴリに属さないsourceが子孫要素にいるのが問題なのでしょうか。

こんな形ほぼ見ることはないと思いますが、

html
<p>
    <picture>
       <img src="/img/img-sp.webp" width="400" height="200" loading="lazy" alt="画像">
    </picture>
</p>

の形ならOKなのでしょうか。

しかし、divもフローコンテンツかインライン要素しか中に入れることができないはずです。
なぜdivで囲む形は許されるのかも、納得できません!

また、pictureがブロック要素と同じような扱いをされるというのは、どういうことなのでしょうか。

chatGPTに聞いても理解することができませんでした。
どなたか解説していただけますと幸いです。

参考にしたサイト

2025/06/09 追記

  • pで囲んではいけないという情報の元出は?

現時点では、私も明確なweb情報は見つけられていません。
業務のFBでもらった意見なのですが、
「ブロックレベル要素を入れることができない」、というところからこの問題が生じました。
https://www.w3.org/TR/html401/struct/text.html#h-9.3.1

pictureはブロックレベルの要素じゃなくない?と思い、調べてみたのですが記事は見つからず…。
chatGPTに聞いて出てきた答えが、以下になります。

これは、HTMLパーサの「p 要素の自動終了ルール(implicit end tag)」によるものです。

✅ ポイント
picture は確かに phrasing content に該当します。
しかし、<picture> 内に含まれる <source> 要素は phrasing content に該当しません。
<p> の中に phrasing content 以外が含まれた時点で、ブラウザは <p> を自動的に閉じる仕様になっています。

FBを受けた私も、FBを出した方も、???となっているので、
納得できる解を見つけるために質問してみた、という流れになります。

そもそも、FB時点の情報がおかしい、という可能性もあるのでしょうか…

✏️2025/07/15 追記

気になっている点を整理しました!

  • 画像化した文章を設置
  • 画面幅によって出しわけをしたい

上記を反映するために、

html
<p>
  <picture>
    <source media="(max-width: 768px)" srcset="small.jpg">
    <source media="(max-width: 1024px)" srcset="medium.jpg">
    <img src="large.jpg" alt="テキストテキストテキスト">
  </picture>
</p>

というコードを書きたかったのですが、これはHTML構文的にNGとchatGPTに言われました。

<p> は フレージングコンテンツのみを子孫に持てます。
<picture> はフレージングコンテンツに属するので 一見OKに見えます。
ですが、中にある <source> は どのコンテンツカテゴリにも属していません(= フレージングコンテンツではない)。
そのため、<p> の中に <source> が間接的に含まれることで、構文違反になります。
〜〜〜
この場合、<source><p> の子孫に入ってしまうことで、HTMLパーサーが <p> を強制的に閉じてしまい、意図した構造にならない。

ここで言われている、

  • pの中に入っているものが全てフレージングコンテンツでないといけない。
  • HTMLパーサーが強制的に閉じられる。

という部分の根拠を自力で見つけることができず、困っています。
何か有力な情報がありましたら教えていただけますと幸いです。

1 likes

3Answer

意味論の話ではないかと思います。

imgタグはインライン要素のため、他のブロック要素と並べると想定通りの配置が
難しいことがあります。 そこでdivで囲むことで、親のブロック要素に対する位置や
サイズを調整しやすくなります。

divタグもpタグもブロック要素ですが、段落を表すpタグをdivタグの代わりにして、
親のブロック要素に対する位置やサイズの調整を行うのは意味論的に
不適切である、ということではないでしょうか?

Google Gemini で質問すると、以下の返答でした。

pictureタグをpタグで囲むことは、HTMLの仕様上、意味的に正しくありません。
imgタグはインライン要素であり、pタグはブロック要素です。そのため、
imgタグをpタグで囲むことは、HTMLの構造として誤りとなります。
pictureタグは、レスポンシブな画像表示のために使用されます。pタグは、文章を
1つの段落として区切るために使用されます。これらの要素は異なる目的で使用される
ため、pictureタグをpタグで囲む必要はありません。
画像を表示する際には、pictureタグとimgタグを適切に使用し、pタグは文章の
構成要素として使用します。

例えば、以下のようになります。

<p>
  <picture>
    <source media="(max-width: 768px)" srcset="small.jpg">
    <source media="(max-width: 1024px)" srcset="medium.jpg">
    <img src="large.jpg" alt="説明">
  </picture>
  この画像は、デバイスの画面サイズに応じて最適な画像を表示します。
</p>

この例では、pictureタグは画像と、異なる画面サイズに対応する画像ソースを
定義します。pタグは、この画像と関連するテキストを1つの段落としてまとめる
ために使用します。

pictureタグをpタグで囲む必要はないため、画像の表示と文章の構成を適切に
区別するようにしてください。

1Like

Comments

  1. @hyacca

    Questioner

    ご回答ありがとうございます!
    気づくのが遅くなり、大変申し訳ございません。

    本文に追記しましたが、気になることを整理しました!
    Google Geminiが提示してくれたコードも、意味的には合っているとは思うのですが、やはりchatGPTが示してきたNG点にぶつかってしまいます。

    一旦、pictureで画像を出し分ける際はdivで囲むようにして対応しているのですが、
    NG理由の根拠が分からず困っている、といった状態です…。

単純に、GeminiもchatGPTもハルシネーションを起こしているだけだと思います。

当方でGeminiに「このHTML5の部分コードは文法的に問題ありますか?」と質問したところ、以下のような回答でした。


はい、そのHTML5のコードは文法的に問題ありません

<p> タグ(段落)の中に <picture> タグを配置することは許可されています。また、<picture> タグの内部構造も正しく、画面幅に応じて表示する画像ソースを切り替えるための <source> タグと、どの条件にも一致しない場合や <picture> タグに未対応のブラウザで表示されるための <img> タグが適切に記述されています。


さらに、「HTML5 として、セマンティクスに問題はありますか?」と質問したところ、以下の回答でした。


結論から言うと、多くの場合でセマンティクス(意味論)的な問題はありませんが、文脈によってはより適切なマークアップが存在します

どういうことか、以下で詳しく解説します。


🤔 <p> タグのセマンティクス

<p> タグは「段落 (Paragraph)」を表します。これは本来、文章のかたまりを意味します。

HTML5の仕様上、<p> タグの中には<img>(やそれを内包する<picture>)のような「フレージング・コンテンツ(Phrasing Content)」を含むことができます。フレージング・コンテンツとは、文章を構成するテキストレベルの要素のことです。

したがって、画像が文章の流れの一部として、段落の中に挿入される場合は <p><picture>...</picture></p> という構造はセマンティックに正しいと言えます。

👍 問題ないケースの例

画像が文章の途中にあり、その画像自体が文の一部として機能している場合です。

<p>私たちの新しいロゴをご覧ください。</p>
<p>
  <picture>
    <source media="(max-width: 768px)" srcset="logo-small.jpg">
    <img src="logo-large.jpg" alt="新しい会社のロゴ">
  </picture>
</p>
<p>このデザインには、未来への飛躍という意味が込められています。</p>

この例では、画像が前後の文章をつなぐ役割を果たしており、一つの独立した段落として扱っても不自然ではありません。


✨ より適切な <figure> タグ

一方で、画像が本文から**独立した「図」や「イラスト」**として扱われ、本文がその図を参照するような場合は、<figure> タグを使うのがセマンティクス上、より適切です。

<figure> は、図版、イラスト、写真、コードリストなど、自己完結したコンテンツを表すためのタグです。多くの場合、キャプション(説明文)を付けるための <figcaption> と一緒に使われます。

より適切なケースの例

本文で「図1」のように言及し、その図を提示する場合です。

<p>下の図1は、近年のウェブトラフィックの推移を示しています。モバイルからのアクセスが大幅に増加していることがわかります。</p>

<figure>
  <picture>
    <source media="(max-width: 768px)" srcset="graph-small.png">
    <img src="graph-large.png" alt="2020年から2024年にかけてのウェブトラフィック推移のグラフ。PCが横ばいなのに対し、モバイルが右肩上がりに急増している。">
  </picture>
  <figcaption>図1: 近年のウェブトラフィック推移</figcaption>
</figure>

この構造には、以下のようなセマンティックな利点があります。

  • 明確な役割: この <picture> が本文から独立した「図」であることを検索エンジンや支援技術(スクリーンリーダーなど)に明確に伝えられます。
  • キャプション: alt属性が「画像の内容」を説明するのに対し、<figcaption>は「文脈における図の役割やタイトル」を示すことができ、より豊かな情報を提供できます。
  • 自己完結: <figure>で囲まれたコンテンツは、文書の別の場所(例えば巻末の図表一覧など)に移動しても意味が通じる、というニュアンスを持ちます。

まとめ

マークアップ セマンティックな意味合い 使い分け
<p><picture>...</picture></p> 画像が文章や段落の一部として扱われる。 ロゴの紹介など、画像が文章の流れに直接組み込まれている場合。
<figure><picture>...</picture></figure> 画像が本文から独立した図や資料として扱われる。 グラフや写真など、本文がその「図」を参照している場合。

ご提示のコードは文法的には全く問題ありません。しかし、その画像が文書内でどのような役割を持つのかを考え、<figure> の方がより意味的にふさわしい場合は、そちらを使うことをお勧めします。

1Like

Comments

  1. @hyacca

    Questioner

    とても詳しくご説明いただきありがとうございます!

    ハルシネーションを起こしているだけ

    どこを探しても根拠が見つからなかったので困っていたのですが、そういうことだったんですね…!

    HTML Living Standardで定義されているコンテンツモデル的にも使用上問題はなさそうなので、意味にだけ注意して使っていこうと思います!

    まとめていただいた表も大変参考になりました!
    ここ最近ずっと悩んでいたので、解決できて本当によかったです。
    本当にありがとうございました!

  2. 表を作ってくれたのはGeminiですね👍

<picture>を<p>で囲んではいけないというのは、どこから来たものですか? Web上にある情報でしたら、引用する形で提示していただけますか?

0Like

Comments

  1. @hyacca

    Questioner

    コメントありがとうございます!
    本文中に追記いたしました。
    ご確認のほどよろしくお願いいたします。

  2.  追記拝見いたしました。提示されている仕様書はHTML4.01だと思うのですが、HTML4のお話をされているのですか?

     そうであるならば、コンテンツカテゴリはHTML5の仕様ですので、HTML4に適用するのが間違っていますし、<picture>を使うことも間違っています。

     もし、HTML5のお話であれば、HTML4のブロック要素は廃止されましたので、ご提示のご意見が間違っているかと思います。(ブロックレベル要素という言葉は残っていますが、HTML4のように包含関係を規定するものではないです)

  3. @hyacca

    Questioner

    バージョンの違い!そこまで気が回りませんでした!
    私はHTML5の仕様を元に作業を進めているため、一度FB担当者にも確認してみます。
    どう調べてもおかしいな、と思うことばかりだったので助かりました!
    突破口を示してくださり、ありがとうございます!

  4. @hyacca

    Questioner

    ありがとうございます!
    こちら確認して、また進捗がありましたら記事更新にて共有させていただきます!

Your answer might help someone💌