Saya perlu mengubah ukuran dan memutar elemen tertentu dalam dokumen SVG menggunakan javascript. Masalahnya adalah, secara default, itu selalu menerapkan transformasi di sekitar asal di (0, 0)
- kiri atas.
Bagaimana saya bisa mendefinisikan ulang titik jangkar transformasi ini?
Saya mencoba menggunakan transform-origin
atribut, tetapi tidak mempengaruhi apa pun.
Beginilah cara saya melakukannya:
svg.getDocumentById('someId').setAttribute('transform-origin', '75 240');
Tampaknya tidak menetapkan titik penting ke titik yang saya tentukan meskipun saya dapat melihat di Firefox bahwa atributnya disetel dengan benar. Saya mencoba hal-hal seperti center bottom
dan 50% 100%
dengan dan tanpa tanda kurung. Sejauh ini tidak ada yang berhasil.
Adakah yang bisa membantu?
svg
coordinate-transformation
CTheDark
sumber
sumber
Jawaban:
Untuk memutar gunakan
transform="rotate(deg, cx, cy)"
, di mana deg adalah derajat yang ingin Anda putar dan (cx, cy) tentukan pusat rotasi.Untuk penskalaan / pengubahan ukuran, Anda harus menerjemahkan dengan (-cx, -cy), lalu menskalakan dan kemudian menerjemahkan kembali ke (cx, cy). Anda dapat melakukan ini dengan transformasi matriks :
Di mana sx adalah faktor skala di sumbu x, sy di sumbu y.
sumber
Jika Anda dapat menggunakan nilai tetap (bukan "center" atau "50%"), Anda dapat menggunakan CSS sebagai gantinya:
Beberapa browser (seperti Firefox) tidak akan menangani nilai relatif dengan benar.
sumber
element.setAttribute('transform-origin', '25px 25px')
?Jika Anda seperti saya dan ingin menggeser lalu memperbesar dengan transformasi asal, Anda memerlukan lebih banyak.
Ini dia bekerja: http://forresto.github.io/dataflow-prototyping/react/
sumber
id
kecocokan dalam atributgetElementById
dan dokumenid="..."
. Sulit untuk mengetahui secara pasti tanpa melihat kodenya. Jika Anda tidak ingin mempostingnya sebagai pertanyaan SO, Anda dapat mencoba membuat contoh paling sederhana menggunakan nama atribut Anda sampai berfungsi / Anda menemukan masalah, lalu tambahkan sisanya kembali.Untuk penskalaan tanpa harus menggunakan
matrix
transformasi:Dan ini dia di CSS:
sumber
sepertinya kita semua melewatkan satu trik di sini:
transform-box: fill-box
menggunakan
transform-box: fill-box
akan membuat elemen dalam SVG berperilaku sebagai elemen HTML biasa. Kemudian Anda dapat melamartransform-origin: center
(atau yang lain) seperti biasaitu benar,
transform-box: fill-box
tidak perlu barang matriks yang rumitsumber
transform-box: fill-box;
Anda dapat membuat elemen svg menghormatitransform-origin
dengan cara yang waras / seperti yang Anda harapkan!Saya memiliki masalah serupa. Tapi saya menggunakan D3 untuk memposisikan elemen saya, dan ingin transformasi dan transisi ditangani oleh CSS. Ini adalah kode asli saya, yang saya kerjakan di Chrome 65:
Hal ini memungkinkan saya untuk mengatur
cx
,cy
dantransform-origin
nilai-nilai dalam javascript menggunakan data yang sama.TAPI ini tidak berhasil di Firefox! Apa yang harus saya lakukan adalah membungkus
circle
dig
tag dantranslate
menggunakan rumus posisi yang sama dari atas. Saya kemudian menambahkancircle
dig
tag, dan mengaturcx
dancy
nilainya ke0
. Dari sana,transform: scale(2)
akan skala dari pusat seperti yang diharapkan. Kode terakhir terlihat seperti ini.Setelah melakukan perubahan ini, saya mengubah CSS saya untuk menargetkan
circle
alih - alih.dot
, untuk menambahkantransform: scale(2)
. Saya bahkan tidak perlu menggunakantransform-origin
.CATATAN:
Saya menggunakan
d3-selection-multi
contoh kedua. Hal ini memungkinkan saya untuk meneruskan objek.attrs
daripada mengulang.attr
untuk setiap atribut.Saat menggunakan literal template string, perhatikan baris baru seperti yang diilustrasikan dalam contoh pertama. Ini akan menyertakan baris baru dalam output dan dapat merusak kode Anda.
sumber
svg:transform-origin.enabled
pref di firefox iniabout:config
halaman. Tapi ... sepertinya itu bukan solusi yang memadai. Saya juga menemukan perbedaan antaratransform-origin: 50% 50%
dantransform-origin: center center
.