У меня есть следующий прямоугольник ...
<rect x="0px" y="0px" width="60px" height="20px"/>
Я хотел бы сосредоточить слово «беллетристика» внутри него. Для других прямоугольников svg word wrap остается в них? Кажется, я не могу найти что-то конкретно о вставке текста в фигуры, которые центрированы как по горизонтали, так и по вертикали, и перенос слов. Также текст не может покинуть прямоугольник.
Просмотр примера http://www.w3.org/TR/SVG/text.html#TextElement не помогает, поскольку x и y текстового элемента отличаются от x и y прямоугольника. Кажется, нет ширины и высоты для текстовых элементов. Я не уверен в математике здесь.
(Моя HTML-таблица просто не будет работать.)
Ответы:
Простое решение для центрирования текста по горизонтали и вертикали в SVG:
Установите положение текста в абсолютный центр элемента, в котором вы хотите центрировать его:
x="50%" y ="50%"
.x
будетx
этот элемент + половина его ширины (и аналогично для,y
но с высотой).Используйте
text-anchor
свойство для центрирования текста по горизонтали со значениемmiddle
:Используйте
dominant-baseline
свойство для центрирования текста по вертикали со значениемmiddle
(или в зависимости от того, как вы хотите, чтобы он выглядел, вы можете захотеть сделатьcentral
)Вот простая демонстрация:
источник
dominant-baseline
свойство, которое делает работу, а неalignment-baseline
.<style type="text/css"><![CDATA[ text { alignment-baseline: middle; text-anchor:middle; } ]]></style>
. Спасибо за решение.dominant-baseline
действительно нужно использовать. Извините, но этот ответ как-то вводит в заблуждение. Поскольку он не работает ни в Firefox, ни в Chromium, и, кроме того, вы должны изучить комментарии, чтобы самостоятельно найти правильное решение, я позволил себе добавить еще один ответ с кодом, который работает, как и ожидалось. (Для записей: протестировано с FF и Chromium на Ubuntu Linux.)alignment-baseline
, но мне кажется , что это может быть изворотливой вещь , потому что обзор спецификации, это должно бытьdominant-baseline
дляtext
, иalignment-baseline
дляtspan
,tref
,altGlyph
, иtextPath
. Я обновил ответ соответственно.SVG 1.2 Tiny добавил перенос текста, но большинство реализаций SVG, которые вы найдете в браузере (за исключением Opera), не реализовали эту функцию. Как правило, вам, разработчику, нужно размещать текст вручную.
Спецификация SVG 1.1 предоставляет хороший обзор этого ограничения и возможные решения для его преодоления:
http://www.w3.org/TR/SVG11/text.html#Introduction
В качестве примитива обтекание текстом может быть смоделировано с использованием
dy
атрибута иtspan
элементов, и, как указано в спецификации, некоторые инструменты могут автоматизировать это. Например, в Inkscape выберите нужную фигуру и текст, который вам нужен, и используйте «Текст» -> «Переместить в рамку». Это позволит вам написать текст с переносом, который будет переноситься на основе границ фигуры. Кроме того, обязательно следуйте этим инструкциям, чтобы сообщить Inkscape о совместимости с SVG 1.1: http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3FКроме того, есть несколько библиотек JavaScript, которые можно использовать для динамической автоматизации переноса текста: http://www.carto.net/papers/svg/textFlow/
Интересно отметить решение CSVG обернуть фигуру в текстовый элемент (например, см. Их пример «кнопки»), хотя важно отметить, что их реализация не может использоваться в браузере: http://www.csse.monash.edu .au / ~ CLM / csvg / about.html
Я упоминаю об этом, потому что я разработал библиотеку в стиле CSVG, которая позволяет вам делать подобные вещи и работает в веб-браузерах, хотя я еще не выпустил ее.
источник
editable="true"
к элементу text или textArea.Предыдущие ответы дали плохие результаты при использовании закругленных углов или
stroke-width
это> 1. Например, вы могли бы ожидать, что следующий код создаст скругленный прямоугольник, но углы обрезаются родительскимsvg
компонентом:Вместо этого я рекомендую оборачивать
text
вsvg
и затем вложенности , что новыйsvg
и вrect
тусовке внутриg
элемента, как показано в следующем примере:Это устраняет проблему отсечения, возникающую в ответах выше. Я также перевел группу rect / text, используя
transform="translate(x,y)"
атрибут, чтобы продемонстрировать, что это обеспечивает более интуитивный подход к размещению прямоугольника / текста на экране.источник
Если вы создаете SVG программно, вы можете упростить его и сделать что-то вроде этого:
источник
dominant-baseline
аtext-anchor
неdominantBaseline
иtextAnchor
?Вы можете напрямую использовать
text-anchor = "middle"
собственность. Я советую создать элемент обертки SVG над вашим прямоугольником и текстом. Таким образом, вы можете использовать весь элемент, используя один селектор CSS. Убедитесь, что для свойства x и y указано 50%.источник
Подробный блог: http://blog.techhysahil.com/svg/how-to-center-text-in-svg-shapes/
источник
alignment-baseline
это неправильный атрибут для использования здесь. Правильный ответ - использовать комбинациюdominant-baseline="central"
иtext-anchor="middle"
:источник
Один из способов вставить текст в прямоугольник - это вставить посторонний объект, который является DIV, внутри прямоугольного объекта.
Таким образом, текст будет ограничивать пределы DIV.
источник
У меня было много времени, когда все было сосредоточено с помощью SVG, поэтому я развернул свою маленькую функцию. надеюсь, это должно помочь вам. Обратите внимание, что это работает только для элементов SVG.
источник
Для горизонтального и вертикального выравнивания текста в графике вы можете использовать следующие стили CSS. В частности, обратите внимание, что
dominant-baseline:middle
это, вероятно, неправильно, поскольку это (обычно) на полпути между вершиной и базовой линией, а не на полпути между вершиной и основанием. Кроме того, некоторые некоторые источники (например, Mozilla ) используютdominant-baseline:hanging
вместоdominant-baseline:text-before-edge
. Это также, вероятно, неправильно, такhanging
как разработано для индийских скриптов. Конечно, если вы используете смесь латинского, индийского, иероглифов или чего-то еще, вам, вероятно, придется прочитать документацию .Редактировать: я только что заметил, что Mozilla также использует,
dominant-baseline:baseline
что, безусловно, неправильно: это даже не признанная ценность! Я предполагаю, что по умолчанию используется шрифт по умолчаниюalphabetic
, поэтому им повезло.Подробнее: Safari (11.1.2) понимает,
text-before-edge
но не понимаетtext-after-edge
. Это также не удаетсяideographic
. Отличная штука, Apple. Таким образом, вы можете быть вынуждены использоватьalphabetic
и разрешить спуски в конце концов. Сожалею.источник