小编典典

将DIV缩小到包裹成最大宽度的文本?

css

收缩将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>

阅读 265

收藏
2020-05-16

共1个答案

小编典典

这不是最漂亮的解决方案,但应该可以解决问题。逻辑是计算每个单词的长度,并用它来计算出在被迫换行之前最长的一行将适合的行;然后将该宽度应用于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('&nbsp;');
            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();
});
2020-05-16