Eu preciso redimensionar e girar certos elementos no documento SVG usando javascript. O problema é que, por padrão, ele sempre aplica a transformação em torno da origem em(0, 0)
canto superior esquerdo.
Como posso redefinir este ponto de ancoragem de transformação?
Tentei usar o transform-origin
atributo, mas não afetou nada.
Foi assim que eu fiz:
svg.getDocumentById('someId').setAttribute('transform-origin', '75 240');
Não parece definir o ponto principal para o ponto que especifiquei, embora possa ver no Firefox que o atributo está definido corretamente. Tentei coisas como center bottom
e 50% 100%
com e sem parênteses. Nada funcionou até agora.
Alguém pode ajudar?
svg
coordinate-transformation
CTheDark
fonte
fonte
Respostas:
Para girar
transform="rotate(deg, cx, cy)"
, use , onde deg é o grau que você deseja girar e (cx, cy) define o centro de rotação.Para dimensionar / redimensionar, você deve traduzir por (-cx, -cy), então dimensionar e então traduzir de volta para (cx, cy). Você pode fazer isso com uma transformação de matriz :
Onde sx é o fator de escala no eixo x, sy no eixo y.
fonte
Se você pode usar um valor fixo (não "center" ou "50%"), você pode usar CSS em seu lugar:
Alguns navegadores (como o Firefox) não lidam com valores relativos corretamente.
fonte
element.setAttribute('transform-origin', '25px 25px')
?Se você é como eu e deseja aplicar panorâmica e zoom com transform-origin, precisará de um pouco mais.
Aqui está ele funcionando: http://forresto.github.io/dataflow-prototyping/react/
fonte
id
correspondências no atributogetElementById
e noid="..."
atributo dos documentos . É difícil saber com certeza sem ver o código. Se você não quiser postá-la como uma pergunta SO, você pode tentar criar o exemplo mais simples usando seus nomes de atributos até que funcione / você encontre o problema, então adicione o resto de volta.Para escalar sem ter que usar a
matrix
transformação:E aqui está em CSS:
fonte
parece que todos nós perdemos um truque aqui:
transform-box: fill-box
usar
transform-box: fill-box
fará com que um elemento em um SVG se comporte como um elemento HTML normal. Em seguida, você pode aplicartransform-origin: center
(ou outra coisa) como faria normalmenteisso mesmo,
transform-box: fill-box
não há necessidade de nenhum material complicado de matrizfonte
Eu tive uma questão semelhante. Mas eu estava usando o D3 para posicionar meus elementos e queria que a transformação e a transição fossem feitas por CSS. Este era meu código original, que comecei a trabalhar no Chrome 65:
Isso me permitiu definir as
cx
,cy
etransform-origin
valores em JavaScript usando os mesmos dados.MAS isso não funcionou no Firefox! O que eu tive que fazer foi embrulhar o
circle
nag
tag etranslate
usando a mesma fórmula de posicionamento de cima. Em seguida, anexei ocircle
nag
tag e defini seus valorescx
ecy
como0
. A partir daí,transform: scale(2)
escalaria do centro conforme o esperado. O código final ficou assim.Depois de fazer essa alteração, mudei meu CSS para direcionar o em
circle
vez de.dot
, para adicionar otransform: scale(2)
. Eu nem precisei usartransform-origin
.NOTAS:
Estou usando
d3-selection-multi
no segundo exemplo. Isso me permite passar um objeto para, em.attrs
vez de repetir.attr
para cada atributo.Ao usar um literal de modelo de string, esteja ciente das quebras de linha, conforme ilustrado no primeiro exemplo. Isso incluirá uma nova linha na saída e pode quebrar seu código.
fonte
svg:transform-origin.enabled
pref na do firefoxabout:config
página. Mas ... isso não parecia uma solução adequada. Também encontrei uma discrepância entretransform-origin: 50% 50%
etransform-origin: center center
.