在左对齐文本中,是否有可能测量最大的单词换行宽度?

3

在左对齐文本中,是否可以测量实际的换行宽度?

例如,下面的文本是左对齐的。根据元素宽度,它可能在单词“their”或“the”处换行。

由于当单词不适合行时会发生换行,因此标记为红色的宽度与元素宽度不一致。

enter image description here

是否有可能测量这个宽度?

3个回答

1
这可能不完全符合您的要求,因为它会修改您的标记,但我使用的技巧是将您的文本包装在标签中。然后,我查看每个标签,并确定最右侧的那个:

演示

代码:

标记:

<div class="test">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis ipsum. Praesent mauris. Fusce nec tellus sed augue semper porta. Mauris massa. Vestibulum lacinia arcu eget nulla. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. </div>

<div class="results">
</div>

JavaScript与jQuery:

var text  = $('div.test').text();
var words = text.split(' ');
var html  = '';

$.each(words, function(i, word) {
    html += '<span>' + word + '</span> ';
});

$('div.test').html(html);

var farthestRight = 0;
$('div.test span').each(function(i,e) {
    var left = $(e).position().left;
    var width = $(e).width();

    if (left + width > farthestRight) {
        farthestRight = left + width;
    }

    // Uncomment to see debug data
    // $('.results').append('<div>' + left + ', ' + width + ', ' + (left + width) + '</div>');
});

$('.results').append('<div>' + farthestRight + '</div>');

1
当您从文本节点创建Range并使用getBoundingClientRect()读取其尺寸时,您可以查询文本宽度(以及更多内容)。
function getTextRect( containerNode ) {
  // For simplicity, we assume plain text here
  // (no nested markup)
  var textRect,
      textNode = containerNode.childNodes[0],
      textRange = document.createRange();

  textRange.selectNode( textNode );
  textRect = textRange.getBoundingClientRect();

  // Clean up
  textRange.detach();

  return textRect;
}

// You can read the width with getTextRect( someNode ).width

你可以在这个JSBin演示中看到它的实际应用。
该方法在IE9+(不适用于IE8)中得到很好的支持;Chrome,FF,Opera已经长期支持它。MDN没有关于Safari的兼容性信息,但我在iOS8,iOS9和桌面上的Safari 9中简要检查了演示 - 工作得很好。

0
您可以暂时创建一个 span,逐个单词填充文本,并每次检查宽度是否实际增加。一旦不再增加,就必须发生换行,因此只需将先前的宽度与完整宽度进行比较即可。
完成后,重新插入原始数据。
<div>This is a long text that wraps somewhere, but we don't know where exactly...
</div>
<h2 id="result"></h2>

var text = $('div').text();
$('div').empty().append($('<span>'));
var words = text.split(' ');
var lastWidth = 0;
for (var word in words) {
    if (words[word] == '') continue;
    var newWidth = $('div span').append(words[word] + ' ').width();
    if (!(newWidth > lastWidth)) {
        $('#result').text($('div span').text(text).width()).append('px');
        break;
    }
    lastWidth = newWidth;
}
$('div').text(text);

JSFiddle

{{链接1:JSFiddle}}


我将 $('#result').text($('div').text(text).width()-lastWidth).append('px'); 更改为 $('#result').text($('div span').text(text).width()).append('px');,因为您之前是检查包含元素的宽度,然后从中减去上次测量的 span 宽度,这并没有给出正确的换行长度。 - Reed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接