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

IT技术 javascript jquery
2021-01-20 15:11:54

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

6个回答

将文本包裹在一个跨度中并使用jquery width()

使用<span>包装器效果最好,因为 a<div>会自动设置为 100% 浏览器宽度。
2021-03-14 15:11:54
您可能应该提供一些示例代码。我很难弄清楚“在跨度中换行”的确切含义。跨度应该在原始html中吗?我可以创建一个看不见的虚拟跨度吗?运行时如何?我试过了:$('<span></span>').html('hi').width()但它输出 0
2021-03-21 15:11:54
不要忘记:div/span 的放置和样式会有所不同,因为包装可以发挥作用。
2021-03-24 15:11:54
我会添加 white-space: nowrap 到 span 元素,否则如果文本因为容器太小而被换行,你会得到一个错误的结果
2021-04-01 15:11:54
这只会返回包含元素的宽度,而不是文本的宽度。
2021-04-03 15:11:54

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

function getWidthOfText(txt, fontname, fontsize){
    if(getWidthOfText.c === undefined){
        getWidthOfText.c=document.createElement('canvas');
        getWidthOfText.ctx=getWidthOfText.c.getContext('2d');
    }
    var fontspec = fontsize + ' ' + fontname;
    if(getWidthOfText.ctx.font !== fontspec)
        getWidthOfText.ctx.font = fontspec;
    return getWidthOfText.ctx.measureText(txt).width;
}

或者,正如其他一些用户所建议的,您可以将其包装在一个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);
    }
    if(getWidthOfText.e.style.fontSize !== fontsize)
        getWidthOfText.e.style.fontSize = fontsize;
    if(getWidthOfText.e.style.fontFamily !== fontname)
        getWidthOfText.e.style.fontFamily = fontname;
    getWidthOfText.e.innerText = txt;
    return getWidthOfText.e.offsetWidth;
}

编辑 2020:根据 Igor Okorokov 的建议添加了字体名称+大小缓存。

画布的想法很棒(特别是如果你已经有了)!它的纯 js 方法,比 span 更好,并且不需要 jquery
2021-03-12 15:11:54
您必须将此添加到 DOM 以计算宽度或高度。document.body.appendChild(e)
2021-03-28 15:11:54
px在画布上设置 fontSize/face后缺少一个空格
2021-03-29 15:11:54
某些原因这在 Chrome 54 或 Firefox 48 中不起作用。 e.innerWidth 不断出现未定义。
2021-04-04 15:11:54
@Xenon我的意思是,如果你只是复制这个片段中,它会因为没有工作'px' + fontname之后失踪的空间px
2021-04-11 15:11:54

我不相信你可以只做一个字符串,但如果你把字符串放在<span>具有正确属性(大小、字体粗细等)的 a 中;然后您应该能够使用 jQuery 来获取跨度的宽度。

<span id='string_span' style='font-weight: bold; font-size: 12'>Here is my string</span>
<script>
  $('#string_span').width();
</script>
@TopherFangio 或者更好,使用 css white-space: nowrap
2021-03-20 15:11:54
如果您担心换行,请确保您的字符串包含不间断空格:&nbsp;而不是常规空格。
2021-04-08 15:11:54

将其放在绝对定位的 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>

基于 vSync 的回答,纯 javascript 方法对于大量对象来说是闪电般的。这是小提琴:https : //jsfiddle.net/xeyq2d5r/8/

[1]: https://jsfiddle.net/xeyq2d5r/8/ "JSFiddle"

我收到了对提议的第三种方法的有利测试,该方法使用本机 javascript 与 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 毫秒。

谷歌浏览器:52
方法 1 耗时 336.4399999999998 毫秒。
方法 2 耗时 2271.71 毫秒。
方法 3 耗时 333.30499999999984 毫秒。

对不起,如果这听起来很粗鲁,但这不是 SO 的工作方式。您可以查看常见问题解答并进一步了解。我们试图提高帖子的质量,这就是为什么某些帖子会被标记。
2021-03-22 15:11:54
这有很大帮助。检查性能。当必须从多个选项中进行选择时,尤其是跨浏览器,实现的实现非常重要。
2021-03-30 15:11:54
但它确实提供了对所提供答案的进一步测试,以清楚地显示它们的表现。我总是从其他帖子中的评论和附加信息中受益。这就是我添加它的原因,觉得我所做的工作应该让看到这篇文章的其他人受益。不像它在 6 年内没有 56812 次观看......
2021-04-01 15:11:54
记录innerWidth 时,方法3 返回undefined。
2021-04-09 15:11:54
这并没有提供问题的答案。一旦您拥有足够的声誉,您就可以对任何帖子发表评论相反,提供不需要提问者澄清的答案-来自评论
2021-04-10 15:11:54