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-originatributo, 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 bottomy 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
idcoincidencias en el atributogetElementByIdy 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
matrixtransformación:Y aquí está en CSS:
fuente
parece que todos nos hemos perdido un truco aquí:
transform-box: fill-boxel uso
transform-box: fill-boxhará 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-boxno 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,cyytransform-originlos valores en JavaScript utilizando los mismos datos.¡PERO esto no funcionó en Firefox! Lo que tenía que hacer era envolver el
circleen lagetiqueta ytranslateusando la misma fórmula de posicionamiento desde arriba. Luego agregué elcircleen lagetiqueta y establecí sus valorescxycyen0. 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
circlelugar de.dot, para agregar eltransform: scale(2). Ni siquiera necesitaba usotransform-origin.NOTAS:
Estoy usando
d3-selection-multien el segundo ejemplo. Esto me permite pasar un objeto a en.attrslugar de repetir.attrpara 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.enabledpref en el firefoxabout:configpágina. Pero ... esa no parecía una solución adecuada. También encontré una discrepancia entretransform-origin: 50% 50%ytransform-origin: center center.