在Javascript/jQuery中确定字符串的像素长度?

GSt*_*Sto 67 javascript jquery

有没有办法在jQuery/JavaScript中确定字符串的像素长度?

Nat*_*ium 57

span中包装文本并使用jquery width()

  • 您应该提供一些示例代码.我很难弄清楚你的意思是"在一个跨度中包装文字".跨度是否应该在原始html中?我可以创建一个未见的虚拟跨度吗?怎么在运行时?我试过:`$('<span> </ span>').html('hi').width()`但输出0 (9认同)
  • 这仅返回包含元素的宽度,但不返回文本的宽度. (5认同)
  • 使用`<span>`包装器效果最好,因为`<div>`自动设置为100%浏览器宽度. (5认同)
  • 不要忘记:div/span的放置和样式有所不同,因为包装可以发挥作用. (3认同)
  • 我会在 span 元素中添加 white-space: nowrap ,否则如果由于容器太小而导致文本被换行,则会得到错误的结果 (2认同)

Éle*_*tra 46

用于HTML Canvases的上下文具有用于检查字体大小的内置方法.此方法返回一个TextMetrics对象,该对象具有包含文本宽度的width属性.

function getWidthOfText(txt, fontname, fontsize){
    if(getWidthOfText.c === undefined){
        getWidthOfText.c=document.createElement('canvas');
        getWidthOfText.ctx=getWidthOfText.c.getContext('2d');
    }
    getWidthOfText.ctx.font = fontsize + ' ' + fontname;
    return getWidthOfText.ctx.measureText(txt).width;
}
Run Code Online (Sandbox Code Playgroud)

或者,正如其他一些用户所建议的那样,您可以将其包装在一个span元素中:

function getWidthOfText(txt, fontname, fontsize){
    if(getWidthOfText.e === undefined){
        getWidthOfText.e = document.createElement('span');
        getWidthOfText.e.style.display = "none";
        document.body.appendChild(getWidthOfText.e);
    }
    getWidthOfText.e.style.fontSize = fontsize;
    getWidthOfText.e.style.fontFamily = fontname;
    getWidthOfText.e.innerText = txt;
    return getWidthOfText.e.offsetWidth;
}
Run Code Online (Sandbox Code Playgroud)

测试:

  • 第一个解决方案(画布) - 测试,工作(以像素为单位返回)
  • 第二个解决方案(DOM) - 测试,工作(以像素为单位返回)

请注意,由于实现差异,两者可能会返回略有不同的值.

性能测试:平均超过100次迭代的26788次调用.测试于2014年末mac mini,1.4 GHz i5

Safari,版本10.1.1(12603.2.4):

  • 第一种解决方案:26788次调用为33.92毫秒
  • 第二种解决方案:26788次调用为67.94毫秒

谷歌浏览器,版本60.0.3112.90:

  • 第一种解决方案:26788次调用为99.1963毫秒
  • 第二种解决方案:26788次调用307.4605毫秒

  • 帆布创意很棒(特别是如果您怀有这样的想法)!它的纯js方法,比span更好,并且不需要jquery (2认同)

Top*_*gio 11

我不相信你只能做一个字符串,但如果你把字符串放在一个<span>正确的属性(大小,字体重量等); 然后你应该能够使用jQuery来获得跨度的宽度.

<span id='string_span' style='font-weight: bold; font-size: 12'>Here is my string</span>
<script>
  $('#string_span').width();
</script>
Run Code Online (Sandbox Code Playgroud)


Gri*_*inn 5

将它放在一个绝对定位的div中,然后使用clientWidth来获取标签的显示宽度.您甚至可以将可见性设置为"隐藏"以隐藏div:

<div id="text" style="position:absolute;visibility:hidden" >This is some text</div>
<input type="button" onclick="getWidth()" value="Go" />
<script type="text/javascript" >
    function getWidth() {
        var width = document.getElementById("text").clientWidth;
        alert(" Width :"+  width);
    }
</script>
Run Code Online (Sandbox Code Playgroud)


RJ *_*lly 5

基于vSync的答案,纯javascript方法可快速处理大量对象。这是小提琴:https : //jsfiddle.net/xeyq2d5r/8/

[1]: https://jsfiddle.net/xeyq2d5r/8/ "JSFiddle"
Run Code Online (Sandbox Code Playgroud)

我收到了针对建议的第三种方法的良好测试,该方法使用本机javascript vs HTML Canvas

谷歌在选项1和3、2被炸方面相当有竞争力。

FireFox 48:
方法1花费了938.895毫秒。
方法2花费了1536.355毫秒。
方法3花费了135.91499999999996毫秒。

Edge 11方法1花费了4895.262839793865毫秒。
方法2花费了6746.622271896686毫秒。
方法3花费了1020.0315412885484毫秒。

Google Chrome:52
方法1花费了336.4399999999998毫秒。
方法2花费了2271.71毫秒。
方法3花费了333.30499999999984毫秒。

  • 但是它确实提供了对所提供答案的进一步测试,以清楚地显示它们的表现。Ive总是会从其他帖子中的评论和其他信息中受益。那就是为什么我添加它,觉得我所做的工作应该使看到这篇文章的其他人受益。不喜欢它在6年内没有56812的视图。 (2认同)
  • 这很有帮助。检查性能。当必须从多个选项中进行选择时,尤其是跨浏览器时,实现的实现非常重要。 (2认同)