如何将 HTML Divs 与 Lines 连接起来?

IT技术 javascript jquery html css
2021-02-10 18:19:42

在我的页面上,我有一组 div 元素,它们应该与如下图所示的线条连接。我知道使用画布我可以在这些元素之间画线,但是是否可以在 html/css 中以另一种方式做到这一点?

在此处输入图片说明

6个回答

您可以使用 SVG 仅使用 HTML 和 CSS 连接两个 div:

<div id="div1" style="width: 100px; height: 100px; top:0; left:0; background:#777; position:absolute;"></div>
<div id="div2" style="width: 100px; height: 100px; top:300px; left:300px; background:#333; position:absolute;"></div>

(请使用单独的 css 文件进行样式设置)

创建一个 svg 行并使用此行连接上面的 div

<svg width="500" height="500"><line x1="50" y1="50" x2="350" y2="350" stroke="black"/></svg>

在哪里,

x1,y1 表示第一个 div 的中心,
x2,y2 表示第二个 div 的中心

您可以在下面的代码段中查看它的外观

<div id="div1" style="width: 100px; height: 100px; top:0; left:0; background:#777; position:absolute;"></div>
<div id="div2" style="width: 100px; height: 100px; top:300px; left:300px; background:#333; position:absolute;"></div>

<svg width="500" height="500"><line x1="50" y1="50" x2="350" y2="350" stroke="black"/></svg>

PS:对于移动 div,您可能希望相应line地更新坐标。但为此,您将不得不使用 JavaScript/JQuery。访问此链接以了解如何操作 -> stackoverflow.com/a/35493737/5947203
2021-04-06 18:19:42

我对我的项目做了这样的事情

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')
);
#content{
  position:relative;
}
.mydiv{
  border:1px solid #368ABB;
  background-color:#43A4DC;
  position:absolute;
}
.mydiv:after{
  content:no-close-quote;
  position:absolute;
  top:50%;
  left:50%;
  background-color:black;
  width:4px;
  height:4px;
  border-radius:50%;
  margin-left:-2px;
  margin-top:-2px;
}
#div1{
  left:200px;
  top:200px;
  width:50px;
  height:50px;
}
#div2{
  left:20px;
  top:20px;
  width:50px;
  height:40px;
}
#line{
  position:absolute;
  width:1px;
  background-color:red;
}  
  

<div id="content">
  <div id="div1" class="mydiv"></div>
  <div id="div2" class="mydiv"></div>
  <div id="line"></div>
</div>
  

谢谢你的数学解决方案
2021-03-17 18:19:42
严重史诗感谢
2021-03-30 18:19:42

您可以使用https://github.com/musclesoft/jquery-connections这允许您连接 DOM 中的块元素。

这是一个很棒的图书馆!非常易于使用且易于扩展。
2021-03-26 18:19:42

定位有点1px麻烦,但是您可以使用宽 div 作为线条和位置并适当地旋转它们。

http://jsfiddle.net/sbaBG/1

<div class="box" id="box1"></div>
<div class="box" id="box2"></div>
<div class="box" id="box3"></div>

<div class="line" id="line1"></div>
<div class="line" id="line2"></div>
.box {
    border: 1px solid black;
    background-color: #ccc;
    width: 100px;
    height: 100px;
    position: absolute;
}
.line {
    width: 1px;
    height: 100px;
    background-color: black;
    position: absolute;
}
#box1 {
    top: 0;
    left: 0;
}
#box2 {
    top: 200px;
    left: 0;
}
#box3 {
    top: 250px;
    left: 200px;
}
#line1 {
    top: 100px;
    left: 50px;
}
#line2 {
    top: 220px;
    left: 150px;
    height: 115px;

    transform: rotate(120deg);
    -webkit-transform: rotate(120deg);
    -ms-transform: rotate(120deg);
}
更新了 IE 9 和 webkit 的前缀。
2021-03-26 18:19:42
不要忘记包括 -webkit-transform:rotate(120deg); 对于那些不使用 IE 的人
2021-04-05 18:19:42
这是否适用于移动设备?
2021-04-06 18:19:42
@marsone 它应该caniuse.com/transforms2d
2021-04-12 18:19:42

使用任意数量的库和/或 HTML5 技术绝对可能。您可以通过使用诸如 border-bottom 属性之类的东西在纯 CSS 中将某些东西组合在一起,但这可能会非常糟糕。

如果您对此很认真,则应该查看用于画布绘图或 SVG 的 JS 库。例如,像http://www.graphjs.org/http://jsdraw2dx.jsfiction.com/

完全取决于你想做什么。如果您关心鼠标点击,您可以访问 mouseMove 和点击事件并将当前鼠标位置与画布中元素的位置进行比较。有很多 2d 和 3d 画布/webGL 草图可以响应鼠标/键盘事件。我刚刚进行了另一次随机谷歌搜索,发现sigmajs.org看起来非常好,并且在他们的首页上有一个响应式演示。
2021-03-25 18:19:42
但是当我使用 Canvas 时,我无法在对象上绑定事件?
2021-03-31 18:19:42