Показать сообщение отдельно
  #2 (permalink)  
Старый 26.10.2019, 21:28
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Байт
Покопавшись в интернете, обнаружил, что проблема популярна. И дело скорее всего в рассинхронизации загрузки фонтов и выполнения JS-скриптов.
А проблема на самом деле в полном отсутствии логики!

Сначало нужно загрузить шрифт, а затем нарисовать текст на холсте, используя шрифт! Логично? Если сделать в обратном порядке, то такое не будет работать!

@font-face не загружает шрифт, оно указывает откуда можно скачать шрифт, когда он понадобится! И соответственно, он понадобился тогда, когда вы стали рисовать текст на холсте, но шрифт ещё не загружен. Вы отрисовали текст, а затем асинхронно загрузился шрифт, но к тому времени он уже не нужен!

Вот что вам нужно сделать для того, чтобы нарисовать текст, используя определённый шрифт...
  • Скачать шрифт (я для этого использую класс FontFace, соответственно мне нужно будет добавить шрифт в документ после загрузки шрифта)
  • Затем нарисовать текст (после того, как шрифт добавлен в документ)

<canvas id="test"></canvas>
<script>

const canvas = document.getElementById("test")
const context = canvas.getContext("2d")
const fontFace = new FontFace("EKA", "url(https://cdn.glitch.com/348d485e-4ba6-4841-a41e-5865874b2d66%2FEKA-Absolution-Regular.ttf?v=1572113481005)")

fontFace.load().then(fontFace => {
	document.fonts.add(fontFace)

	context.font = "48px EKA"
	context.strokeText("Hello world!", 0, 100)
});

</script>


Возможно потом вы захотите шрифт удалить из документа используя метод delete у объекта document.fonts (это представитель класса FontFaceSet)

Последний раз редактировалось Malleys, 26.10.2019 в 21:34.
Ответить с цитированием