#javascript #svg
#javascript #svg
Вопрос:
Я пытаюсь нарисовать пустые круги в качестве маркеров для строки в SVG. Проблема, с которой я сталкиваюсь, заключается в том, что я вижу строку внутри пустых кругов. Как я могу «стереть» это? Варианты, которые я рассмотрел:
- Сделайте строку короче и расположите маркеры «снаружи» строки. К сожалению, это плохо работает для моего сценария. У меня есть произвольные строки в качестве входных данных (может быть любой возможный элемент пути), и вычисление «более коротких» строк в общем случае довольно сложно.
- Я мог бы создать маску, которая в основном представляет собой ту же линию черного цвета и маркеры меньшего размера, которые будут использоваться в качестве «отверстий». Проблема с этим заключается в том, что мне в основном пришлось бы дублировать все линии в маске, и в случае, когда маркеры имеют более сложную форму, чем круг, это также становится довольно сложным.
Есть ли что-нибудь еще, что я мог бы попробовать?
<svg width="200" height="200">
<marker id="line-start" markerWidth="14" markerHeight="14" refX="14" refY="7" markerUnits="userSpaceOnUse" orient="auto-start-reverse" overflow="visible">
<circle fill="none" stroke="#666" cx="7" cy="7" r="7" />
</marker>
<path stroke="#666" marker-start="url(#line-start)" marker-end="url(#line-start)" stroke-width="2" d="M10,100 L 190,100" />
</svg>
Комментарии:
1. Почему бы вам просто не добавить заливку того же цвета, что и фон?
2. Потому что фоном может быть шаблон / изображение и т. Д
Ответ №1:
Проще всего добавить заливку того же цвета, что и фон. Но если у вас есть изображение или сложный градиентный фон, вы можете заменить его зеленым экраном. Используйте заливку на маркере 100% красным (или зеленым, или синим — независимо от того, что вы не используете в другом месте), а затем используйте фильтр, чтобы выбрать и удалить его.
<svg width="200px" height="200px">
<defs>
<filter id="empty" filterUnits="userSpaceOnUse" x="0" y="0" width="200" height="200">
<feColorMatrix type="matrix" values="1 0 0 0 0
0 0 0 0 0
0 0 0 0 0
1 -255 -255 1 0"/>
<feComposite operator="out" in="SourceGraphic"/>
</filter>
<marker id="line-start" markerWidth="14" markerHeight="14" refX="14" refY="7" markerUnits="userSpaceOnUse" >
<circle stroke="#666" cx="7" cy="7" r="7" fill="red"/>
</marker>
</defs>
<path filter="url(#empty)" stroke="#666" marker-start="url(#line-start)" marker-end="url(#line-start)" stroke-width="2" d="M50,100 L 180,100" />
</svg>
Комментарии:
1. Я получил общую идею, но почему в вашем примере все еще отображаются красные заполненные круги?
2. Какой браузер вы используете? Это отлично работает в последних версиях Chrome / Win и FF / Win
3. Chrome в Mac OS
4. Это вроде как работает в Firefox, но немного причудливо — вокруг границы есть похожие фрагменты красного цвета. Ну, в любом случае, на данный момент я выбрал простое решение для настройки сплошной заливки для маркеров, чтобы избежать этого.