gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 11:47:04 26 4
gpt4 key购买 nike

我正在尝试从元素 [.identifier] 到单击的元素 [ A, B, C series ] 画一条线。我能够显示这条线,但在另一个方向上,不知道为什么它会在这样的方向上显示。
这是我的 fiddle :https://jsfiddle.net/SampathPerOxide/u2afymxs/11/
有人可以帮我在“.identifier”和相应的系列元素之间显示一条线吗?
点击A系列的预期结果:
enter image description here
点击B系列:
enter image description here

$('.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;
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>

最佳答案

我修好了你的 fiddle :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>

    关于javascript - 单击时从一个元素到多个元素绘制一条线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68379604/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com