Chiều rộng nét cố định trong SVG


103

Tôi muốn có thể đặt chiều rộng nét vẽ trên một phần tử SVG là "pixel-nhận thức", luôn luôn có chiều rộng 1px bất kể các chuyển đổi tỷ lệ hiện tại được áp dụng. Tôi biết rằng điều này có thể là không thể, vì toàn bộ điểm của SVG là độc lập với pixel.

Bối cảnh như sau:

Tôi có một phần tử SVG với bộ thuộc tính viewBox và keepAspectRatio của nó. Nó trông giống như thế này

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

Điều này có nghĩa là khi tôi chia tỷ lệ phần tử đó, các hình dạng thực tế bên trong nó sẽ thay đổi tỷ lệ tương ứng (cho đến nay vẫn tốt).

Như bạn có thể thấy, tôi đã thiết lập viewBox để điểm gốc nằm ở trung tâm. Tôi muốn vẽ một trục x- và y bên trong phần tử đó, tôi làm như vậy:

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

Một lần nữa, điều này hoạt động tốt. Tuy nhiên, lý tưởng nhất là trục này sẽ luôn chỉ rộng 1px. Tôi không quan tâm đến việc các trục trở nên béo hơn khi tôi chia tỷ lệ phần tử svg mẹ.

Vậy tôi có bị làm sao không?

Câu trả lời:


128

Bạn có thể sử dụng bộ thuộc vector-effecttính để non-scaling-strokexem tài liệu . Một cách khác là sử dụng transform(ref).

Điều đó sẽ hoạt động trong các trình duyệt hỗ trợ các phần đó từ SVG Tiny 1.2, chẳng hạn như Opera 10. Dự phòng bao gồm việc viết một tập lệnh nhỏ để làm điều tương tự, về cơ bản là đảo ngược CTM và áp dụng nó trên các phần tử không nên mở rộng quy mô.

Nếu bạn muốn các đường nét hơn, bạn cũng có thể tắt khử răng cưa ( shape-rendering=optimizeSpeedhoặc shape-rendering=crispEdges) và / hoặc chơi với định vị.


1
Thật không may, điều này nằm trong một ứng dụng XUL và điều đó dường như chưa hỗ trợ hiệu ứng vectơ. Ồ tốt.
wxs

1
Tất cả điều này sẽ xuất hiện trong Firefox 15, vì vậy bạn sẽ có thể sử dụng nó khi bạn xây dựng ứng dụng XUL của mình trên gecko 15.
Robert Longson

2
IE11 vẫn không hỗ trợ thuộc vector-effecttính. Có thể đạt được hiệu quả như vector-effect: non-scaling-stroketrong IE11 không?
merlin

1
@merlin vâng, với js, bạn có thể mô phỏng điều này trong IE.
Erik Dahlström

3
@merlin sao chép phần tử (đặt fillthành nonevà ngược lại cho phần tử stroke), tính toán và đặt các biến đổi thích hợp (một cho phần tô màu và một cho phần nét vẽ). Chắc chắn là nó sẽ hơi lộn xộn, nhưng vẫn có - bạn cũng có thể muốn yêu cầu Microsoft thêm hỗ trợ cho nó. Trong mọi trường hợp, tôi nghĩ câu hỏi của bạn xứng đáng là một câu hỏi của riêng nó.
Erik Dahlström
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.