Правильное перекрытие конечного маркера на пути

Обновлено изображение, включая (c)

Я использую следующий код в Javascript для создания конечного маркера (треугольной стрелки), прикрепленного к строке:

edge.marker('end', 10, 10, function (add) {
add.path('M2,2 L2,11 L10,6 L2,2').fill('black');});

Приведенный выше код генерирует стрелку, которая выглядит как (a) на прикрепленном изображении. Однако маркер (треугольник) удлиняет линию. Я хотел бы создать стрелку, как показано на (b), с заостренным концом маркера, выровненным с концом линии (и не удлиняющим его). Также он должен иметь вид не треугольника, как в (а), а стрелки, как в (б).

Я пробовал несколько вариантов кода, показанного в описании, с разными значениями, но все они удлиняют строку, что нежелательно для создаваемого изображения.

Указан в описании.Изображение фактического (а) и желаемого (б) изображения

Возможно, вам придется использовать refX и refY для определения координат контрольной точки маркера. Если это не поможет, добавьте свой код

enxaneta 10.04.2019 18:02

@enxaneta, следующие значения атрибутов частично помогают решить проблему. Теперь я могу правильно выровнять наконечник стрелки, как показано на (c). Однако есть ли способ избавиться от основания стрелки, чтобы она отображалась как образец в (b)? edge.marker('end', 22, 13, function (add) { add.path('M2,2 L2,11 L10,6 L2,2').fill('none').stroke('black') ; }); См. рисунок в с.

Learner 10.04.2019 21:40

@Learner Чтобы стрелка отображалась правильно, как на картинке b, попробуйте добавить мои рекомендации в ответ ниже.

Alexandr_TT 10.04.2019 21:56

Попробуйте использовать это 'M2,10 L10,6 L2,2' вместо 'M2,2 L2,11 L10,6 L2,2'

enxaneta 10.04.2019 21:58

@enxaneta: Это сработало отлично. Спасибо. Я бы принял ваш ответ, но он отображается как комментарий и не дает мне возможности принять.

Learner 11.04.2019 18:23

Спасибо @Ученик. Я добавил ответ, в котором я использую несколько других полезных атрибутов для <marker> Надеюсь, вам будет интересно.

enxaneta 11.04.2019 19:54

FWIW, я считаю, что это будет работать только для горизонтальных линий, а не для путей в целом. refX и refY корректируются относительно конца пути; нет генерала refS который двигает маркер "назад/вперед" по кривой.

Rax Adaam 19.10.2021 15:25
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
7
232
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  • fill = "none" убираем черный цвет внутри стрелки..
  • добавить stroke = "black"
  • Чтобы линии не меняли свою толщину, вы также можете использовать атрибут pathvector-effect = "non-scaling-stroke"
Ответ принят как подходящий

Этот ответ является результатом нескольких комментариев, которыми я обменялся с ОП. Чтобы разместить маркер в нужном вам месте пути, вы можете использовать атрибуты refX и refY для определения координат опорной точки маркера.

svg{border:1px solid; width:45%}
path{fill:none; stroke:black; stroke-width:2}
<svg viewBox = "0 0 100 50">
  <marker id = "arrow" markerWidth = "12" markerHeight = "12" refX = "10" refY = "6" orient = "auto" markerUnits = "userSpaceOnUse"
 fill = "none" stroke = "black">
<path  d = "M2,10 L10,6 L2,2" />
</marker>
  <path d = "M20,25 H80"  marker-end = "url(#arrow)" />  
</svg>

Другие вопросы по теме