Muszę zmienić rozmiar i obrócić niektóre elementy w dokumencie SVG za pomocą javascript. Problem polega na tym, że domyślnie zawsze stosuje transformację wokół początku w (0, 0)
lewym górnym rogu.
Jak mogę ponownie zdefiniować ten punkt zakotwiczenia transformacji?
Próbowałem użyć transform-origin
atrybutu, ale na nic to nie wpływa.
Oto jak to zrobiłem:
svg.getDocumentById('someId').setAttribute('transform-origin', '75 240');
Nie wydaje się, aby ustawić punkt zwrotny w punkcie, który określiłem, chociaż widzę w przeglądarce Firefox, że atrybut jest poprawnie ustawiony. Próbowałem takich rzeczy, jak center bottom
iz 50% 100%
nawiasami lub bez. Jak dotąd nic nie działało.
Czy ktoś może pomóc?
svg
coordinate-transformation
CTheDark
źródło
źródło
Odpowiedzi:
Aby obrócić użyj
transform="rotate(deg, cx, cy)"
, gdzie deg jest stopniem, który chcesz obrócić, a (cx, cy) definiuje środek obrotu.Aby skalować / zmienić rozmiar, musisz przetłumaczyć przez (-cx, -cy), następnie skalować, a następnie przetłumaczyć z powrotem na (cx, cy). Możesz to zrobić za pomocą transformacji macierzowej :
Gdzie sx jest współczynnikiem skalowania na osi x, sy na osi y.
źródło
Jeśli możesz użyć stałej wartości (nie „wyśrodkuj” ani „50%”), możesz zamiast tego użyć CSS:
Niektóre przeglądarki (takie jak Firefox) nie obsługują poprawnie wartości względnych.
źródło
element.setAttribute('transform-origin', '25px 25px')
?Jeśli jesteś podobny do mnie i chcesz przesuwać, a następnie powiększać przy użyciu źródła transformacji, potrzebujesz trochę więcej.
Tutaj to działa: http://forresto.github.io/dataflow-prototyping/react/
źródło
id
mecze wgetElementById
oraz dokumentyid="..."
atrybut. Trudno wiedzieć na pewno bez zapoznania się z kodem. Jeśli nie chcesz publikować tego jako pytania SO, możesz spróbować utworzyć najprostszy przykład, używając nazw atrybutów, dopóki nie zadziała / nie znajdziesz problemu, a następnie dodaj resztę z powrotem.Do skalowania bez użycia
matrix
transformacji:A oto w CSS:
źródło
wygląda na to, że wszyscy przegapiliśmy tutaj sztuczkę:
transform-box: fill-box
użycie
transform-box: fill-box
spowoduje, że element w SVG będzie zachowywał się jak zwykły element HTML. Następnie możesz złożyć wniosektransform-origin: center
(lub coś innego) tak, jak zwykleto prawda,
transform-box: fill-box
nie ma potrzeby stosowania skomplikowanej matrycyźródło
transform-box: fill-box;
tobie możesz sprawić, że elementy svg szanują siętransform-origin
w rozsądny sposób / tak, jak można się spodziewać!Miałem podobny problem. Ale używałem D3 do pozycjonowania moich elementów i chciałem, aby transformacja i przejście były obsługiwane przez CSS. To był mój oryginalny kod, który otrzymałem pracując w Chrome 65:
Pozwoliło mi to ustawić wartości
cx
,cy
itransform-origin
w javascript przy użyciu tych samych danych.ALE to nie działało w Firefoksie! Co miałem robić zawinąć
circle
wg
znaczniku itranslate
że przy użyciu tego samego wzoru pozycjonowania z góry. Następnie dołączyłemcircle
wg
tagu i ustawiłem jegocx
icy
wartości na0
. Stamtądtransform: scale(2)
będzie skalowany od środka zgodnie z oczekiwaniami. Ostateczny kod wyglądał następująco.Po wprowadzeniu tej zmiany zmieniłem mój CSS, aby kierował się na
circle
zamiast.dot
, aby dodaćtransform: scale(2)
. Nawet nie potrzebowałem użyciatransform-origin
.UWAGI:
Używam
d3-selection-multi
w drugim przykładzie. To pozwala mi przekazać obiekt.attrs
zamiast powtarzać go.attr
dla każdego atrybutu.Korzystając z literału szablonu ciągu, należy pamiętać o podziałach wiersza, jak pokazano w pierwszym przykładzie. Spowoduje to wyświetlenie nowej linii w danych wyjściowych i może spowodować uszkodzenie kodu.
źródło
svg:transform-origin.enabled
pref w Firefoksaabout:config
stronie. Ale ... to nie wydawało się odpowiednim rozwiązaniem. Znalazłem również rozbieżność międzytransform-origin: 50% 50%
atransform-origin: center center
.