Blog. Just Blog

Как измерить ширину текста в JavaScript

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Как измерить ширину текста в JavaScript
Как измерить ширину текста в JavaScript

Часто в веб-разработке возникает необходимость точно узнать, сколько пикселей займет строка текста при заданном шрифте. Например, сделать красивую обрезку длинных заголовков с многоточием, выравнивание графических элементов в canvas или валидация ввода в реальном времени. Самый лучший способ для этого - использовать метод measureText() объект Canvas. Он возвращает размер с точной шириной текста в пикселях, а главное, без необходимости добавления элементов в DOM и без влияния на верстку.

Метод measureText() возвращает объект TextMetrics, который в современных браузерах содержит не только width, но и дополнительные метрики. Также в функции используется хитрый трюк со свойством функции (getTextWidth.canvas), чтобы при каждом вызове не создавать новый элемент <canvas>. Это ускоряет работу в 5-10 раз при массовых измерениях.
  1. // Функция измеряет ширину текста с учетом стиля шрифта
  2. function get_text_width(textfont) {
  3.   // Создаем canvas один раз и переиспользуем его
  4.   const canvas getTextWidth.canvas ||
  5.      (getTextWidth.canvas document.createElement('canvas'));
  6.   const ctx canvas.getContext('2d');
  7.  
  8.   // Применяем стиль шрифта
  9.   ctx.font font;
  10.  
  11.   // Получаем результат ширины
  12.   return ctx.measureText(text).width;
  13. }
Параметры функции: text - текст для измерения, font - CSS-значение шрифта, обязательно в формате CSS Font, например, "16px Arial". На выходе получаем значение ширины текста в пикселях с плавающей точкой. Результат обеспечивает субпиксельную точность, поэтому результат может быть дробным, к примеру, 84.175. Если нужна целочисленная ширина, например, для offsetWidth, используйте Math.ceil(). Функция не требует зависимостей и работает во всех современных браузерах, включая IE11. Использовать функцию можно как-то так.
  1. // С жирным начертанием и размером
  2. get_text_width("Заголовок""bold 24px Verdana"); 
  3.  
  4. // Курсив и кастомный шрифт
  5. get_text_width("Курсивный текст""italic 18px 'Times New Roman'");
И вот реальный пример.
  1. function truncate_text(textfontmax_width) {
  2.   if (get_text_width(textfont) <= max_width) {
  3.     return text;
  4.   }
  5.   // Начальный текст
  6.   let truncated text;
  7.   // Обрезаем по одному символу
  8.   while (get_text_width(truncated '...'font) > maxWidth
  9.     && truncated.length 0) {
  10.     // Обрезаем последний символ
  11.     truncated truncated.slice(0, -1);
  12.   }
  13.   // Обработанный текст
  14.   return truncated '...';
  15. }
  16.  
  17. // Использование
  18. const result truncate_text('Очень длинный заголовок, который '+
  19. 'нужно обрезать''14px Arial'200);
  20. // Результат: 'Очень длинный заголов...'
Важно, что рендеринг шрифтов отличается в зависимость от системы: Windows/macOS/Linux и даже между браузерами. Для обеспечения кроссплатформенной совместимости обязательно тестируйте на целевых устройствах.

Поделиться ссылкой ВКонтакте
Просмотров: 108 | Комментариев: 0

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2026
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.08 сек. / MySQL: 2 (0.0042 сек.) / Память: 4.5 Mb
Наверх