Let’s say I have the string “Hello”. This string is obviously five characters in length, but what is its length in pixels? Is there an easy way to determine this length in JavaScript? I have thought of a solution where an extra div would have to be displayed to the user, but this way seems hacky and complicated.
In the bigger picture, I am trying to determine how many spaces would be necessary to fill that length of the string. As you can probably tell from above, I think the best option would be to simply measure the length of the string and a single space character from the user’s perspective and calculate how many spaces should replace the text based off of that. This is going to be displayed in an HTML input text, by the way.
Thanks.
asked Feb 5, 2011 at 23:27
3
You can determine the number of pixels the container of the string. You can do this by creating a hidden element in the DOM, setting the inner HTML to the string and then asking for the width.
answered Feb 5, 2011 at 23:34
rcravensrcravens
8,2902 gold badges32 silver badges25 bronze badges
3
I don’t think their is a good, easy way to do that, except computing the length of a container. The width depends on the font-size, the font, the letter-spacing, it will be different depending on the browser etc…
answered Feb 5, 2011 at 23:31
RobinRobin
21.6k10 gold badges61 silver badges85 bronze badges
I’ve used this to determine the text length in pixels (jQuery syntax):
var txtLen = $(<selector>).text().length * $(<selector>).css('font-size').slice(0,-2);
where selector
is whatever you use to target the specific element. Adjust where needed (if the font-size is not set in px
).
For example:
var txtLen = $('table td').text().length * $('table td').css('font-size').slice(0,-2);
Real-life use of this was when I needed to determine whether to show the tooltip on a td
with a fixed width – if td
is wider than its contents, there is no need to show the tooltip.
Things stated in Robin’s answer still apply.
answered Jan 25, 2021 at 10:26
FiddlingAwayFiddlingAway
1,5463 gold badges14 silver badges30 bronze badges
apt.ru
Timeweb – компания, которая размещает проекты клиентов в Интернете, регистрирует адреса сайтов и предоставляет аренду виртуальных и физических серверов. Разместите свой сайт в Сети – расскажите миру о себе!
Виртуальный хостинг
Быстрая загрузка вашего сайта, бесплатное доменное имя, SSL-сертификат и почта. Первоклассная круглосуточная поддержка.
Аренда VDS и VPS
Виртуальные серверы с почасовой оплатой. Меняйте конфигурацию сервера в любой момент и в пару кликов.
Выделенные серверы
Аренда физических серверов любых конфигураций — готовые сборки или под заказ.
Если шрифт, например, “Times New Roman” и размер, например, 12 пт, известно, как длина строки, например, «Привет мир» будет рассчитываться в пикселях, может быть, только приблизительно?
Это нужно для ручного выравнивания текста, показанного в приложении Windows, вручную, поэтому мне нужно настроить числовые пространства, чтобы получить выравнивание.
2 ответа
Лучший ответ
Альтернатива – спросить у Windows следующее:
import ctypes
def GetTextDimensions(text, points, font):
class SIZE(ctypes.Structure):
_fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)]
hdc = ctypes.windll.user32.GetDC(0)
hfont = ctypes.windll.gdi32.CreateFontA(points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font)
hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont)
size = SIZE(0, 0)
ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size))
ctypes.windll.gdi32.SelectObject(hdc, hfont_old)
ctypes.windll.gdi32.DeleteObject(hfont)
return (size.cx, size.cy)
print(GetTextDimensions("Hello world", 12, "Times New Roman"))
print(GetTextDimensions("Hello world", 12, "Arial"))
Это отобразит:
(47, 12)
(45, 12)
7
Martin Evans
3 Мар 2016 в 12:52
Основываясь на комментарии @Selcuk, я нашел ответ:
from PIL import ImageFont
font = ImageFont.truetype('times.ttf', 12)
size = font.getsize('Hello world')
print(size)
Который печатает (x, y) размер как:
(58, 11)
19
EquipDev
3 Мар 2016 в 12:28
0 / 0 / 0 Регистрация: 16.11.2009 Сообщений: 30 |
|
1 |
|
Как узнать ширину выводимого текста в пикселях16.11.2009, 22:29. Показов 32529. Ответов 5
Цель такая, мне нужно вывести в BitMap текст с использованием определенного шрифта и определенного размера шрифта. Можно ли как-нибудь узнать ширину и высоту которую займет текст после вывода с учетом шрифта и размера?
0 |
153 / 113 / 25 Регистрация: 23.06.2008 Сообщений: 320 |
|
17.11.2009, 07:36 |
2 |
Если текст будешь выводить средствами C#, то можно узнать.
0 |
0 / 0 / 0 Регистрация: 16.11.2009 Сообщений: 30 |
|
17.11.2009, 10:20 [ТС] |
3 |
Если текст будешь выводить средствами C#, то можно узнать. Я текст буду выводить средствами C#
0 |
d0s’A 153 / 113 / 25 Регистрация: 23.06.2008 Сообщений: 320 |
||||
17.11.2009, 12:16 |
4 |
|||
Сообщение было отмечено как решение Решение
Вроде все
7 |
DonySuXX 16 / 16 / 1 Регистрация: 11.09.2011 Сообщений: 3 |
||||
29.05.2012, 09:42 |
5 |
|||
Сообщение было отмечено как решение РешениеСейчас столкнулся с этой проблемой – и нашёл элегантное решение на MSDN.
У Size есть и ширина и высота..
16 |
0 / 0 / 0 Регистрация: 02.01.2023 Сообщений: 1 |
|
07.01.2023, 05:19 |
6 |
Size len = TextRenderer.MeasureText(Control.Text, Control.Font);
0 |
Определение размеров текста
Время на прочтение
2 мин
Количество просмотров 13K
Возможно, кто-нибудь из вас сталкивался с задачей в которой крайне необходимо было бы узнать размер текстового блока в пикселях.
После небольшого исследования выяснилось, что не всегда данный размер возможно получить обычными способами. Будь то методы jQuery, prototype или обычное обращение к параметрам DOM.
Хотелось бы поделится небольшой функцией, которая может сотворить чудо, и выяснить беспрекословно требуемые размеры с помощью клонирования.
function inlineSize(el) {
// дополнительные стили для клона, что бы мир не заметил чуда, и размеры отображались корректно
var hiddenStyle = "left:-10000px;top:-10000px;height:auto;width:auto;position:absolute;";// создаем box элемент
// для клонирования содержимого из нашего исходного inline блока
var clone = document.createElement('div');// в обязательном порядке копируем стили с исходного элемента,
// что бы размеры соответствовали исходнику.
for (var i in el.style) {
try {
if ((el.style[i] != '') && (el.style[i].indexOf(":") > 0)) {
clone.style[i] = el.style[i];
}
} catch (e) {}
}// устанавливаем стили у клона, дабы он не мозолил глаз.
// Учитываем, что IE не позволяет напрямую устанавливать значение аттрибута style
document.all ? clone.style.setAttribute('cssText', hiddenStyle) : clone.setAttribute('style', hiddenStyle);// Переносим содержимое. Аккуратно.
clone.innerHTML = el.innerHTML// Добавляем клон в корневой документ.
// Так, на всякий пожарный в parent, а то вдруг элемент внутри iframe?
parent.document.body.appendChild(clone);// Забиваем заветное.
var rect = {width:clone.clientWidth,height:clone.clientHeight};// ...и тут же удаляем
parent.document.body.removeChild(clone);// Вот собственно говоря и все.
return rect;
}* This source code was highlighted with Source Code Highlighter.
Тестировалось на FF2, FF3, IE7.
На данный момент существуют плагины для jQuery, extension для prototype и методы в ExtJS, которые позволяют выполнять данную функцию и может быть даже в более лучшем виде. Однако мне хотелось отразить на чистом языке, как это все происходит. Надеюсь, этот код сэкономит немного времени вашей драгоценной жизни 😉