@ashis-kumarの回答のようにテキストの真ん中に画像を配置しない限り、これはCSSだけでは不可能です。私はいくつかのJavaScriptを書きました(サードパーティのライブラリは必要ありませんが、jQueryで動作するように簡単に書き直すことができます):
var util = {
iterations: 0,
fontSize: 20,
wrapWords: function(el) {
var words = el.textContent.split(' ');
for ( var i = 0, l = words.length; i < l; ++i ) {
words[i] = '<span class="word">' + words[i] + ' </span>';
}
el.innerHTML = words.join('');
return document.querySelectorAll('span.word');
},
checkOffsets: function(words, img, newContainer, origContainer) {
var top = img.offsetTop;
for ( var i = 0, l = words.length; i < l; ++i ) {
origContainer.appendChild(words[i]);
}
origContainer.appendChild(newContainer);
for ( i = 0, l = words.length; i < l; ++i ) {
var word = words[i];
if ( word.offsetTop + word.offsetHeight >= top ) {
newContainer.appendChild(word);
}
}
if ( Math.abs(img.offsetTop - newContainer.offsetTop) > this.fontSize || img.offsetTop < newContainer.offsetTop ) {
this.iterations++;
if ( this.iterations < 10 ) {
this.checkOffsets(words, img, newContainer, origContainer);
}
}
}
};
var img = document.querySelector('img');
var p = document.querySelector('p');
var words = util.wrapWords(p);
var pushContainer = document.createElement('div');
pushContainer.classList.add('push');
p.appendChild(pushContainer);
util.checkOffsets(words, img, pushContainer, p);
簡単に書きましたが、基本的に行うことは、段落内のすべての単語を a<span>
で囲み、オフセットを見つけやすくすることです。次に、画像の隣にあるすべての単語の別の要素を作成します。次に、適切な数の単語が見つかるまでそれらを調べます (スペースが多すぎる場合や十分でない場合は再帰的です)。おそらくいくつかの最適化を行うことができますが、それはかなり迅速です。