Eu tenho o seguinte retângulo ...
<rect x="0px" y="0px" width="60px" height="20px"/>
Eu gostaria de centralizar a palavra "ficção" dentro dela. Para outros retângulos, o svg word wrap fica dentro deles? Não consigo encontrar nada específico sobre a inserção de texto em formas centralizadas na horizontal e na vertical e na quebra de linha. Além disso, o texto não pode deixar o retângulo.
Examinar o exemplo http://www.w3.org/TR/SVG/text.html#TextElement não ajuda, pois os elementos x e y do elemento de texto são diferentes dos x e y do retângulo. Não parece haver largura e altura para os elementos de texto. Não tenho certeza da matemática aqui.
(Minha tabela html simplesmente não vai funcionar.)
Respostas:
Uma solução fácil para centralizar o texto horizontal e verticalmente em SVG:
Defina a posição do texto no centro absoluto do elemento no qual você deseja centralizá-lo:
x="50%" y ="50%"
.x
seria ox
desse elemento + metade de sua largura (e semelhante para,y
mas com a altura).Use a
text-anchor
propriedade para centralizar o texto horizontalmente com o valormiddle
:Use a
dominant-baseline
propriedade para centralizar o texto verticalmente com o valormiddle
(ou dependendo da aparência que você deseja, você pode querer fazercentral
)Aqui está uma demonstração simples:
fonte
dominant-baseline
propriedade que faz o trabalho, não oalignment-baseline
.<style type="text/css"><![CDATA[ text { alignment-baseline: middle; text-anchor:middle; } ]]></style>
. Obrigado pela solução.dominant-baseline
realmente precisa ser usado. Sinto muito, mas esta resposta é de alguma forma enganosa. Como ele não parece funcionar no Firefox nem no Chromium, além disso, você deve estudar os comentários para encontrar a solução correta por conta própria. Tomei a liberdade de adicionar outra resposta com o código que funciona conforme o esperado. (Para os registros: testado com FF e Chromium no Ubuntu Linux).alignment-baseline
, mas parece que ele pode ser uma coisa peculiar porque revendo as especificações, deve serdominant-baseline
detext
, ealignment-baseline
paratspan
,tref
,altGlyph
etextPath
. Eu atualizei a resposta de acordo.SVG 1.2 Minúsculo pacote de texto adicionado, mas a maioria das implementações do SVG que você encontrará no navegador (com exceção do Opera) não implementaram esse recurso. Normalmente, você é o desenvolvedor, para posicionar o texto manualmente.
A especificação SVG 1.1 fornece uma boa visão geral dessa limitação e as possíveis soluções para superá-la:
http://www.w3.org/TR/SVG11/text.html#Introduction
Como primitivo, o agrupamento de texto pode ser simulado usando o
dy
atributo e ostspan
elementos e, como mencionado na especificação, algumas ferramentas podem automatizar isso. Por exemplo, no Inkscape, selecione a forma desejada e o texto desejado e use Texto -> Fluir para o quadro. Isso permitirá que você escreva seu texto, com quebra automática, que será quebrada com base nos limites da forma. Além disso, siga estas instruções para instruir o Inkscape a manter a compatibilidade com o SVG 1.1: http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3FAlém disso, existem algumas bibliotecas JavaScript que podem ser usadas para automatizar dinamicamente a quebra de texto: http://www.carto.net/papers/svg/textFlow/
É interessante observar a solução do CSVG para agrupar uma forma em um elemento de texto (por exemplo, veja o exemplo "botão"), embora seja importante mencionar que a implementação não é utilizável em um navegador: http://www.csse.monash.edu .au / ~ clm / csvg / about.html
Estou mencionando isso porque desenvolvi uma biblioteca inspirada em CSVG que permite fazer coisas semelhantes e funciona em navegadores da web, embora ainda não a tenha lançado.
fonte
editable="true"
ao elemento text ou textArea.As respostas anteriores deram maus resultados ao usar cantos arredondados ou
stroke-width
é> 1. Por exemplo, você esperaria que o código a seguir produzisse um retângulo arredondado, mas os cantos são cortados pelosvg
componente pai :Em vez disso, recomendo agrupar o
text
em umsvg
e aninhar o novosvg
e orect
junto dentro de umg
elemento, como no exemplo a seguir:Isso corrige o problema de recorte que ocorre nas respostas acima. Também traduzi o grupo rect / text usando o
transform="translate(x,y)"
atributo para demonstrar que isso fornece uma abordagem mais intuitiva para posicionar o rect / text na tela.fonte
Se você estiver criando o SVG programaticamente, poderá simplificá-lo e fazer algo assim:
fonte
dominant-baseline
etext-anchor
, nãodominantBaseline
etextAnchor
?Você pode usar diretamente a
text-anchor = "middle"
propriedade Aconselho a criar um elemento svg do wrapper sobre seu retângulo e texto. Dessa forma, você pode usar o elemento inteiro usando um seletor de css. Coloque as propriedades 'x' e 'y' do texto como 50%.fonte
Blog completo: http://blog.techhysahil.com/svg/how-to-center-text-in-svg-shapes/
fonte
alignment-baseline
não é o atributo certo para usar aqui. A resposta correta é usar uma combinação dedominant-baseline="central"
etext-anchor="middle"
:fonte
Uma maneira de inserir texto dentro de um retângulo é inserir um objeto estranho, que é um DIV, dentro de um objeto retângulo.
Dessa forma, o texto respeitará os limites do DIV.
fonte
Eu tive um tempo para conseguir algo centralizado usando SVG, então rolei minha própria função. espero que ajude você. Observe que ele funciona apenas para elementos SVG.
fonte
Para alinhamento horizontal e vertical de texto em gráficos, convém usar os seguintes estilos CSS. Em particular, observe que
dominant-baseline:middle
provavelmente está errado, já que este é (geralmente) a meio caminho entre a parte superior e a linha de base, e não a meio caminho entre a parte superior e a inferior. Além disso, algumas fontes (por exemplo, Mozilla ) usam emdominant-baseline:hanging
vez dedominant-baseline:text-before-edge
. Provavelmente, isso também está errado, poishanging
foi projetado para scripts Indic. Obviamente, se você estiver usando uma mistura de latim, índico, ideógrafo ou qualquer outra coisa, provavelmente precisará ler a documentação .Edit: Acabei de notar que o Mozilla também usa o
dominant-baseline:baseline
que está definitivamente errado: nem sequer é um valor reconhecido! Eu suponho que seja o padrão para a fonte padrão, que éalphabetic
que eles tiveram sorte.Mais edição: o Safari (11.1.2) entende,
text-before-edge
mas nãotext-after-edge
. Também falhaideographic
. Ótimas coisas, Apple. Portanto, você pode ser forçado a usaralphabetic
e permitir descendentes, afinal. Desculpe.fonte