svgPanZoom: только панорамирование с помощью средней кнопки мыши
Есть ли простой способ панорамирования только при нажатии средней кнопки мыши? Поведение по умолчанию - панорамирование любой нажатой кнопки мыши (или любых касаний).
beforepan
выглядело многообещающе, но вы получаете только старую и новую позицию, не зная, что вызвало панорамирование.
Я, вероятно, могу заставить его работать, используя customEventsHandler
но кажется, что для пары простых проверок требуется много дополнительной работы.
2 ответа
Решение
Прежде чем позвонить svgPanZoom
на элементе, вы можете связать событие mousedown и вызвать stopImmediatePropagation
,
document.getElementById('svg-id').onmousedown = function (e) {
if (e.button !== 1) e.stopImmediatePropagation();
}
svgPanZoom('#svg-id', {
zoomEnabled: true,
controlIconsEnabled: true,
fit: true,
center: true,
minZoom: 0.1
});
#container{
width: 300px; height: 300px; border:1px solid black;
}
<script src="https://ariutta.github.io/svg-pan-zoom/dist/svg-pan-zoom.js"></script>
<div id="container">
<svg id="svg-id" height="300px" xmlns="http://www.w3.org/2000/svg">
<g>
<g stroke="#000" fill="#FFF">
<rect x="10" y="10" width="120" height="120" fill="red"/>
<path d="M 10 10 L 130 130 Z"/>
</g>
</g>
</svg>
</div>
Нет, нет простого способа изменить события, которые обрабатывают панорамирование. У вас есть 2 решения:
- Измените исходный код и скомпилируйте свою собственную версию. Это должно быть просто, но имеет и обратную сторону: при каждом обновлении библиотеки вам придется перекомпилировать свою версию, если вы хотите последнюю версию. С другой стороны, версия 3 очень стабильна, и за последние два года изменились только незначительные вещи.
- использование
customEventsHandler
, Да, это не тривиально, но вы получаете преимущество, не меняя ядро. Это должно быть довольно просто, так как вы можете использоватьpanBy
и передавать только дельту между последней позицией мыши и текущей позицией мыши (без необходимости беспокоиться о текущем масштабе / масштабе SVG).