簡體   English   中英

svg-pan-zoom平移/縮放到任何對象

[英]svg-pan-zoom pan/zoom to any object

我正在使用svg-pan-zoom代碼https://github.com/ariutta/svg-pan-zoom制作某種svg地圖,現在是時候添加用於平移和縮放藝術的功能了點擊事件中svg的組件。 但是,我不確定如何使用panBy()函數獲取所需的svg藝術作品:我嘗試在要平移的組上使用getBBox()並將其與panZoomInstance.getPan一起使用()和getSizes()信息,但我的實驗無法完成。 我想完成與示例相同的動畫之王( http://ariutta.github.io/svg-pan-zoom/demo/simple-animation.html ),但將視口居中放置在該項目上。

千方百計,我能夠弄清楚這部分!

function customPanByZoomAtEnd(amount, endZoomLevel, animationTime){ // {x: 1, y: 2}
  if(typeof animationTime == "undefined"){
      animationTime =   300; // ms
  }
  var animationStepTime = 15 // one frame per 30 ms
    , animationSteps = animationTime / animationStepTime
    , animationStep = 0
    , intervalID = null
    , stepX = amount.x / animationSteps
    , stepY = amount.y / animationSteps;

  intervalID = setInterval(function(){
    if (animationStep++ < animationSteps) {
      panZoomInstance.panBy({x: stepX, y: stepY})
    } else {
      // Cancel interval
      if(typeof endZoomLevel != "undefined"){
        var viewPort = $(".svg-pan-zoom_viewport")[0];
        viewPort.style.transition = "all " + animationTime / 1000 + "s ease";
        panZoomInstance.zoom(endZoomLevel);
        setTimeout(function(){
            viewPort.style.transition = "none";
            $("svg")[0].style.pointerEvents = "all"; // re-enable the pointer events after auto-panning/zooming.
                    panZoomInstance.enablePan();
                    panZoomInstance.enableZoom();
                    panZoomInstance.enableControlIcons();
                    panZoomInstance.enableDblClickZoom();
                    panZoomInstance.enableMouseWheelZoom();
        }, animationTime + 50);
      }
      clearInterval(intervalID)
    }
  }, animationStepTime)
}

function panToElem(targetElem) {

    var initialSizes = panZoomInstance.getSizes();
    var initialLoc = panZoomInstance.getPan();
    var initialBounds = targetElem.getBoundingClientRect();
    var initialZoom = panZoomInstance.getZoom();
    var initialCX = initialBounds.x + (initialBounds.width / 2);
    var initialCY = initialBounds.y + (initialBounds.height / 2);

    var dX = (initialSizes.width / 2) - initialCX;
    var dY = (initialSizes.height / 2) - initialCY;

  customPanByZoomAtEnd({x: dX, y: dY}, 2, 700);
}

關鍵在於計算panZoomInstance.getSizes()中的視口寬度和高度的中心與目標元素的客戶端邊界矩形的中心之間的差。

現在,問題是嘗試制作動畫縮放。 現在,我已經在平移動畫的末尾使用命令將其縮放到指定位置,並設置了一些CSS以使縮放平滑過渡。 一段時間后,css將被刪除,因此正常的縮放和平移不受影響。 在我嘗試使縮放成為步進動畫時,它總是看起來會超出預期的最大點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM