@Unmocked が提供した変更が実際に機能する理由を指摘したかっただけで、それはdisplay: inline と display: inline-block の違いに関係しています。
block
説明のために、ディスプレイとディスプレイの違いの背景を少し説明しinline
ます。
ブロック表示
block
要素は、一般に、レイアウトを引き起こす要素です。それらは独自の境界ボックスを受け取り、ブラウザーのレンダリング領域内で使用可能なスペースに収まるように、他の要素をある程度押し込むことができます。block
アイテムの例: h1
、p
、ul
、およびtable
。これらの各項目は、デフォルトで新しい行を開始し、閉じたときに独自の行も終了することに注意してください。つまり、独自の段落レベルのセクションを作成することで、テキスト ブロックに収まります。
インライン表示
inline
一般に、要素はテキストとインラインで表示されます。つまり、テキスト行内に表示されるように設計されています。例としてi
、 、b
、またはがありspan
ます。デフォルトでは、これらの各項目は、前後に改行を強制することなく、周囲のテキストの流れを継続することに注意してください。
中途半端なケースに突入…
インラインブロック表示
inline-block
上記2つのハイブリッドです。本質的に、inline-block
要素はその前のテキストが終了するところから始まり、ドキュメントの流れに収まるように試みますinline
。ただし、必要なポイントに到達すると、要素であるかのように新しい行wrap
にドロップされます。後続のテキストは要素の直後に続き、通常どおり折り返します。これにより、いくつかの奇妙な状況が発生する可能性があります。block
inline-block
これが私の言いたいことを示すための例です。実際の動作を確認するには、この cssdesk snippetをチェックしてください。

あなたの例では、:after
疑似要素を次のように設定しdisplay: inline-block
ていました。つまり、ラッピングディスプレイの右端の境界を超えて拡張された場合、例の水色のテキストのように機能し、ラップされました。ブロック。代わりに:after
要素をに変更するdisplay: inline
と、他のテキストと同じように動作し、その前の文字との間に空白がなければ、単語の折り返しが希望どおりに動作します。
これが役立つことを願っています!
注:元のフィドルと更新されたフィドルの間で変更されたもう1つのことはwhite-space
、テキストの周りの削除です。
最初のフィドルでは、HTML は次のようになります。
<div class="container2">
foo bar
</div>
ブラウザーはテキストの前後にスペースを表示しませんが、スペースを含み:after
ます。要素がレンダリングされると、次のようになります。
<div class="container2"> foo bar :after</div>
ブラウザーは複数のスペースを 1 つのスペースに圧縮しますが、それでも単語"bar"
と:after
要素の間にスペースを入れます。他の単語間のスペースと同様に、これにより、特定の幅で"bar"
前後に折り返しが発生します。:after
2 番目のフィドルでは、以下を使用しています。
<div class="container-wide">foo bar</div>
<div class="container-narrow">foo bar</div>
この場合、文字列の末尾にスペースがないため、ブラウザはコンテンツ文字列の直後に表示される要素"foo bar"
をレンダリングします。:after
次のようなことが起こっているかのようです。
<div class="container-narrow">foo bar:after</div>
inline
レンダリングされたテキストに区切りがないということは、区切りがないことを意味します。
これを示す例については、jsFiddle のこの更新を参照してください。