svg平移縮放

svg平移縮放,我剛開(kāi)始嘗試的是自己處理外層容器的控制,結(jié)果發(fā)現(xiàn)能用,但是效果不太好,有拖尾現(xiàn)象,后來(lái)用個(gè)js庫(kù)svg-pan-zoom即可。如果想支持手機(jī)端手勢(shì)操作,需要先安裝Hammer.js。

這里簡(jiǎn)單示范下核心代碼,首先下載并在index.html添加相應(yīng)的js文件:

  <script src="assets/libs/svg-map/js/lib/hammer.min.js"></script>
  <script src="assets/libs/svg-map/js/lib/svg-pan-zoom.min.js"></script>

html中有這樣一個(gè)svg標(biāo)簽:

<svg id="svggroup"><svg>

然后實(shí)現(xiàn)方法:查找該id元素并調(diào)用svgPanZoom初始化,最后在頁(yè)面加載后調(diào)用此方法即可:

initZoomPan(){
    const eventsHandler = {
      haltEventListeners: ['touchstart', 'touchend', 'touchmove', 'touchleave', 'touchcancel']
    , init: function(options) {
        var instance = options.instance
          , initialScale = 1
          , pannedX = 0
          , pannedY = 0
        // Init Hammer
        // Listen only for pointer and touch events
        this.hammer = Hammer(options.svgElement, {
          inputClass: Hammer.SUPPORT_POINTER_EVENTS ? Hammer.PointerEventInput : Hammer.TouchInput
        })
        // Enable pinch
        this.hammer.get('pinch').set({enable: true})
        // Handle double tap
        this.hammer.on('doubletap', function(ev){
          instance.zoomIn()
        })
        // Handle pan
        this.hammer.on('panstart panmove', function(ev){
          // On pan start reset panned variables
          if (ev.type === 'panstart') {
            pannedX = 0
            pannedY = 0
          }
          // Pan only the difference
          instance.panBy({x: ev.deltaX - pannedX, y: ev.deltaY - pannedY})
          pannedX = ev.deltaX
          pannedY = ev.deltaY
        })
        // Handle pinch
        this.hammer.on('pinchstart pinchmove', function(ev){
          // On pinch start remember initial zoom
          if (ev.type === 'pinchstart') {
            initialScale = instance.getZoom()
            instance.zoom(initialScale * ev.scale)
          }
          instance.zoom(initialScale * ev.scale)
        })
        // Prevent moving the page on some devices when panning over SVG
        options.svgElement.addEventListener('touchmove', function(e){ e.preventDefault(); });
      }
    , destroy: function(){
        this.hammer.destroy()
      }
    }
    const element = document.querySelector('#svggroup');
    svgPanZoom(element, {
      zoomEnabled: true,
      controlIconsEnabled: true,
      dblClickZoomEnabled: false,
      fit: 1,
      center: 1, 
      customEventsHandler: eventsHandler
    });
  }

注:至此其實(shí)已經(jīng)完工了的,但貌似有個(gè)bug——配置選項(xiàng)有個(gè)參數(shù)controlIconsEnabled: false用于控制工具欄是否顯示的,而我用時(shí)發(fā)現(xiàn)無(wú)效果,所以做了額外處理:

let a = document.getElementById('svg-pan-zoom-controls');
if(a){
   a.remove();
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明AI閱讀 16,205評(píng)論 3 119
  • 學(xué)會(huì)使用CSS選擇器熟記CSS樣式和外觀屬性熟練掌握CSS各種選擇器熟練掌握CSS各種選擇器熟練掌握CSS三種顯示...
    七彩小鹿閱讀 6,445評(píng)論 2 66
  • 看到身邊的姑娘一個(gè)個(gè)都談了戀愛(ài) 他們眼里的甜蜜一點(diǎn)點(diǎn)閃耀了我的眼 你啊怎么還不來(lái)
    擁有回憶的女孩閱讀 362評(píng)論 9 3
  • 今天早上,聽(tīng)著兒子對(duì)我說(shuō)話(huà)的語(yǔ)氣和內(nèi)容越來(lái)越像先生。當(dāng)下看到,我是一切的根源。我怎么對(duì)先生在兒子身上都能體...
    沈玲琴閱讀 240評(píng)論 1 2
  • 我對(duì)你的喜歡像金坷垃 不流失不蒸發(fā) 能吸收兩米下氮磷鉀 思念畝產(chǎn)一千八
    雨棚山茶閱讀 475評(píng)論 0 0

友情鏈接更多精彩內(nèi)容