@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時点の情報がおかしい、という可能性もあるのでしょうか…

0 likes

2Answer

<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

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

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

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タグで囲む必要はないため、画像の表示と文章の構成を適切に
区別するようにしてください。

0Like

Your answer might help someone💌