@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にドロップされます。後続のテキストは要素の直後に続き、通常どおり折り返します。これにより、いくつかの奇妙な状況が発生する可能性があります。blockinline-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 のこの更新を参照してください。