Я хотел бы использовать JavaScript для расчета ширины строки. Возможно ли это без использования моноширинного шрифта?
Если он не встроенный, моя единственная идея - создать таблицу ширины для каждого символа, но это довольно неразумно, особенно с поддержкой Unicode и разных размеров шрифта (и всех браузеров в этом отношении).
javascript
textbox
Иаков
источник
источник
Ответы:
Создайте DIV со следующими стилями. В вашем JavaScript установите размер шрифта и атрибуты, которые вы пытаетесь измерить, поместите вашу строку в DIV, затем прочитайте текущую ширину и высоту DIV. Он растянется, чтобы соответствовать содержимому, и размер будет в пределах нескольких пикселей от размера отображаемой строки.
источник
+1
для каждого измерения?В HTML 5 вы можете просто использовать метод Canvas.measureText (дальнейшее объяснение здесь ).
Попробуйте эту скрипку :
Эта скрипка сравнивает этот метод Canvas с вариацией метода , основанного на DOM Боба Монтеверде , так что вы можете анализировать и сравнивать точность результатов.
У этого подхода есть несколько преимуществ, в том числе:
textAlign
иtextBaseline
.ПРИМЕЧАНИЕ. При добавлении текста в DOM не забывайте также учитывать отступы, поля и границы .
ПРИМЕЧАНИЕ 2: В некоторых браузерах этот метод дает субпиксельную точность (результат - число с плавающей запятой), в других - нет (результат - только целое число). Возможно, вы захотите запустить
Math.floor
(илиMath.ceil
) результат, чтобы избежать несоответствий. Поскольку метод на основе DOM никогда не является субпиксельным с точностью, этот метод имеет даже более высокую точность, чем другие методы здесь.Согласно этому jsperf (спасибо авторам в комментариях), метод Canvas и метод на основе DOM работают примерно одинаково, если к методу на основе DOM добавлено кэширование, а вы не используете Firefox. В Firefox по какой-то причине этот метод Canvas намного быстрее, чем метод на основе DOM (по состоянию на сентябрь 2014 года).
источник
strokeText()
илиfillText()
. Возможно, вы хотели прокомментировать другой ответ?Вот тот, который я взбил без примера. Похоже, мы все на одной странице.
Используя это просто:
"a string".width()
** Добавлено,
white-space: nowrap
чтобы можно было рассчитать строки с шириной, превышающей ширину окна.источник
String
поскольку он уменьшает разделение интересов вашей программы (отдельный код ядра и код пользовательского интерфейса). Представьте, что вы хотите портировать свой основной код на платформу с совершенно другой структурой пользовательского интерфейса ...o[0].getBoundingClientRect().width
в соответствии с предложением здесь: stackoverflow.com/a/16072668/936397JQuery:
источник
Это работает для меня ...
источник
В библиотеке ExtJS javascript есть отличный класс Ext.util.TextMetrics, который «обеспечивает точные измерения пикселей для блоков текста, чтобы вы могли точно определить, насколько высокими и широкими в пикселях будет данный блок текста». Вы можете использовать его напрямую или просмотреть его исходный код, чтобы увидеть, как это делается.
http://docs.sencha.com/extjs/6.5.3/modern/Ext.util.TextMetrics.html
источник
Мне нравится ваша "единственная идея" просто сделать статическую карту ширины символов! Это на самом деле хорошо работает для моих целей. Иногда по соображениям производительности или из-за того, что у вас нет простого доступа к DOM, вам может понадобиться быстрый взломанный автономный калькулятор, откалиброванный для одного шрифта. Итак, вот один, откалиброванный для Helvetica; передать строку и (необязательно) размер шрифта:
Этот гигантский уродливый массив имеет ширину символов ASCII, проиндексированную кодом символов. Так что это просто поддерживает ASCII (в противном случае предполагается средняя ширина символа). К счастью, ширина в основном линейно масштабируется в зависимости от размера шрифта, поэтому она отлично работает при любом размере шрифта. Ему явно не хватает понимания кернинга, лигатур или чего-то еще.
Чтобы «откалибровать», я просто визуализировал каждый символ до charCode 126 (могущественная тильда) в SVG, получил ограничивающий прямоугольник и сохранил его в этом массиве; больше кода и объяснений и демо здесь .
источник
* fontSize
и просто использовать ихЯ написал небольшой инструмент для этого. Возможно, это кому-нибудь пригодится. Работает без jQuery .
https://github.com/schickling/calculate-size
Применение:
Скрипка: http://jsfiddle.net/PEvL8/
источник
Вы можете использовать холст, чтобы вам не приходилось иметь дело со свойствами CSS:
источник
Это должно работать, пока к тегу <span> не применяются другие стили. offsetWidth будет включать в себя ширину любых границ, горизонтальное заполнение, ширину вертикальной полосы прокрутки и т. д.
источник
Приведенный ниже фрагмент кода «вычисляет» ширину тега span, добавляет к нему «...», если он слишком длинный, и сокращает длину текста до тех пор, пока он не уместится в родительском элементе (или пока он не попытается выполнить более тысячи раз)
CSS
HTML
JavaScript (с помощью jQuery)
источник
Лучше всего определить, подходит ли текст прямо перед отображением элемента. Таким образом, вы можете использовать эту функцию, которая не требует, чтобы элемент был на экране.
Применение:
источник
На тот случай, если кто-то еще ищет здесь способ измерения ширины строки и способ узнать, какой самый большой размер шрифта будет соответствовать конкретной ширине, вот функция, основанная на решении @ Domi с бинарным поиском. :
источник
Попробуйте этот код:
источник
Ширина и высота текста могут быть получены с помощью
clientWidth
иclientHeight
убедитесь, что свойство стиля позиции установлено в абсолют
не обязательно должен быть внутри
div
, может быть внутриp
илиspan
источник
Основываясь на ответе Дипака Надара , я изменил параметр функций, чтобы принимать стили текста и шрифта. Вам не нужно ссылаться на элемент. Кроме того,
fontOptions
есть значения по умолчанию, поэтому вам не нужно поставлять все из них.источник
Я думаю, что это похоже на запись Депака, но основано на работе Луи Лазариса, опубликованной в статье на странице впечатляющей сети
Событие fit используется для немедленного выполнения вызова функции после того, как функция связана с элементом управления.
Например: $ ('input'). autofit (). trigger ("fit");
источник
Без jQuery:
источник
Скрипка рабочего примера: http://jsfiddle.net/tdpLdqpo/1/
HTML:
Код JavaScript:
источник
Суммирование всех возвращенных значений ширины прямоугольника дает общую ширину текста в пикселях.
источник
Я сделал крошечный модуль ES6 (использует jQuery):
Легко использовать:
Крутая вещь, которую вы можете заметить - она позволяет учитывать любые атрибуты CSS, даже отступы!
источник
Вы также можете сделать это с помощью createRange, который является более точным, чем метод клонирования текста:
источник
источник