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


71

有什么方法可以确定jQuery / JavaScript中字符串的像素长度吗?

Answers:


59

文本换行的跨度和使用jQuery的宽度()


3
不要忘记:div / span的位置和样式会有所不同,因为包装可以发挥作用。
Andy E 2010年

5
这只会返回包含元素的宽度,而不会返回文本的宽度。
Gumbo 2010年

5
使用<span>包装器效果最佳,因为a<div>会自动设置为浏览器宽度的100%。
Mottie 2010年

11
您可能应该提供一些示例代码。我很难弄清楚“将文本自动换行”的意思。跨度应该在原始html中吗?我可以创建一个看不见的虚拟跨度吗?在运行时如何?我尝试过:$('<span></span>').html('hi').width()但是它输出0
Cruncher

2
我会在span元素中添加空格:nowrap,否则如果由于容器太小而将文本
换行,

55

用于HTML Canvas的上下文具有用于检查字体大小的内置方法。此方法返回一个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的建议添加了字体名称+大小缓存。


由于某些原因,这在Chrome 54或Firefox 48中不起作用。e.innerWidth不断出现未定义状态。
Donny V.

您必须将其添加到DOM中才能计算出宽度或高度。document.body.appendChild(e)
Donny V.

1
您在px画布上设置fontSize / face时缺少空格
居住

1
@Xenon我的意思是,如果您仅复制此代码段,则该代码将无效,因为该代码'px' + fontname后缺少空格px
居住

3
帆布创意很棒(特别是如果您有一个创意的话)!它的纯js方法,比span更好,并且不需要jquery
xakepp35

11

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

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

如果您担心换行,请确保您的字符串包含不间断空格:&nbsp;而不是常规空格。
Topher Fangio 2010年

1
@TopherFangio或者更好,使用css white-space: nowrap
ErikE

6

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

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

我收到了针对建议的第3种方法的良好测试,该方法使用了本机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毫秒。


1
这不能为问题提供答案。一旦您拥有足够的声誉,您就可以在任何帖子中发表评论;相反,请提供不需要问询者澄清的答案。-评分
罗希特VIPIN马修斯

2
但是它确实提供了对所提供答案的进一步测试,以清楚地显示它们的表现。Ive总是会从其他帖子中的评论和其他信息中受益。那就是为什么我添加它,感觉我所做的工作应该使看到这篇文章的其他人受益。不喜欢它没有在6年内56812点意见....
RJ凯利

1
抱歉,听起来很粗鲁,但这不是SO的工作方式。您可以通过常见问题解答进一步了解。我们试图提高帖子的质量,这就是为什么某些帖子被标记的原因。
罗希特·维平·马修斯

2
这很有帮助。检查性能。当必须从多个选项中进行选择时(尤其是跨浏览器),实现的实现非常重要。
Donny V.

记录innerWidth时,方法3返回undefined。
Michael Kire Hansen

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>

2

首先复制文本的位置和样式,然后使用Jquery width()函数。这将使测量准确。 例如,您具有使用以下选择器的css样式:

.style-head span
{
  //Some style set
}

您需要使用此脚本上方已包含的Jquery来执行此操作:

var measuringSpan = document.createElement("span");
measuringSpan.innerText = 'text to measure';
measuringSpan.style.display = 'none'; /*so you don't show that you are measuring*/
$('.style-head')[0].appendChild(measuringSpan);
var theWidthYouWant = $(measuringSpan).width();

不用说

想要的宽度

将保持像素长度。完成后,请删除创建的元素,否则,如果多次完成,您将获得多个元素。或添加一个ID来引用。


-2

如果您使用Snap.svg,则可以使用以下功能:

var tPaper = Snap(300, 300);
var tLabelText = tPaper.text(100, 100, "label text");
var tWidth = tLabelText.getBBox().width;  // the width of the text in pixels.
tLabelText.attr({ x : 150 - (tWidth/2)});   // now it's centered in x

由于相对缺乏经验,我很想知道为什么这被否决了。是否因为它是使用Snap的解决方案?这是我为了避免在JavaScript中处理画布而使用的内容。
蒂姆·埃里克森

1
这正是我一直在寻找的东西,但是我的文本宽度
变成

使用原始答案tPaper.node.clientWidth。Kuhaku无法解决这个问题,然后晃来晃去!现在我也不能。我已更改了要使用的示例.getBBox()。我认为您可以clientWidth在Snap.svg“纸”对象上使用绘图表面(并且getBBox()不起作用);但对于元素(圆形,形状,更重要的是文本),您可以使用getBBox()我有一个演示文稿可以回答另一个帖子
Tim Erickson,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.