javascript移动端实现企业图谱

288 阅读4分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

心理对抗阶段

  • 由于公司内部调整,要求pc和手机按照业务线打通,所以开始接手企业库的手机端开发 。之前对移动端开发接触比较少,而且是一个开发了很久的项目,代码量已经蛮大的了,被产品的需求推动着接手,一下子还是有点吃不消的。
  • 该来的还是会来,整个项目组就剩下我一个前端,经过一系列的努力抗争,还是只能赶鸭子上架,硬着头皮往前冲。

直面困难

  • 困难从来都是用来克服的,其实只要是能够排出时间,我还是很乐意接受挑战的,况且移动端也是我一直想找机会涉足的方向,刚好是挑战也是机会。接下来就只能撸起袖子加油干了。

干就完了

在泥潭的边缘谨慎试探

  • 开始阅读前辈留下来的手机端项目源码,用的是vue框架,看到的感觉是熟悉而陌生,熟悉是虽然pc端的企业库是jq写的,但我之前常用vue,算是本命框架了,陌生的是对vue在移动端的整个生态系统还是陌生的。而且对vue多页面的开发也不是太熟,所以一开始评估任务工作量的时候仅仅是想着把pc的项目迁移到移动端,并没有阅读手机的代码,也没有充分考虑兼容性等问题,然后导致现在jq项目要在vue里面调用,一脸懵逼~

饭要吃,需求也要做

  • 问题比较清晰明确了,那就去找解决方案。 image.png serch一下,有类似开发需求的人肯定是大有人在。这两个方案都是可行的,我选择的是上面那个,考虑到整个js还是挺大的,import进去会明显增大原来js包的体积,js可以并发请求(6个),不太会造成页面堵塞,js标签引入个人感觉纯净一些。
  • 需要注意
  1. 既然原始图谱的项目是基于jquery的,必定是要在引入之前先引入jquery。
  2. 需要将整个项目封装成一个方法,并挂载到全局window上,供vue项目调用。
  3. 同时,原图谱项目是基于es6的面向对象写法,也需要借助webpack等工具打包并babel编译成向下兼容es5的写法。

山的后面是什么?--另一座山

  • 解决完代码引用问题,图谱可以在手机项目里面跑起来了,在chrome手机模式下根据ui调整样式,一切显得平淡而美好。 于是乎上传到服务器上,在真机上试试看。 纳尼? pc上的拖动事件和缩放事件统统失效了。
  • 拖动和缩放用的是d3js提供的zoom这个Api,zoom本身有start\zoom\end,分别对应原生事件的mousedown\mousemove\mouseup(touchStart/touchmove/touchend);但是手机上用的双指缩放,不是鼠标滚轮,这个就不知道如何处理了,查看了下官方给出的api文档:

image.png 这个multiple应该就是双指缩放事件,但是直接写multiple是报错的, 官方解释只是说 “双击和双击启动一个转换,它会发出开始、缩放和结束事件。” 但是这完全不知道该如何书写呀。看来D3的文档被社区吐槽也是有原因的~

  • 网上search无果,最终只能选择原生事件撸起来,

原理就是当触发touchstart时候,检测当前触摸点是否大于1, event.touches.length == 1 即为拖动开始 event.touches.length >= 2 即为双指缩放开始 然后touchmove的时候再同样判断一次,如果是拖动则根据move的位置和start时候的位置计算出滑动距离,用transform进行偏移; 如果是双指, point0 = event.touches[0] 与point1 = event.touches[1]两个坐标点,用勾股定理计算一下手指间距,start的间距与move时候的间距差M,从而得知手指是张开还是收缩的动作,然后自定义一个缩放步伐,即每触发一次缩放的比例,也可以选择用用户手指的动作幅度(M),来决定缩放比例。

如果有人对上面提到的d3-zoom的multiple的具体用法熟悉,可以留言分享一下。十分感谢。

写在最后

本篇文章是从我自己的cnblog搬运过来的原创文章。有疑问欢迎大家在评论区交流。看完别忘记点个⭐️支持一下哦~