Фиксированная ширина обводки в SVG
Я хотел бы иметь возможность установить ширину Штриха на элементе SVG, чтобы быть "пиксельным", то есть всегда быть шириной 1px независимо от текущих преобразований масштабирования. Я знаю, что это вполне может быть невозможно, так как весь смысл SVG должен быть независимым от пикселей.
контекст следующий:
у меня есть элемент SVG с набором атрибутов viewBox и preserveAspectRatio. Это выглядит примерно так
<svg version="1.1" baseProfile="full"
viewBox="-100 -100 200 200" preserveAspectRatio="xMidYMid meet"
xmlns="http://www.w3.org/2000/svg" >
</svg>
Это означает, что, когда я масштабируйте этот элемент, фактические формы внутри него масштабируются соответственно (до сих пор так хорошо).
Как вы можете видеть, я настроил окно просмотра так, что начало координат находится в центре. Я хотел бы нарисовать ось x и ось y внутри этого элемента, что я делаю так:
<line x1="-1000" x2="1000" y1="0" y2="0" />
опять же, это работает нормально. В идеале, однако, эта ось всегда будет только 1px шириной. У меня нет интереса к осям, которые становятся толще, когда я масштабирую родительский элемент svg.
Так я облажался?
1 ответ:
можно использовать
vector-effect
свойство имеет значениеnon-scaling-stroke
см. документы. Другой способ-использоватьtransform(ref)
.это будет работать в браузерах, которые поддерживают эти части из SVG Tiny 1.2, например Opera 10. Резервный вариант включает в себя написание небольшого сценария, чтобы сделать то же самое, в основном инвертируя CTM и применяя его к элементам, которые не должны масштабироваться.
если вы хотите более резкие линии вы также можете отключить антиалиасинг (
shape-rendering=optimizeSpeed
илиshape-rendering=crispEdges
) и/или играть с позиционированием.