Кажется, я не могу добавить текст на холст, если текст содержит «\ n». То есть, разрывы строк не отображаются / работают.
ctxPaint.fillText("s ome \n \\n <br/> thing", x, y);
Приведенный выше код будет рисоваться "s ome \n <br/> thing"
в одной строке.
Это ограничение fillText или я ошибаюсь? символы "\ n" есть и не печатаются, но они тоже не работают.
fillText()
несколько раз и используйте высоту шрифта для разделения, либо используйте developer.mozilla.org/en-US/docs/Web/API/TextMetrics developer.mozilla.org/en-US/docs/Web/API /… - или используйте одно из очень сложных «решений» ниже, которое не использует TextMetrics ...Ответы:
Боюсь, это ограничение Canvas
fillText
. Многострочной поддержки нет. Что еще хуже, нет встроенного способа измерить высоту строки, только ширину, что делает это самостоятельно еще сложнее!Многие люди написали свою собственную многострочную поддержку, возможно, самый известный проект - Mozilla Skywriter .
Суть того, что вам нужно сделать, - это несколько
fillText
вызовов, каждый раз добавляя высоту текста к значению y. (Я считаю, что люди, пишущие на небе, измеряют ширину буквы M, чтобы приблизить текст.)источник
measureText()
, которые, я думаю, могут решить проблему. В Chrome есть флаг для их включения, но в других браузерах его нет ... пока!Если вы просто хотите позаботиться о символах новой строки в тексте, вы можете смоделировать это, разделив текст на новые строки и несколько раз вызывая
fillText()
Что-то вроде http://jsfiddle.net/BaG4J/1/
Я только что сделал обертку, подтверждающую концепцию ( абсолютная обертка с указанной шириной. Пока не обрабатывались слова ),
пример на http://jsfiddle.net/BaG4J/2/
И доказательство концепции с переносом слов (с разрывом пробелов ).
пример на http://jsfiddle.net/BaG4J/5/
Во втором и третьем примерах я использую
measureText()
метод, который показывает, какой длины ( в пикселях ) будет строка при печати.источник
Может быть, прийти на эту вечеринку немного поздно, но я нашел следующий урок по переносу текста на холст идеальным.
http://www.html5canvastutorials.com/tutorials/html5-canvas-wrap-text-tutorial/
Исходя из этого, я смог заставить работать несколько строк (извините, Рамирес, ваша у меня не сработала!). Мой полный код для переноса текста на холст выглядит следующим образом:
Где
c
идентификатор моего холста иtext
идентификатор моего текстового поля.Как видите, я использую нестандартный шрифт. Вы можете использовать @ font-face, если вы использовали шрифт в некотором тексте ДО манипулирования холстом - иначе холст не подберет шрифт.
Надеюсь, это кому-то поможет.
источник
Разделите текст на строки и нарисуйте каждую отдельно:
источник
Вот мое решение, изменяющее популярную функцию wrapText (), которая уже представлена здесь. Я использую функцию прототипирования JavaScript, чтобы вы могли вызывать функцию из контекста холста.
Основное использование:
Вот демонстрация, которую я собрал: http://jsfiddle.net/7RdbL/
источник
Я просто расширил CanvasRenderingContext2D, добавив две функции: mlFillText и mlStrokeText.
Вы можете найти последнюю версию в GitHub :
С помощью этой функции вы можете заливать / обводить многострочный текст в поле. Вы можете выровнять текст по вертикали и горизонтали. (Он учитывает \ n, а также может выравнивать текст).
Прототипы:
функция mlFillText (текст, x, y, w, h, vAlign, hAlign, lineheight); функция mlStrokeText (текст, x, y, w, h, vAlign, hAlign, lineheight);
Где vAlign может быть: «вверху», «по центру» или «кнопка», а hAlign может быть: «влево», «по центру», «вправо» или «выравнивать по ширине».
Вы можете протестировать библиотеку здесь: http://jsfiddle.net/4WRZj/1/
Вот код библиотеки:
А вот пример использования:
источник
Uncaught ReferenceError: Words is not defined
Если я попытаюсь изменить шрифт. Например:ctx.font = '40px Arial';
- попробуйте вставить это в свою скрипкуWords
переменная (чувствительная к регистру) ?? Это нигде не определено. Эта часть кода выполняется только тогда, когда вы меняете шрифт ..for in
не работает с расширеннымArray.prototype
. Не могли бы вы поместить его на github, чтобы мы могли его повторить?Используя javascript, я разработал решение. Это не красиво, но у меня сработало:
Надеюсь, это поможет!
источник
Код для переноса слов (разрыв пробелов), предоставленный @Gaby Petrioli , очень полезен. Я расширил его код, чтобы обеспечить поддержку символов новой строки
\n
. Кроме того, часто бывает полезно иметь размеры ограничивающей рамки, поэтомуmultiMeasureText()
возвращаются и ширина, и высота.Вы можете увидеть код здесь: http://jsfiddle.net/jeffchan/WHgaY/76/
источник
Вот версия Колина ,
wrapText()
который также поддерживает вертикально центрированный текст сcontext.textBaseline = 'middle'
:источник
Если вам нужны только две строки текста, вы можете разделить их на два разных вызова fillText и присвоить каждому отдельную базовую линию.
источник
Этот вопрос не связан с принципами работы холста. Если вам нужен разрыв строки, просто измените координаты следующего
ctx.fillText
.источник
Я думаю, что вы все еще можете положиться на CSS
К счастью, с помощью хитрости CSS (см. «Типографические метрики», чтобы узнать о других способах исправления старых реализаций использования измерений CSS), мы можем найти высоту текста, измерив offsetHeight элемента с теми же свойствами шрифта:
из: http://www.html5rocks.com/en/tutorials/canvas/texteffects/
источник
ctx.save()
тогда,ctx.font = '12pt Arial'
то,parseInt( ctx.font, 10 )
. Обратите внимание, что я использую pt при настройке. Затем он будет переведен в PX и сможет превращаться в цифру для использования в качестве высоты шрифта.Я создал крошечную библиотеку для этого сценария здесь: Canvas-Txt
Он отображает текст в несколько строк и предлагает подходящие режимы выравнивания.
Чтобы использовать это, вам нужно будет либо установить его, либо использовать CDN.
Монтаж
JavaScript
Это отобразит текст в невидимом поле с положением / размерами:
Пример скрипки
источник
ctx.fillText(txtline.trim(), textanchor, txtY)
я заметил это только в вашей интерактивной демонстрации на вашем сайте.2.0.9
версию. Демонстрационный сайт исправлен обновлением версии пакета. Проблема с несколькими пробелами. Я не знаю, лучше ли использовать самоуверенный пакет или игнорировать проблему. Получал запросы на это из разных мест. Я все равно пошел дальше и добавил обрезку.Lorem ipsum dolor, sit <many spaces> amet
это была причина, по которой я этого не делал. Как вы думаете, следует ли рассматривать несколько пробелов и удалять только в том случае, если есть только один?Я тоже не думаю, что это возможно, но обходной путь - создать
<p>
элемент и разместить его с помощью Javascript.источник
fillText()
иstrokeText()
вы можете делать вещи, выходящие за рамки возможностей CSS.Я столкнулся с этим из-за той же проблемы. Я работаю с переменным размером шрифта, поэтому это учитывает:
где .noteContent - это контентный div, который редактировал пользователь (он вложен в каждую функцию jQuery), а ctx.font - "14px Arial" (обратите внимание, что размер пикселя идет первым)
источник
Элемент Canvas не поддерживает такие символы, как новая строка '\ n', табуляция '\ t' или тег <br />.
Попытайся:
или, возможно, несколько строк:
источник
Мое решение проблемы ES5:
Подробнее об этом в моем блоге .
источник