这是我的codepen美元.我想用jQuery判断div是否相互重叠.我为此编写了一个代码,但它不适用于圆形盒子.它只适用于正方形和长方形.我怎么才能让它在圆形潜水艇上工作呢?

const coordinates = (className) => {
  const val = document.querySelector(className);
  
  return {
      y: val.offsetTop,
      x: val.offsetLeft,
      yh: val.offsetTop + val.offsetHeight,
      xw: val.offsetLeft + val.offsetWidth,
  }
}

const cm = coordinates(".circle.small");
const cl = coordinates(".circle.large");

const offset_x = cm.x < cl.x && cm.xw > cl.x;
const offset_xw = cm.x < cl.xw && cm.xw > cl.xw;
const offset_cx = cm.x < cl.xw && cm.xw < cl.xw;
const offset_cy = cm.y < cl.yh && cm.yh < cl.yh;
const offset_y = cm.y < cl.y && cm.yh > cl.y;
const offset_yh = cm.y < cl.yh && cm.yh > cl.yh;

const is_x = offset_x || offset_xw || offset_cx;
const is_y = offset_y || offset_yh || offset_cy;

console.log(is_x, is_y);
.circle {
  width: var(--square);
  height: var(--square);
  background: var(--bg);
  border-radius: 50%;
}

.parent {
  margin-left: 5px;
}

.parent2 {
  margin-left: 15px;
}

.small {
  --square: 50px;
  --bg: red;
  margin-bottom: -5px;
}

.large {
  --square: 100px;
  --bg: green;
}
<div class="parent">
  <div class="circle small"></div>
</div>
<div class="parent2">
  <div class="circle large"></div>
</div>

推荐答案

您计算圆位置之间的增量的逻辑不太正确.你需要从每个圆的centre得到X和Y,然后计算出从这两个点计算出的斜边是否小于总和半径的一半.

下面是一个有效的例子.请注意,我添加jQuery/jQueryUI只是为了便于测试拖动圆圈--这两个库都不是生产使用所必需的.

let $label = $('.overlap-label span');

const hasOverlap = (x0, y0, r0, x1, y1, r1) => Math.hypot(x0 - x1, y0 - y1) <= r0 + r1;
const coordinates = (className) => {
  const el = document.querySelector(className);
  const rect = el.getBoundingClientRect();
  const radius = el.offsetHeight / 2;
  return {
    y: rect.top + radius,
    x: rect.left + radius,
    r: radius
  }
}
const checkForOverlap = () => {
  const cm = coordinates(".circle.small");
  const cl = coordinates(".circle.large");
  $label.text(hasOverlap(cm.x, cm.y, cm.r, cl.x, cl.y, cl.r));
}

$('.parent').draggable().on('drag', checkForOverlap);
.circle {
  width: var(--square);
  height: var(--square);
  background: var(--bg);
  border-radius: 50%;
  display: inline-block;
}

.parent {
  display: inline-block;
}

.small {
  --square: 50px;
  --bg: red;
}

.large {
  --square: 100px;
  --bg: green;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.0/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/jquery-ui.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.13.2/themes/base/jquery-ui.min.css" />

<div class="overlap-label">Circles are overlapping? <span>false</span></div>
<div class="parent">
  <div class="circle small"></div>
</div>
<div class="parent">
  <div class="circle large"></div>
</div>

Javascript相关问答推荐

if/else JavaScript中的条件行为

IMDB使用 puppeteer 加载更多按钮(nodejs)

如何让npx在windows中运行js脚本?

如何使onPaste事件与可拖动的HTML元素一起工作?

PDF工具包阿拉伯字体的反转数字

如何在ASP.NET JavaScript中使用Google Charts API仅对绘制为负方向的条形图移动堆叠条形图标签位置

更改预请求脚本中重用的JSON主体变量- Postman

类构造函数不能在没有用With Router包装的情况下调用

在Matter.js中添加从点A到另一个约束的约束

基于props 类型的不同props ,根据来自接口的值扩展类型

将数组扩展到对象中

获取';无法解决导入和导入";slick-carousel/slick/slick-theme.css";';错误

处理app.param()中的多个参数

如何在脚本编译后直接将RxJ模块导入浏览器(无需Angel、webpack、LiteServer)

顶点图使用组标签更新列之间的条宽

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

连续添加promise 时,如何在所有promise 都已结算时解除加载覆盖

每隔一行文本段落进行镜像(Boustrophedon)

在采购unpept-visalizations.js时遇到问题

如何在点击2秒后用JavaScript动态改变按钮上的图标?