Necesito cambiar el tamaño y rotar ciertos elementos en un documento SVG usando javascript. El problema es que, por defecto, siempre aplica la transformación alrededor del origen en la (0, 0)
parte superior izquierda.
¿Cómo puedo volver a definir este punto de ancla de transformación?
Intenté usar el transform-origin
atributo, pero no afecta nada.
Así es como lo hice:
svg.getDocumentById('someId').setAttribute('transform-origin', '75 240');
No parece establecer el punto de pivote en el punto que especifiqué, aunque puedo ver en Firefox que el atributo está configurado correctamente. Probé cosas como center bottom
y 50% 100%
con y sin paréntesis. Nada funcionó hasta ahora.
¿Alguien puede ayudar?
svg
coordinate-transformation
CTheDark
fuente
fuente
Respuestas:
Para rotar use
transform="rotate(deg, cx, cy)"
, donde deg es el grado que desea rotar y (cx, cy) define el centro de rotación.Para escalar / cambiar el tamaño, debe traducir por (-cx, -cy), luego escalar y luego traducir de nuevo a (cx, cy). Puede hacer esto con una transformación de matriz :
Donde sx es el factor de escala en el eje x, sy en el eje y.
fuente
Si puede usar un valor fijo (no "centro" o "50%"), puede usar CSS en su lugar:
Algunos navegadores (como Firefox) no manejarán los valores relativos correctamente.
fuente
element.setAttribute('transform-origin', '25px 25px')
?Si eres como yo y quieres desplazarte y luego hacer zoom con transform-origin, necesitarás un poco más.
Aquí está funcionando: http://forresto.github.io/dataflow-prototyping/react/
fuente
id
coincidencias en el atributogetElementById
y los documentosid="..."
. Es difícil saberlo con certeza sin ver el código. Si no desea publicarlo como una pregunta SO, puede intentar crear el ejemplo más simple usando los nombres de sus atributos hasta que funcione / encuentre el problema, luego agregue el resto nuevamente.Para escalar sin tener que usar la
matrix
transformación:Y aquí está en CSS:
fuente
parece que todos nos hemos perdido un truco aquí:
transform-box: fill-box
el uso
transform-box: fill-box
hará que un elemento dentro de un SVG se comporte como un elemento HTML normal. Luego puede aplicartransform-origin: center
(o algo más) como lo haría normalmenteeso es correcto,
transform-box: fill-box
no hay necesidad de cosas complicadas de matrizfuente
Tuve un problema similar. Pero estaba usando D3 para colocar mis elementos y quería que la transformación y la transición fueran manejadas por CSS. Este era mi código original, que conseguí trabajar en Chrome 65:
Esto permitió que fije las
cx
,cy
ytransform-origin
los valores en JavaScript utilizando los mismos datos.¡PERO esto no funcionó en Firefox! Lo que tenía que hacer era envolver el
circle
en lag
etiqueta ytranslate
usando la misma fórmula de posicionamiento desde arriba. Luego agregué elcircle
en lag
etiqueta y establecí sus valorescx
ycy
en0
. A partir de ahí,transform: scale(2)
escalaría desde el centro como se esperaba. El código final se ve así.Después de realizar este cambio, cambié mi CSS para apuntar al en
circle
lugar de.dot
, para agregar eltransform: scale(2)
. Ni siquiera necesitaba usotransform-origin
.NOTAS:
Estoy usando
d3-selection-multi
en el segundo ejemplo. Esto me permite pasar un objeto a en.attrs
lugar de repetir.attr
para cada atributo.Cuando utilice un literal de plantilla de cadena, tenga en cuenta los saltos de línea como se ilustra en el primer ejemplo. Esto incluirá una nueva línea en la salida y puede romper su código.
fuente
svg:transform-origin.enabled
pref en el firefoxabout:config
página. Pero ... esa no parecía una solución adecuada. También encontré una discrepancia entretransform-origin: 50% 50%
ytransform-origin: center center
.