34

display:blockCSSを持つ要素が CSS を持つ要素の DOM 子である場合display:inline(ブロック要素がインライン要素の子になるように)に何が起こるかを理解したいと思います。

このシナリオは、CSS 2.1 仕様の匿名ブロック ボックスセクションで説明されています。この例には、次の規則が含まれています ...

body { display: inline }
p    { display: block }

...そして付随するテキストは...

BODY 要素には、匿名テキストのチャンク (C1) が含まれ、その後にブロック レベル要素が続き、その後に匿名テキストの別のチャンク (C2) が続きます。結果として得られるボックスは、BODY を囲む匿名ブロック ボックスになり、C1 を囲む匿名ブロック ボックス、P ブロック ボックス、および C2 を囲む別の匿名ブロック ボックスが含まれます。

display:inline親要素があり、この親に である子がある場合、display:blockその子の存在により、親はほぼのように動作し、 (親には匿名のみが含まれているという点で)display:blockとして定義されているという事実は無視されます。display:inlineおよび非匿名ブロックの子、つまり、インラインの子が含まれていない)?

私の質問は、このシナリオ (子がいる場合)では、代わりにdisplay:block親が定義されていることの違いは何ですか?display:inlinedisplay:block


編集: さまざまなブラウザー実装が実際にどのように動作するかどうかよりも、CSS 2.1 標準を理解することに関心があります。


2回目の編集:

仕様上、1点だけ違いがあります。次のドキュメントでは、2 番目の「ブロック」段落の境界線が段落全体とページの幅全体を囲んでいます。一方、最初の 'インライン段落の境界線は、段落内の各行 (複数の行がある場合でも) の周りにあり、各行の正確な幅を超えません (各行はページ幅よりも短くなります)。

<html>
<head>
<style type="text/css">
p.one 
{
border-style:solid;
border-width:1px;
display: inline;
}
p.two 
{
border-style:solid;
border-width:1px;
}
</style>
</head>
<body>
<p class="one">Some text. <b>Note:</b> The "border-width"
property does not work if it is used alone. Use the
"border-style" property to set the borders first.</p>
<p class="two">Some text.</p>
</body>
</html>

次のスタイルルールを追加すると...

b
{
display: block;
}

... 次に、最初のインライン段落の「注:」がブロックになり、段落が分割されます (仕様によると、段落の最初と最後の部分は無名ブロックになります)。ただし、段落の最初と最後の部分の境界線は依然として「インライン」スタイルの境界線です。そのため、最初p.oneに宣言された場合と同じではありませんdisplay:block

仕様からの引用があります。

匿名ブロック ボックスを生成する要素に設定されたプロパティは、その要素のボックスとコンテンツに引き続き適用されます。たとえば、上記の例で BODY 要素に境界線が設定されている場合、境界線は C1 (行末で開く) と C2 (行頭で開く) の周りに描画されます。

「border-style」プロパティは、違いが見える唯一のタイプのプロパティですか?

4

4 に答える 4

32

仕様を読んだとき、あなたの質問は実際には非常によく答えられていることがわかりました:

インラインボックスにブロックボックスが含まれている場合、インラインボックスは[...] [ブロックの周りで壊れています]。ブレーク前とブレーク後の [インライン] ボックスは無名ボックスで囲まれ、ブロック ボックスはそれらの無名ボックスの兄弟になります。

<BODY style="display: inline; ">
This is anonymous text before the P.
<P>This is the content of P.</P>
This is anonymous text after the P.
</BODY>

結果として得られるボックスは、BODY を囲む匿名ブロック ボックスになり、C1 を囲む匿名ブロック ボックス、P ブロック ボックス、および C2 を囲む別の匿名ブロック ボックスが含まれます。

または、視覚的に:

+- anonymous block box around body ---+
| +- anonymous block box around C1 -+ |
| |                                 + |
| +---------------------------------+ |
|                                     |
| +- P block box -------------------+ |
| |                                 + |
| +---------------------------------+ |
|                                     |
| +- anonymous block box around C2 -+ |
| |                                 + |
| +---------------------------------+ |
+-------------------------------------+

今あなたの質問に:これはとは違うの<BODY style="display: block; ">ですか?

はい、そうです。まだ 4 つのボックス ( body の周りの無名ブロック ボックスBODY ブロック ボックスになっている) ですが、仕様は違いを示しています。

匿名ブロック ボックスを生成する要素に設定されたプロパティは、[生成された匿名ブロック] ボックスとその要素のコンテンツに引き続き適用されます。たとえば、上記の例で BODY 要素に境界線が設定されている場合、境界線は C1 (行末で開く) と C2 (行頭で開く) の周りに描画されます。

+--------------------------------------
| This is anonymous text before the P. 
+--------------------------------------
  This is the content of P.
 --------------------------------------+
  This is anonymous text after the P.  |
 --------------------------------------+

これは とは異なり<BODY style="display: block; ">ます:

+--------------------------------------+
| This is anonymous text before the P. |
|                                      |
| This is the content of P.            |
|                                      |
| This is anonymous text after the P.  |
+--------------------------------------+
于 2009-09-12T17:14:15.410 に答える
8

インライン コンテナーにブロック コンテナーを含めることはできません。このようなことが発生した場合の通常の結果は、インライン コンテナーがその内容を収容するためにブロックに変換されることです。ブロックのように見える何かを含むためにインラインで表示されるコンテナが必要な場合は、次を使用します。

display: inline-block;

inline-block プロパティは、コンテナをインライン形式で配置する表示モードであり、インライン コンテナのプロパティと定義がすぐにコンテナ自体にのみ適用され、その子をそのような制約に制限することはありません。その結果、インライン ブロックの親のブロック コンテナーの子は、親が定義を定義している場合、またはより大きな子に対応するために親のディメンションが拡張される可能性がある場合、親のディメンションに制限されます。inline-block に設定されたコンテナーは、インライン コンテナーに関連付けられた既定の配置を失うことなく、幅や高さなど、ブロックにのみ提供されるプロパティを受け取ることができます。

このプロパティは FF2 ではサポートされていないため、Ice Weasel ブラウザーではサポートされていません。IE6 を含む他のほぼすべてのブラウザーがこのプロパティをサポートしているため、すぐに使用できる Linux ディストリビューションに限定されている少数のユーザーを除いて、ほとんど誰も FF2 や Ice Weasel を使用していないため、IE6 を使用しても問題ありません。

于 2009-09-10T15:46:15.577 に答える
1

css正確な定義またはブラウザに依存する場合があります。

最も一般的なのは、次の 2 つの動作です。

  • display:block要素内のdisplay:inline要素は、 withのdisplay:inlineように動作します。display:blockwidth:100%

  • または要素display:inlineのみを含む要素は、スペースをとらず、その中に要素がないかのようになります。要素は別の要素の内部にあるかのように動作し、 によってはファンキーな動作をすることがあります。display:block float:leftfloat:rightdisplay:blockdisplay:blockposition

positionとmake の両方でfloat、子要素が奇妙な動作をすることがありますが、それらを回避すると、一般的には のように動作しinlineます。

于 2009-09-03T04:01:17.077 に答える