svg平移缩放

svg平移缩放,我刚开始尝试的是自己处理外层容器的控制,结果发现能用,但是效果不太好,有拖尾现象,后来用个js库svg-pan-zoom即可。如果想支持手机端手势操作,需要先安装Hammer.js。

这里简单示范下核心代码,首先下载并在index.html添加相应的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中有这样一个svg标签:

<svg id="svggroup"><svg>

然后实现方法:查找该id元素并调用svgPanZoom初始化,最后在页面加载后调用此方法即可:

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
    });
  }

注:至此其实已经完工了的,但貌似有个bug——配置选项有个参数controlIconsEnabled: false用于控制工具栏是否显示的,而我用时发现无效果,所以做了额外处理:

let a = document.getElementById('svg-pan-zoom-controls');
if(a){
   a.remove();
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,053评论 3 119
  • 学会使用CSS选择器熟记CSS样式和外观属性熟练掌握CSS各种选择器熟练掌握CSS各种选择器熟练掌握CSS三种显示...
    七彩小鹿阅读 11,437评论 2 66
  • 看到身边的姑娘一个个都谈了恋爱 他们眼里的甜蜜一点点闪耀了我的眼 你啊怎么还不来
    拥有回忆的女孩阅读 2,571评论 9 3
  • 今天早上,听着儿子对我说话的语气和内容越来越像先生。当下看到,我是一切的根源。我怎么对先生在儿子身上都能体...
    沈玲琴阅读 1,504评论 1 2
  • 我对你的喜欢像金坷垃 不流失不蒸发 能吸收两米下氮磷钾 思念亩产一千八
    雨棚山茶阅读 3,134评论 0 0

友情链接更多精彩内容