Фіксована ширина ходу в SVG


103

Я хотів би мати можливість встановити ширину ходу на SVG-елементі таким чином, щоб він був "піксельним", тобто завжди був шириною 1 піксель, незалежно від застосовуваних поточних трансформацій масштабування. Я знаю, що це може бути неможливим, оскільки вся суть SVG полягає в тому, щоб піксель був незалежним.

Контекст наступний:

У мене є елемент SVG з набором атрибутів viewBox та збереженняАспектРаціо. Це виглядає приблизно так

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

Це означає, що коли я масштабую цей елемент, фактичні форми всередині нього відповідно масштабуються (поки що добре).

Як бачите, я встановив viewBox так, що походження знаходиться в центрі. Я хотів би намалювати вісь x- і y всередині цього елемента, що я роблю таким чином:

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

Знову ж таки, це прекрасно працює. В ідеалі, однак, ця вісь завжди була б лише 1 пікс. У мене немає інтересу до того, що оси стають товстішими, коли я масштабую батьківський елемент svg.

Так я накручений?

Відповіді:


128

Ви можете скористатися vector-effectвластивістю, встановленою для non-scaling-stroke, переглянути документи . Інший спосіб - використання transform(ref).

Це буде працювати в браузерах, які підтримують ці частини від SVG Tiny 1.2, наприклад, Opera 10. Резервна копія включає в себе написання невеликого сценарію, щоб зробити те саме, в основному інвертуючи CTM і застосовуючи його до елементів, які не повинні змінювати масштаб.

Якщо ви хочете більш чіткі лінії, ви також можете вимкнути антиалізинг ( shape-rendering=optimizeSpeedабо shape-rendering=crispEdges) та / або грати з позиціонуванням.


1
На жаль, це є у додатку XUL, і, схоже, це ще не підтримує векторний ефект. Що ж, добре.
wxs

1
Це має з’явитися у Firefox 15, все добре, тому ви зможете користуватися ним, коли ви збираєте додаток XUL на
гекконі

2
IE11 досі не підтримує vector-effectвластивість. Чи можна досягти такого ж ефекту, як vector-effect: non-scaling-strokeу IE11?
merlin

1
@merlin так, за допомогою js можна наслідувати це в IE.
Erik Dahlström

3
@merlin клон елемент (настройка fillв noneі навпаки для stroke), обчислити і встановити відповідні перетворення (один для заповнення частини і один для ходу частини). Напевно, це буде трохи безладно, але там - ви також можете попросити Microsoft додати підтримку. У будь-якому випадку, я думаю, що ваше питання заслуговує на те, щоб воно було власне.
Erik Dahlström
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.