Setelah 48 jam penelitian, saya akhirnya melakukan ini untuk mendapatkan penskalaan proporsional:
CATATAN: Sampel ini ditulis dengan React. Jika Anda tidak menggunakannya, ubah kembali kasing unta ke tanda hubung (yaitu: ubah backgroundColor
ke background-color
dan ubah Object
kembali ke a String
).
<div
style={{
backgroundColor: 'lightpink',
resize: 'horizontal',
overflow: 'hidden',
width: '1000px',
height: 'auto',
}}
>
<svg
width="100%"
viewBox="113 128 972 600"
preserveAspectRatio="xMidYMid meet"
>
<g> ... </g>
</svg>
</div>
Inilah yang terjadi dalam kode contoh di atas:
VIEWBOX
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/viewBox
min-x, min-y, lebar dan tinggi
yaitu: viewbox = "0 0 1000 1000"
Viewbox adalah atribut penting karena pada dasarnya memberitahu SVG apa ukuran untuk menggambar dan di mana. Jika Anda menggunakan CSS untuk membuat SVG 1000x1000 px tetapi kotak pandang Anda adalah 2000x2000, Anda akan melihat bagian kiri atas SVG Anda.
Dua angka pertama, min-x dan min-y, menentukan apakah SVG harus diimbangi di dalam viewbox.
SVG saya perlu bergeser ke atas / bawah atau kiri / kanan
Periksa ini: viewbox = "50 50 450 450"
Dua angka pertama akan menggeser SVG Anda ke kiri 50px dan naik 50px, dan dua angka kedua adalah ukuran kotak tampilan: 450x450 px. Jika SVG Anda berukuran 500x500 tetapi memiliki lapisan tambahan di atasnya, Anda dapat memanipulasi angka-angka itu untuk memindahkannya di dalam "kotak centang".
Tujuan Anda pada titik ini adalah mengubah salah satu dari angka-angka itu dan melihat apa yang terjadi.
Anda juga dapat sepenuhnya menghilangkan kotak view, tetapi milage Anda akan bervariasi tergantung pada setiap pengaturan lain yang Anda miliki saat itu. Dalam pengalaman saya, Anda akan menemukan masalah dengan mempertahankan rasio aspek karena kotak view membantu menentukan rasio aspek.
PRESERVE RASIO ASPEK
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/preserveAspectRatio
Berdasarkan penelitian saya, ada banyak pengaturan rasio aspek yang berbeda, tetapi yang standar disebut xMidYMid meet
. Saya menaruhnya di atas milik saya untuk secara eksplisit mengingatkan diri sendiri. xMidYMid meet
menjadikannya skala secara proporsional berdasarkan titik tengah X dan Y. Ini berarti ia tetap terpusat di viewbox.
LEBAR
MDN: https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/width
Lihatlah contoh kode saya di atas. Perhatikan bagaimana saya mengatur lebar saja, tidak tinggi. Saya mengaturnya menjadi 100% sehingga mengisi wadah tempatnya. Inilah yang mungkin berkontribusi paling banyak untuk menjawab pertanyaan Stack Overflow ini.
Anda dapat mengubahnya ke nilai piksel apa pun yang Anda inginkan, tetapi saya sarankan menggunakan 100% seperti yang saya lakukan untuk meledakkannya hingga ukuran maksimal dan kemudian mengontrolnya dengan CSS melalui wadah induk. Saya merekomendasikan ini karena Anda akan mendapatkan kontrol "tepat". Anda dapat menggunakan kueri media dan Anda dapat mengontrol ukuran tanpa JavaScript gila.
SKALA DENGAN CSS
Lihatlah contoh kode saya di atas lagi. Perhatikan bagaimana saya memiliki properti ini:
resize: 'horizontal', // you can safely omit this
overflow: 'hidden', // if you use resize, use this to fix weird scrollbar appearance
width: '1000px',
height: 'auto',
Ini tambahan, tetapi ini menunjukkan kepada Anda bagaimana memungkinkan pengguna untuk mengubah ukuran SVG sambil mempertahankan rasio aspek yang tepat. Karena SVG mempertahankan rasio aspeknya sendiri, Anda hanya perlu membuat lebar dapat diubah ukurannya pada wadah induk, dan itu akan mengubah ukuran sesuai keinginan.
Kami membiarkan tinggi sendirian dan / atau mengaturnya menjadi otomatis, dan kami mengontrol ukurannya dengan lebar. Saya memilih lebar karena seringkali lebih bermakna karena desain yang responsif.
Berikut adalah gambar dari pengaturan ini yang digunakan:
Jika Anda membaca setiap solusi dalam pertanyaan ini dan masih bingung atau tidak mengerti apa yang Anda butuhkan, lihat tautan ini di sini. Saya merasa sangat membantu:
https://css-tricks.com/scale-svg/
Ini adalah artikel yang sangat besar, tapi itu memecah hampir setiap cara yang mungkin untuk memanipulasi SVG, dengan atau tanpa CSS. Saya sarankan membacanya sambil santai minum kopi atau cairan pilihan Anda.