程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了单击时从一个元素到多个元素绘制一条线大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决单击时从一个元素到多个元素绘制一条线?@H_197_1@ 开发过程中遇到单击时从一个元素到多个元素绘制一条线的问题如何解决?下面主要结合日常开发的经验,给出你关于单击时从一个元素到多个元素绘制一条线的解决方法建议,希望对你解决单击时从一个元素到多个元素绘制一条线有所启发或帮助;

我正在尝试从元素 [.IDentifIEr] 到单击的元素 [ A,B,C serIEs ] 画一条线。我能够显示这条线,但在另一个方向上,不知道为什么它在这样一个方向上显示。 这是我的小提琴:https://jsfiddle.net/SampathPerOxide/u2afymxs/11/ 有人可以帮我在“.IDentifIEr”和相应的系列元素之间显示一条线吗?

点击 A 系列的预期结果:

单击时从一个元素到多个元素绘制一条线

点击 B 系列:

单击时从一个元素到多个元素绘制一条线

$('.serIEsli').click(function() {

  function adjustline(from,to,linE) {

    var fT = from.offsettop + from.offsetHeight / 2;
    var tT = to.offsettop + to.offsetHeight / 2;
    var fL = from.offsetleft + from.offsetWIDth / 2;
    var tL = to.offsetleft + to.offsetWIDth / 2;

    var CA = Math.abs(tT - fT);
    var CO = Math.abs(tL - fL);
    var H = Math.sqrt(CA * CA + CO * CO);
    var ANG = 180 / Math.PI * Math.acos(CA / H);

    if (tT > fT) {
      var top = (tT - fT) / 2 + fT;
    } else {
      var top = (fT - tT) / 2 + tT;
    }
    if (tL > fL) {
      var left = (tL - fL) / 2 + fL;
    } else {
      var left = (fL - tL) / 2 + tL;
    }

    if ((fT < tT && fL < tL) || (tT < fT && tL < fL) || (fT > tT && fL > tL) || (tT > fT && tL > fL)) {
      ANG *= -1;
    }
    top -= H / 2;

    line.style["-webkit-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-moz-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-ms-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-o-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-transform"] = 'rotate(' + ANG + 'deg)';
    line.style.top = top + 'px';
    line.style.left = left + 'px';
    line.style.height = H + 'px';
  }
  adjustline(
    document.getElementByID('div1'),document.getElementByID('div2'),document.getElementByID('line')
  );
});
.IDentifIEr {
  wIDth: 10px;
  height: 10px;
  BACkground-color: red;
  position: absolute;
  right: 45%;
  top: 50%;
}

.serIEs-div {
  position: absolute;
  right: 5%;
  bottom: 30%;
}

.serIEs-ul li {
  List-style: none;
  color: grey;
  @R_403_6837@-size: 1em;
  @R_403_6837@-weight: 600;
  border: 2px solID grey;
  display: table;
  padding: 0.3em 0.1em;
  text-align: center;
  margin: 0.5em;
  cursor: pointer;
}

#line {
  position: absolute;
  wIDth: 2px;
  margin-top: -1px;
  BACkground-color: red;
}
<script src="https://cdnjs.cloudFlare.com/AJAX/libs/jquery/3.3.1/jquery.min.Js"></script>
<div style="position;relative;">
  <div class="IDentifIEr" ID="div2"></div>
  <div class="serIEs-div">
    <ul class="serIEs-ul">
      <li class="serIEsli" ID="div1">A serIEs</li>

      <li class="serIEsli">B serIEs</li>
  
      <li class="serIEsli">C serIEs</li>
    
    </ul>
  </div>
   <div ID="line"></div>
  <img src="https://stat.overdrive.in/wp-content/odgallery/2020/06/57263_2020_Mercedes_Benz_GLs.jpg" class="img-responsive firstcar-detail" style="wIDth: 100%;">

</div>

解决方法@H_197_1@

我修好了你的小提琴:https://jsfiddle.net/c4ju6a0p/

代码更改:

// Get actual position relative to viewport.
// See https://stackoverflow.com/a/11396681/117030
fromBCR = from.getBoundingClientRect();
toBCR   = to.getBoundingClientRect();

var fT = fromBCR.top + from.offsetHeight / 2;
var tT = toBCR.top + to.offsetHeight / 2;

// Don't add offsetWidth. This connects to the middle,not the left edge.
var fL = fromBCR.left //+ from.offsetWidth / 2;
var tL = toBCR.left + to.offsetWidth / 2;

  • 问题是由于 relative 定位,计算线的位置不正确。注释掉 relative CSS 后可以更清楚地看到这一点:https://jsfiddle.net/vust5nxf/
  • 另外,如果您希望线条到达左边缘,请不要添加 offsetWidth

更新: 没有注意到代码片段...也在那里应用了更改。我还做了一项更改:

  • 您需要将被点击的元素传递给 adjustLine(),否则当前每次都会在相同的两个元素之间绘制一条线,因为这些元素是用 id 硬编码的。
  • 作为样式说明:我会将函数 adjustLine() 的定义移到点击处理程序之外。这将使代码更易于阅读,并且该函数只会创建一次,而不是每次处理一次点击。
adjustLine(
  this,// Element that was clicked.
  document.getElementById('div2'),document.getElementById('line')
);

$('.seriesli').click(function() {

  function adjustLine(from,to,linE) {

    // Get actual position relative to viewport.
    // See https://stackoverflow.com/a/11396681/117030
    fromBCR = from.getBoundingClientRect();
    toBCR   = to.getBoundingClientRect();
    
    var fT = fromBCR.top + from.offsetHeight / 2;
    var tT = toBCR.top + to.offsetHeight / 2;
    
    // Don't add offsetWidth. This connects to the middle,not the left edge.
    var fL = fromBCR.left //+ from.offsetWidth / 2;
    var tL = toBCR.left + to.offsetWidth / 2;

    var CA = Math.abs(tT - fT);
    var CO = Math.abs(tL - fL);
    var H = Math.sqrt(CA * CA + CO * CO);
    var ANG = 180 / Math.PI * Math.acos(CA / H);

    if (tT > fT) {
      var top = (tT - fT) / 2 + fT;
    } else {
      var top = (fT - tT) / 2 + tT;
    }
    if (tL > fL) {
      var left = (tL - fL) / 2 + fL;
    } else {
      var left = (fL - tL) / 2 + tL;
    }

    if ((fT < tT && fL < tL) || (tT < fT && tL < fL) || (fT > tT && fL > tL) || (tT > fT && tL > fL)) {
      ANG *= -1;
    }
    top -= H / 2;

    line.style["-webkit-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-moz-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-ms-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-o-transform"] = 'rotate(' + ANG + 'deg)';
    line.style["-transform"] = 'rotate(' + ANG + 'deg)';
    line.style.top = top + 'px';
    line.style.left = left + 'px';
    line.style.height = H + 'px';
  }
  adjustLine(
    this,// Element that was clicked.
    document.getElementById('div2'),document.getElementById('line')
  );
});
.identifier {
  width: 10px;
  height: 10px;
  BACkground-color: red;
  position: absolute;
  right: 45%;
  top: 50%;
}

.series-div {
  position: absolute;
  right: 5%;
  bottom: 30%;
}

.series-ul li {
  list-style: none;
  color: grey;
  font-size: 1em;
  font-weight: 600;
  border: 2px solid grey;
  display: table;
  padding: 0.3em 0.1em;
  text-align: center;
  margin: 0.5em;
  cursor: pointer;
}

#line {
  position: absolute;
  width: 2px;
  margin-top: -1px;
  BACkground-color: red;
}
<script src="https://cdnjs.cloudFlare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div style="position;relative;">
  <div class="identifier" id="div2"></div>
  <div class="series-div">
    <ul class="series-ul">
      <li class="seriesli" id="div1">A series</li>

      <li class="seriesli">B series</li>
  
      <li class="seriesli">C series</li>
    
    </ul>
  </div>
   <div id="line"></div>
  <img src="https://stat.overdrive.in/wp-content/odgallery/2020/06/57263_2020_Mercedes_Benz_GLs.jpg" class="img-responsive firstcar-detail" style="width: 100%;">

</div>

大佬总结

以上是大佬教程为你收集整理的单击时从一个元素到多个元素绘制一条线全部内容,希望文章能够帮你解决单击时从一个元素到多个元素绘制一条线所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。