收缩将div包装到某些文本非常简单。但是,如果由于最大宽度(例如)而使文本换行到第二行(或更多行),则DIV的大小不会缩小为新换行的文本。它仍会扩展到断点(在这种情况下为最大宽度值),从而在DIV的右侧产生大量的边距。当要使该DIV居中以使包装的文本居中时,这是有问题的。不会因为DIV不会缩小到换行的多行文本。一种解决方案是使用对齐的文本,但这并不总是可行的,结果可能令人生畏,单词之间的间隙也很大。
我知道没有解决方案可以将DIV缩小为纯CSS中的包装文本。所以我的问题是,如何用Javascript实现这一目标?
此jsfiddle对此进行了说明。由于最大宽度,两个单词几乎没有换行,但是DIV并没有缩小到新换行的文本,从而留下了令人讨厌的右手边距。我想消除这种情况,并使用Javascript将DIV调整为包装文本的大小(因为我认为纯CSS中不存在解决方案)。
.shrunken {text-align: left; display: inline-block; font-size: 24px; background-color: #ddd; max-width: 130px;} <div class="shrunken">Shrink Shrink</div>
这不是最漂亮的解决方案,但应该可以解决问题。逻辑是计算每个单词的长度,并用它来计算出在被迫换行之前最长的一行将适合的行;然后将该宽度应用于div。 范例html …
<div class="wrapper"> <div class="shrunken">testing testing</div> </div> <div class="wrapper"> <div class="shrunken fixed">testing testing</div> </div> <div class="wrapper"> <div class="shrunken">testing</div> </div> <div class="wrapper"> <div class="shrunken fixed">testing</div> </div> <div class="wrapper"> <div class="shrunken" >testing 123 testing </div> </div> <div class="wrapper"> <div class="shrunken fixed" >testing 123 testing </div> </div>
和Javacript(依赖jQuery)
$.fn.fixWidth = function () { $(this).each(function () { var el = $(this); // This function gets the length of some text // by adding a span to the container then getting it's length. var getLength = function (txt) { var span = new $("<span />"); if (txt == ' ') span.html(' '); else span.text(txt); el.append(span); var len = span.width(); span.remove(); return len; }; var words = el.text().split(' '); var lengthOfSpace = getLength(' '); var lengthOfLine = 0; var maxElementWidth = el.width(); var maxLineLengthSoFar = 0; for (var i = 0; i < words.length; i++) { // Duplicate spaces will create empty entries. if (words[i] == '') continue; // Get the length of the current word var curWord = getLength(words[i]); // Determine if adding this word to the current line will make it break if ((lengthOfLine + (i == 0 ? 0 : lengthOfSpace) + curWord) > maxElementWidth) { // If it will, see if the line we've built is the longest so far if (lengthOfLine > maxLineLengthSoFar) { maxLineLengthSoFar = lengthOfLine; lengthOfLine = 0; } } else // No break yet, keep building the line lengthOfLine += (i == 0 ? 0 : lengthOfSpace) + curWord; } // If there are no line breaks maxLineLengthSoFar will be 0 still. // In this case we don't actually need to set the width as the container // will already be as small as possible. if (maxLineLengthSoFar != 0) el.css({ width: maxLineLengthSoFar + "px" }); }); }; $(function () { $(".fixed").fixWidth(); });