Lebar goresan tetap di SVG

103

Saya ingin dapat menyetel lebar goresan pada elemen SVG menjadi "peka-piksel", yang selalu lebar 1 piksel terlepas dari transformasi penskalaan saat ini yang diterapkan. Saya sadar bahwa ini mungkin tidak mungkin, karena inti dari SVG adalah tidak bergantung pada piksel.

Konteksnya sebagai berikut:

Saya memiliki elemen SVG dengan viewBox dan set atribut preservAspectRatio. Ini terlihat seperti ini

<svg version="1.1" baseProfile="full"
    viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet"
    xmlns="http://www.w3.org/2000/svg" >
</svg>

Ini berarti bahwa ketika saya menskalakan elemen itu, bentuk sebenarnya di dalamnya berskala sesuai (sejauh ini bagus).

Seperti yang Anda lihat, saya telah mengatur viewBox sehingga asalnya ada di tengah. Saya ingin menggambar sumbu x dan y di dalam elemen itu, yang saya lakukan sebagai berikut:

<line x1="-1000" x2="1000" y1="0" y2="0" />

Sekali lagi, ini berfungsi dengan baik. Idealnya, lebar sumbu ini selalu hanya 1 piksel. Saya tidak tertarik pada sumbu yang semakin gemuk ketika saya menskalakan elemen induk svg.

Jadi apakah saya kacau?

wxs
sumber

Jawaban:

128

Anda dapat menggunakan vector-effectproperti set ke non-scaling-stroke, lihat dokumen . Cara lain adalah dengan menggunakan transform(ref).

Itu akan bekerja di browser yang mendukung bagian-bagian itu dari SVG Tiny 1.2, misalnya Opera 10. Pengganti termasuk menulis skrip kecil untuk melakukan hal yang sama, pada dasarnya membalikkan CTM dan menerapkannya pada elemen yang seharusnya tidak diskalakan.

Jika Anda menginginkan garis yang lebih tajam, Anda juga dapat menonaktifkan antialiasing ( shape-rendering=optimizeSpeedatau shape-rendering=crispEdges) dan / atau bermain dengan pemosisian.

Erik Dahlström
sumber
1
Sayangnya ini ada di aplikasi XUL, dan itu sepertinya belum mendukung efek vektor. Baiklah.
wxs
1
Ini seharusnya muncul di Firefox 15 semuanya baik-baik saja sehingga Anda harus dapat menggunakannya setelah Anda membangun aplikasi XUL Anda di tokek 15.
Robert Longson
2
IE11 masih belum mendukung vector-effectproperti. Apakah mungkin untuk mencapai efek yang sama seperti vector-effect: non-scaling-strokedi IE11?
merlin
1
@merlin ya, dengan js dimungkinkan untuk meniru ini di IE.
Erik Dahlström
3
@merlin mengkloning elemen (mengatur fillke nonedan sebaliknya untuk stroke), menghitung & mengatur transformasi yang sesuai (satu untuk bagian isian dan satu untuk bagian goresan). Ini pasti akan sedikit berantakan, tetapi itu dia - Anda mungkin juga ingin meminta Microsoft menambahkan dukungan untuk itu. Bagaimanapun, saya pikir pertanyaan Anda layak menjadi pertanyaannya sendiri.
Erik Dahlström