• leaderlinevue移动svg(指示线元素)到另外一个容器中(定位基准)


    leader-line-vue移动svg(指示线元素)到另外一个容器中(定位基准)

    image
    image

    leader-line 绘制的svg指示线是利用相对于 body 的 absolute 定位。而在移动端给body的布局高度为 height:100%,页面是在body局部滚动的,所以指示线的位置相对body始终是固定的,在屏幕上看起来也就是固定不变的。leader-line 绘制的svg指示线是利用相对于 body 的 absolute 定位。而在移动端给body的布局高度为 height:100%,页面是在body局部滚动的,所以指示线的位置相对body始终是固定的,在屏幕上看起来也就是固定不变的。

    点击查看代码
    <template>
      <div class="HelloWorld">
        <div id="frame">
          <div id="container">
            <div id="terminal-1" class="terminal"></div>
            <div id="terminal-2" class="terminal"></div>
            <div id="terminal-3" class="terminal"></div>
          </div>
        </div>
    
        <svg version="1.1" id="svg-clip">
          <defs>
            <rect id="clip-rect" />
            <clipPath id="clip-1">
              <use xlink:href="#clip-rect" />
            </clipPath>
            <clipPath id="clip-2">
              <use xlink:href="#clip-rect" />
            </clipPath>
          </defs>
        </svg>
      </div>
    </template>
    <script>
    import LeaderLine from "leader-line-vue";
    import AnimEvent from "anim-event";
    export default {
      name: "HelloWorld",
      data() {
        return {};
      },
      mounted() {
        this.$nextTick(() => {
          this.InitFun();
        });
      },
      beforeDestroy() {
        /**
         * 离开页面时销毁所有line
         */
        // this.ClearAllLine();
      },
      methods: {
        InitFun() {
          var elmFrame = document.getElementById("frame"),
            rectFrame = elmFrame.getBoundingClientRect(),
            elmClipRect = document.getElementById("clip-rect"),
            line1 = LeaderLine.setLine(
              document.getElementById("terminal-1"),
              document.getElementById("terminal-2")
            ),
            elmLine1 = document.querySelector(".leader-line:last-of-type"),
            elmRefClipRect1 = document.querySelector("#clip-1>use"),
            line2 = LeaderLine.setLine(
              document.getElementById("terminal-3"),
              line1.end
            ),
            elmLine2 = document.querySelector(".leader-line:last-of-type"),
            elmRefClipRect2 = document.querySelector("#clip-2>use");
    
          function update() {
            line1.position();
            line2.position();
            // Adjust clip position
            var rectLine = elmLine1.getBoundingClientRect();
            elmRefClipRect1.x.baseVal.value = rectFrame.left - rectLine.left;
            elmRefClipRect1.y.baseVal.value = rectFrame.top - rectLine.top;
            rectLine = elmLine2.getBoundingClientRect();
            elmRefClipRect2.x.baseVal.value = rectFrame.left - rectLine.left;
            elmRefClipRect2.y.baseVal.value = rectFrame.top - rectLine.top;
          }
    
          // Init clip size
          elmClipRect.width.baseVal.value = elmFrame.clientWidth;
          elmClipRect.height.baseVal.value = elmFrame.clientHeight;
          elmLine1.style.clipPath = "url(#clip-1)";
          elmLine2.style.clipPath = "url(#clip-2)";
          elmFrame.addEventListener("scroll", AnimEvent.add(update), false);
          update();
        },
        /**
         * 监听滚动条变化各部分连线跟随变化
         */
        AddEventListenerSrollFun() {
          window.addEventListener(
            "scroll",
            AnimEvent.add(() => {
              d3.selectAll(".leader-line").remove();
              this.lines1 = [];
              this.lines2 = [];
              this.lines3 = [];
              this.DrawLeaderLine1();
              this.DrawLeaderLine2();
              this.DrawLeaderLine3();
            }),
            false
          );
          let scrollableBox1 = document.getElementsByClassName("FirstContent")[0];
          scrollableBox1.addEventListener(
            "scroll",
            AnimEvent.add(() => {
              d3.selectAll(".leader-line").remove();
              this.lines1 = [];
              this.lines2 = [];
              this.lines3 = [];
              this.DrawLeaderLine1();
              this.DrawLeaderLine2();
              this.DrawLeaderLine3();
            }),
            false
          );
          let scrollableBox2 = document.getElementsByClassName("SecondContent")[0];
          scrollableBox2.addEventListener(
            "scroll",
            AnimEvent.add(() => {
              d3.selectAll(".leader-line").remove();
              this.lines1 = [];
              this.lines2 = [];
              this.lines3 = [];
              this.DrawLeaderLine1();
              this.DrawLeaderLine2();
              this.DrawLeaderLine3();
            }),
            false
          );
          let scrollableBox3 = document.getElementsByClassName("ThirdContent")[0];
          scrollableBox3.addEventListener(
            "scroll",
            AnimEvent.add(() => {
              d3.selectAll(".leader-line").remove();
              this.lines1 = [];
              this.lines2 = [];
              this.lines3 = [];
              this.DrawLeaderLine1();
              this.DrawLeaderLine2();
              this.DrawLeaderLine3();
            }),
            false
          );
          let scrollableBox4 = document.getElementsByClassName("FourContent")[0];
          scrollableBox4.addEventListener(
            "scroll",
            AnimEvent.add(() => {
              d3.selectAll(".leader-line").remove();
              this.lines1 = [];
              this.lines2 = [];
              this.lines3 = [];
              this.DrawLeaderLine1();
              this.DrawLeaderLine2();
              this.DrawLeaderLine3();
            }),
            false
          );
        },
    
        ClearAllLine() {
          if (this.lines1 && this.lines1.length) {
            this.lines1.forEach((line) => {
              line.remove();
            });
          }
          if (this.lines2 && this.lines2.length) {
            this.lines2.forEach((line) => {
              line.remove();
            });
          }
          if (this.lines3 && this.lines3.length) {
            this.lines3.forEach((line) => {
              line.remove();
            });
          }
        },
      },
    };
    </script>
    <style lang="scss" scoped>
    .HelloWorld {
      display: flex;
      flex-flow: row nowrap;
      justify-content: center;
      align-items: center;
       100%;
      height: 100%;
      background: #1f4760;
    }
    #frame {
      margin: 64px;
       540px;
      height: 540px;
      overflow: scroll;
    }
    
    #container {
       880px;
      height: 880px;
      position: relative;
      background-color: beige;
    }
    
    .terminal {
       32px;
      height: 32px;
      position: absolute;
      background-color: blue;
    }
    
    #terminal-1 {
      left: 32px;
      top: 32px;
    }
    
    #terminal-2 {
      left: 416px;
      top: 320px;
    }
    
    #terminal-3 {
      left: 64px;
      top: 180px;
    }
    
    #svg-clip {
       1px; /* for Gecko bug */
      height: 1px; /* for Gecko bug */
    }
    </style>
    
    

    #### GitHub

  • 相关阅读:
    SpringBoot学习(一)——Spring的发展
    layer插件学习——弹框(自定义页)
    layer插件学习——提示层
    layer插件学习——询问框
    layer插件学习——icon样式
    windows环境下搭建Java开发环境(二):Tomcat安装和配置
    windows环境下搭建Java开发环境(一):jdk安装和配置
    朋友(翻转树边权值比赛)——依然是思维
    S=∑1≤u<v≤nmex(u,v)
    Emergency Evacuation(最短下车时间)———(思维)
  • 原文地址:https://www.cnblogs.com/volodya/p/16270776.html
Copyright © 2020-2023  润新知