如何在两个div之间画一条线?

IT技术 javascript html
2021-02-09 18:27:34

我目前正在尝试在一个 div 的右下角和另一个 div 的右上角之间绘制一条对角线。如果可能的话,我想在没有 jQuery 的情况下做到这一点。这可能吗?

2个回答

http://jsfiddle.net/cnmsc1tm/

由于 CSS 限制,这不适用于 IE8 或更低版本。

function getOffset( el ) {
    var rect = el.getBoundingClientRect();
    return {
        left: rect.left + window.pageXOffset,
        top: rect.top + window.pageYOffset,
        width: rect.width || el.offsetWidth,
        height: rect.height || el.offsetHeight
    };
}

function connect(div1, div2, color, thickness) { // draw a line connecting elements
    var off1 = getOffset(div1);
    var off2 = getOffset(div2);
    // bottom right
    var x1 = off1.left + off1.width;
    var y1 = off1.top + off1.height;
    // top right
    var x2 = off2.left + off2.width;
    var y2 = off2.top;
    // distance
    var length = Math.sqrt(((x2-x1) * (x2-x1)) + ((y2-y1) * (y2-y1)));
    // center
    var cx = ((x1 + x2) / 2) - (length / 2);
    var cy = ((y1 + y2) / 2) - (thickness / 2);
    // angle
    var angle = Math.atan2((y1-y2),(x1-x2))*(180/Math.PI);
    // make hr
    var htmlLine = "<div style='padding:0px; margin:0px; height:" + thickness + "px; background-color:" + color + "; line-height:1px; position:absolute; left:" + cx + "px; top:" + cy + "px; width:" + length + "px; -moz-transform:rotate(" + angle + "deg); -webkit-transform:rotate(" + angle + "deg); -o-transform:rotate(" + angle + "deg); -ms-transform:rotate(" + angle + "deg); transform:rotate(" + angle + "deg);' />";
    //
    // alert(htmlLine);
    document.body.innerHTML += htmlLine;
}
  • 距离公式
  • 寻找两点的中心
  • 找到两点之间的角度
  • CSS 变换:旋转
  • HTML 元素偏移量[Width|Height|Top|Left] 属性

编辑(对于其他有同样问题的人)

例如,如果您需要从不是右上角和右下角 div 的两个角创建一条线,请转到代码的这一部分:

// bottom right
var x1 = off1.left + off1.width;
var y1 = off1.top + off1.height;
// top right
var x2 = off2.left + off2.width;
var y2 = off2.top;

在您看到+ off1.width和 的地方+ off1.height,这意味着代码正在计算 div 底部或右侧的位置。删除+ off1.width+ off1.height以获得 div 的左侧或顶部。

EDIT更新为更标准的 getOffset 函数。如果你想获得真正的肛门,你可能还需要添加 document.documentElement.client[Left/Top] 并遍历 offsetParent 树,但我认为 getBoundingClientRect() 和 window.page[X/Y]Offset 足以这样的例子。

getOffset 函数似乎有缺陷,因为它不适用于一堆重叠的绝对定位的 div。我用 jQuery offset/height/width 函数替换了 get offset 并且这有效。返回 { 顶部:$(el).offset().top,左:$(el).offset().left,宽度:$(el).width(),高度:$(el).height() } ;
2021-03-15 18:27:34
Awasome回答谢谢。请注意,如果您使用 jQuery,则应使用 $("body").append(htmlLine) 而不是“document.body.innerHTML += htmlLine;” 在函数结束时避免画布问题(如浮点)。
2021-03-16 18:27:34
这是完全避免使用库的巧妙解决方案,尽管它在 IE 中不起作用太糟糕了。
2021-03-21 18:27:34
@louisricci 感谢您的帖子并分享您的 calc 功能。我很想在我的项目中采用它,但是每当我尝试打电话时,connect()我都会收到一个错误:el.getBoundingClientRect() is not a function. 你能帮我吗?
2021-04-10 18:27:34
效果很好,除了最后一行:document.body.innerHTML += htmlLine; 这似乎弄乱了其他处理程序。而是让 div = document.createElement("div"); div.style.cssText = 所有样式的东西;document.body.appendChild(div) 似乎没问题
2021-04-12 18:27:34

有一种方法可以在没有 jQ 的情况下做到这一点。

  1. 使用偏移量查找 div 的位置。
  2. 找到斜率
  3. 1x1px使用循环中的斜率从开始到结束位置绘制点。