Метод MeasureText() контекста Canvas 2d иногда дает разную ширину

Я использую контекст Canvas 2d для вычисления ширины текста.

Бывший:canvas2DContext.measureText('Sivakumar Tadisetti')

Я использую шрифт как bold 15px "Open Sans", serif

Проблема: Иногда measureText() дает 119.4835, а иногда 115.3423 ширину.

Почему я получаю разную ширину. Что я здесь делаю неправильно? Пожалуйста, найдите фрагмент ниже.

var canvas = document.createElement('canvas');
var canvas2DContext = canvas.getContext('2d');

var textWidth = canvas2DContext.measureText("Sivakumar Tadisetti").width;
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
147
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Немного слепой выстрел, но для меня это звучит так, как будто вы не ждете загрузки вашего шрифта должным образом:

const ctx = canvas.getContext('2d');
ctx.font = 'bold 15px "Open Sans", serif'

const before_load = ctx.measureText("Sivakumar Tadisetti").width;
console.info('before', before_load);

// load the font
document.fonts.ready
  .then(() => {
    ctx.font = 'bold 15px "Open Sans", serif'
    const after_load = ctx.measureText("Sivakumar Tadisetti").width;
    console.info('after', after_load);
  });
<link href = "https://fonts.googleapis.com/css?family=Open+Sans" rel = "stylesheet"> 
<canvas id = "canvas"></canvas>

Чтобы избежать этого, вы можете выполнить свой код в обратном вызове обещания document.fonts.ready:

document.fonts.ready.then(startYourCode);

document.fonts.ready.then(() => {
  const ctx = canvas.getContext('2d');
  ctx.font = 'bold 15px "Open Sans", serif'

  const textWidth= ctx.measureText("Sivakumar Tadisetti").width;
  console.info(textWidth);
});
#canvas { font-family: "Open Sans"; }
<link href = "https://fonts.googleapis.com/css?family=Open+Sans" rel = "stylesheet">
<canvas id = "canvas"></canvas>

Понял... спасибо, но почему это происходит только с некоторыми текстами. Пример: в массиве текстов только для некоторых текстов неправильная ширина

Sivakumar Tadisetti 13.05.2019 09:26

Другие вопросы по теме