Tengo el siguiente rectángulo ...
<rect x="0px" y="0px" width="60px" height="20px"/>
Me gustaría centrar la palabra "Ficción" dentro de ella. Para otros rectángulos, ¿la palabra svg se ajusta para permanecer dentro de ellos? Parece que no puedo encontrar nada específicamente sobre insertar texto dentro de formas que estén centradas tanto horizontal como verticalmente y con ajuste de texto. Además, el texto no puede salir del rectángulo.
Mirar el http://www.w3.org/TR/SVG/text.html#TextElement ejemplo no ayuda ya que los elementos de texto x e y son diferentes de los rectángulo x e y. No parece haber ancho y alto para los elementos de texto. No estoy seguro de las matemáticas aquí.
(Mi tabla html simplemente no va a funcionar).
Respuestas:
Una solución fácil para centrar texto horizontal y verticalmente en SVG:
Establezca la posición del texto en el centro absoluto del elemento en el que desea centrarlo:
x="50%" y ="50%"
.x
sería elx
de ese elemento + la mitad de su ancho (y similar paray
pero con la altura).Use la
text-anchor
propiedad para centrar el texto horizontalmente con el valormiddle
:Use la
dominant-baseline
propiedad para centrar el texto verticalmente con el valormiddle
(o dependiendo de cómo desee que se vea, es posible que desee hacerlocentral
)Aquí hay una demostración simple:
fuente
dominant-baseline
propiedad la que hace el trabajo, no laalignment-baseline
.<style type="text/css"><![CDATA[ text { alignment-baseline: middle; text-anchor:middle; } ]]></style>
. Gracias por la solucion.dominant-baseline
hecho, debe ser utilizado. Lo siento, pero esta respuesta es de alguna manera engañosa. Como no parece funcionar en Firefox ni en Chromium y además debe estudiar los comentarios para encontrar la solución correcta por su cuenta, me tomé la libertad de agregar otra respuesta con el código que funciona como se esperaba. (Para los registros: Probado con FF y Chromium en Ubuntu Linux.)alignment-baseline
, pero parece que puede ser una cosa peculiar debido a la revisión de las especificaciones, debe serdominant-baseline
detext
, yalignment-baseline
paratspan
,tref
,altGlyph
, ytextPath
. Actualicé la respuesta en consecuencia.SVG 1.2 Tiny agregó un ajuste de texto, pero la mayoría de las implementaciones de SVG que encontrará en el navegador (con la excepción de Opera) no han implementado esta función. Normalmente depende de usted, el desarrollador, posicionar el texto manualmente.
La especificación SVG 1.1 proporciona una buena visión general de esta limitación y las posibles soluciones para superarla:
http://www.w3.org/TR/SVG11/text.html#Introduction
Como primitivo, el ajuste de texto se puede simular usando el
dy
atributo y lostspan
elementos, y como se menciona en la especificación, algunas herramientas pueden automatizar esto. Por ejemplo, en Inkscape, seleccione la forma que desee y el texto que desee, y use Texto -> Flujo en marco. Esto le permitirá escribir su texto, con ajuste, que se ajustará según los límites de la forma. Además, asegúrese de seguir estas instrucciones para decirle a Inkscape que mantenga la compatibilidad con SVG 1.1: http://wiki.inkscape.org/wiki/index.php/FAQ#What_about_flowed_text.3FAdemás, hay algunas bibliotecas de JavaScript que se pueden usar para automatizar dinámicamente el ajuste de texto: http://www.carto.net/papers/svg/textFlow/
Es interesante observar la solución de CSVG para ajustar una forma a un elemento de texto (por ejemplo, ver su ejemplo de "botón"), aunque es importante mencionar que su implementación no se puede usar en un navegador: http://www.csse.monash.edu .au / ~ clm / csvg / about.html
Menciono esto porque he desarrollado una biblioteca inspirada en CSVG que le permite hacer cosas similares y funciona en navegadores web, aunque aún no la he lanzado.
fuente
editable="true"
al texto o al elemento textArea.Las respuestas anteriores dieron malos resultados al usar esquinas redondeadas o
stroke-width
eso es> 1. Por ejemplo, esperaría que el siguiente código produzca un rectángulo redondeado, pero elsvg
componente principal recorta las esquinas :En cambio, recomiendo envolver el
text
ensvg
ay luego anidar ese nuevosvg
y elrect
dentro de ung
elemento, como en el siguiente ejemplo:Esto soluciona el problema de recorte que se produce en las respuestas anteriores. También traduje el grupo rect / text usando el
transform="translate(x,y)"
atributo para demostrar que esto proporciona un enfoque más intuitivo para posicionar el rect / text en la pantalla.fuente
Si está creando el SVG mediante programación, puede simplificarlo y hacer algo como esto:
fuente
dominant-baseline
ytext-anchor
, nodominantBaseline
ytextAnchor
?Puede usar directamente la
text-anchor = "middle"
propiedad. Aconsejo crear un elemento de envoltura svg sobre su rectángulo y texto. De esa manera puede usar todo el elemento usando un selector css. Asegúrese de colocar la propiedad 'x' e 'y' del texto como 50%.fuente
Blog de detalles completos: http://blog.techhysahil.com/svg/how-to-center-text-in-svg-shapes/
fuente
alignment-baseline
no es el atributo correcto para usar aquí. La respuesta correcta es usar una combinación dedominant-baseline="central"
ytext-anchor="middle"
:fuente
Una forma de insertar texto dentro de un rectángulo es insertar un objeto extraño, que es un DIV, dentro de un objeto rectángulo.
De esta manera, el texto reflejará los límites de la DIV.
fuente
Me costó mucho centrarme en SVG, así que desarrollé mi propia pequeña función. espero que te ayude. Tenga en cuenta que solo funciona para elementos SVG.
fuente
Para la alineación horizontal y vertical del texto en gráficos, es posible que desee utilizar los siguientes estilos CSS. En particular, tenga en cuenta que
dominant-baseline:middle
probablemente sea incorrecto, ya que esto está (generalmente) a medio camino entre la parte superior y la línea de base, en lugar de a medio camino entre la parte superior y la parte inferior. Además, algunas fuentes (por ejemplo, Mozilla ) usan endominant-baseline:hanging
lugar dedominant-baseline:text-before-edge
. Esto probablemente también sea incorrecto, ya quehanging
está diseñado para scripts índicos. Por supuesto, si está utilizando una mezcla de latín, índico, ideógrafos o lo que sea, probablemente necesitará leer la documentación .Editar: Acabo de notar que Mozilla también usa lo
dominant-baseline:baseline
que definitivamente está mal: ¡ni siquiera es un valor reconocido! Supongo que está predeterminado en la fuente predeterminada, que esalphabetic
, por lo que tuvieron suerte.Más edición: Safari (11.1.2) entiende
text-before-edge
pero notext-after-edge
. También falla enideographic
. Grandes cosas, Apple. Por lo tanto, podría verse obligado a usaralphabetic
y permitir descendientes después de todo. Lo siento.fuente