寻找HTML块中最宽单词的宽度。

7

目标是找到这里最宽的单词的宽度。

文本是由具有不同字体的单词组成的句子,如图所示。

font ranges HTML看起来像这样:

<span style="font:bold 14px Verdana;">LONGESTW</span>
<span style="font:bold 42px Verdana;">ORD</span>
<span style="font:bold 14px Verdana;">&nbsp;</span>
<span style="font:bold 24px Verdana;">ORD</span>
<span style="font:bold 14px Verdana;">&nbsp;</span>
<span style="font:bold 24px Verdana;">regular</span>
<span style="font:bold 14px Verdana;">&nbsp;</span>
<span style="font:bold 32px Verdana;">w</span>
<span style="font:bold 96px Verdana;">id</span>
<span style="font:bold 64px Verdana;">est</span> 

所以,这里的第三个单词是最宽的。有什么想法吗?一切都是 HTML,我们可以使用任何东西( jQuery,ES5 技术等)。


1
喜欢这个问题!好的谜题和添加的形象加1。 - Yarneo
3个回答

1

也许需要先分割空格以确定单词。 - Eric Yin
是的,我们可以假设“空格”是单词之间唯一的分隔符。例如,“12,000,22”是一个单词。 - sbr
我已经更新了我的代码,现在应该更加灵活。http://jsfiddle.net/WtcEQ/13/ - Igor Shastin
把下面的代码放在jsFiddle上,然后运行它。 - Igor Shastin
1
@sbr 我在Chrome 21中尝试了一下。我认为问题不在JSFiddle上,而是在white-space参数上。如果页面太窄,“regu-ular”会在中间断开。因此,在我的fiddle中,我使用white-space: nowrap来避免这种情况。 - Igor Shastin
显示剩余2条评论

0
尝试以下解决方案,基本上是迭代所有的span并找到最长的单词。
$(function () {
    var max = 0, sum = 0, lword = '', mword = '';

    var $span = $('span');
    $.each($span, function (idx, el) {

        var elTxt = $(el).text().trim();

        if (elTxt) {
            sum += $(this).width();
            lword += $(this).text();
        }

       if (!elTxt || $span.length == (idx+1) ) {
            if (sum > max) {
                max = sum;
                mword  = lword;
            }
            sum = 0;
            lword = '';
        }
    });

    alert(mword + ' ' + max);
});

演示: http://jsfiddle.net/WtcEQ/32/


0
你可以使用max-content来测量文本的像素宽度。

function measureLongestWordPxWidth(template) {
  const measurer = template.cloneNode(true);
  measurer.style.setProperty("position", "position", "important");
  measurer.style.setProperty("visibility", "hidden", "important");
  measurer.style.setProperty("width", "max-content", "important");

  document.body.appendChild(measurer);
  const { width } = measurer.getBoundingClientRect();
  document.body.removeChild(measurer);
  return width;
}

const spans = [...document.querySelectorAll('span')];
const widths = spans.map(measureTextPxWidth);
const maxWidth = Math.max(...widths);
const maxWidthIndex = widths.indexOf(maxWidth)
const maxWidthText = spans[maxWidthIndex].innerText
  
document.querySelector('.output').innerText = 
  `"${maxWidthText}": ${maxWidth}px`
<span style="font:bold 14px Verdana;">LONGESTW</span>
<span style="font:bold 42px Verdana;">ORD</span>
<span style="font:bold 14px Verdana;">&nbsp;</span>
<span style="font:bold 24px Verdana;">ORD</span>
<span style="font:bold 14px Verdana;">&nbsp;</span>
<span style="font:bold 24px Verdana;">regular</span>
<span style="font:bold 14px Verdana;">&nbsp;</span>
<span style="font:bold 32px Verdana;">w</span>
<span style="font:bold 96px Verdana;">id</span>
<span style="font:bold 64px Verdana;">est</span> 

<div class="output"></div>


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