@itsowncordova
РЦР

Какие есть способы перемещения зажатием мыши svg изображения на js?

Голову ломаю на тем как увеличенное svg изображение можно двигать в браузере. Может какая функция есть или способ?
у меня тяжелая схема примерно как целая карта которую мне надо увеличивать и двигать
Вот что я наделал:
var leftArrow        = 37;	// The numeric code for the left arrow key.
    var upArrow          = 38;
    var rightArrow       = 39;
    var downArrow        = 40;
    var panRate          = 10;	// Number of pixels to pan per key press.    
    var zoomRate         = 1.1;	// Must be greater than 1. Increase this value for faster zooming (i.e., less granularity).
    var x;
    var y;
    /* Globals: */
    var theSvgElement;
    
    function processKeyPress(evt)
    {
      var viewBox = theSvgElement.getAttribute('viewBox');	// Grab the object representing the SVG element's viewBox attribute.
      var viewBoxValues = viewBox.split(' ');				// Create an array and insert each individual view box attribute value (assume they're seperated by a single whitespace character).

      viewBoxValues[0] = parseFloat(viewBoxValues[0]);		// Convert string "numeric" values to actual numeric values.
      viewBoxValues[1] = parseFloat(viewBoxValues[1]);
      
      switch (evt.keyCode)
      {
        case leftArrow:
          viewBoxValues[0] += panRate;	// Increase the x-coordinate value of the viewBox attribute to pan right.
          break;
        case rightArrow:
          viewBoxValues[0] -= panRate;	// Decrease the x-coordinate value of the viewBox attribute to pan left.
          break;
        case upArrow:
          viewBoxValues[1] += panRate;	// Increase the y-coordinate value of the viewBox attribute to pan down.
          break;
        case downArrow:
          viewBoxValues[1] -= panRate;	// Decrease the y-coordinate value of the viewBox attribute to pan up.      
          break;                         
      } // switch
      
      theSvgElement.setAttribute('viewBox', viewBoxValues.join(' '));	// Convert the viewBoxValues array into a string with a white space character between the given values.
    }
    function drag(evt) {
    ev.dataTransfer.setData('svg-id', evt.target.id);
}
    function zoom(zoomType)
    {
      var viewBox = theSvgElement.getAttribute('viewBox');	// Grab the object representing the SVG element's viewBox attribute.
      var viewBoxValues = viewBox.split(' ');				// Create an array and insert each individual view box attribute value (assume they're seperated by a single whitespace character).

      viewBoxValues[2] = parseFloat(viewBoxValues[2]);		// Convert string "numeric" values to actual numeric values.
      viewBoxValues[3] = parseFloat(viewBoxValues[3]);
      
      if (zoomType == 'zoomIn')
      {
        viewBoxValues[2] /= zoomRate;	// Decrease the width and height attributes of the viewBox attribute to zoom in.
        viewBoxValues[3] /= zoomRate;	
      }
      else if (zoomType == 'zoomOut')
      {
        viewBoxValues[2] *= zoomRate;	// Increase the width and height attributes of the viewBox attribute to zoom out.
        viewBoxValues[3] *= zoomRate;	
      }
      else
        alert("function zoom(zoomType) given invalid zoomType parameter.");
      
      theSvgElement.setAttribute('viewBox', viewBoxValues.join(' '));	// Convert the viewBoxValues array into a string with a white space character between the given values.
      
      var currentZoomFactor = svgViewBoxWidth / viewBoxValues[2];										// Calculates the current zoom factor, could have just as easily used svgViewBoxHeight.      
      var newText = document.createTextNode("Current zoom factor = " + currentZoomFactor.toFixed(3));	// Create a generic new text node object.
      var parentNode = document.getElementById('currentZoomFactorText');  								// Get the parent node of the text node we want to replace.
      
      parentNode.replaceChild(newText, parentNode.firstChild);  // Replace the first child text node with the new text object.
    }
        
    function zoomViaMouseWheel(mouseWheelEvent)
    {      
      if (mouseWheelEvent.wheelDelta > 0)
        zoom('zoomIn');
      else
        zoom('zoomOut');
        
      /* When the mouse is over the webpage, don't let the mouse wheel scroll the entire webpage: */
      mouseWheelEvent.cancelBubble = false;	
      return false;							
    } 
	
    function initialize()
    {        
      /* Add event listeners: */
      window.addEventListener('keydown', processKeyPress, true);		// OK to let the keydown event bubble.
      window.addEventListener('mousewheel', zoomViaMouseWheel, false);	// Don't let the mousewheel event bubble up to stop native browser window scrolling.
        	  
      /* Set a global variable and detect if the browser supports SVG: */
      theSvgElement = document.getElementById('svg-id');			// Best to only access the SVG element after the page has fully loaded.
     
	 document.addEventListener("drag", function( event ) {

  }, false);
  
      if(theSvgElement.namespaceURI != "http://www.w3.org/2000/svg")	// Alert the user if their browser does not support SVG.
        alert("Inline SVG in HTML5 is not supported. This document requires a browser that supports HTML5 inline SVG.");
            
      /* For the svg element, specifically set the viewBox attribute's width and height values in that one of them will be used to calculate the current scaling factor. */
      theSvgElement.setAttribute('viewBox', "0 0 " + svgViewBoxWidth + " " + svgViewBoxHeight);	
    }
  • Вопрос задан
  • 696 просмотров
Пригласить эксперта
Ответы на вопрос 2
webinar
@webinar
Учим yii: https://youtu.be/-WRMlGHLgRg
@anjiJa
Скорее называется pan and zoom.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы