我做的是通过接口返回的列表数据渲染元素,元素可以调整位置和大小,所以遍历中的item包含元素的positionX,positionY,width,height等信息,也可通过获取元素的offsetLeft、offsetTop、width、height等方式参考下面的几种重叠的情况进行判断:
watch: {
pageData: {
handler(nVal, oVal) {
//设置元素重叠默认标识
nVal.articles.forEach((item1, index1) => {
item1.overlap = false;
});
nVal.articles.forEach((item1, index1) => {
nVal.articles.forEach((item2, index2) => {
// 1左上在其他元素内
let leftTopOver =
item1.positionX > item2.positionX &&
item1.positionX < item2.positionX + item2.width &&
item1.positionY > item2.positionY &&
item1.positionY < item2.positionY + item2.height;
// 2右下在其他元素内
let rightBottomOver =
item1.positionX + item1.width > item2.positionX &&
item1.positionX + item1.width < item2.positionX + item2.width &&
item1.positionY + item1.height > item2.positionY &&
item1.positionY + item1.height < item2.positionY + item2.height;
// 3右上在其他元素内
let rightTopOver =
item1.positionX + item1.width > item2.positionX &&
item1.positionX + item1.width < item2.positionX + item2.width &&
item1.positionY > item2.positionY &&
item1.positionY < item2.positionY + item2.height;
// 4左下在其他元素内
let leftBottomOver =
item1.positionX > item2.positionX &&
item1.positionX < item2.positionX + item2.width &&
item1.positionY + item1.height > item2.positionY &&
item1.positionY + item1.height < item2.positionY + item2.height;
// 5十字交叉重叠
let centerCenterOver =
item1.positionX < item2.positionX &&
item1.positionX + item1.width > item2.positionX + item2.width &&
item1.positionY > item2.positionY &&
item1.positionY + item1.height < item2.positionY + item2.height;
// 6覆盖重叠
let containOver =
item1.positionX > item2.positionX &&
item1.positionX + item1.width < item2.positionX + item2.width &&
item1.positionY > item2.positionY &&
item1.positionY + item1.height < item2.positionY + item2.height;
if (
leftTopOver ||
rightBottomOver ||
rightTopOver ||
leftBottomOver ||
centerCenterOver ||
containOver
) {
//设置元素重叠标识
item1.overlap = true;
item2.overlap = true;
}
});
});
},
deep: true
}
},
网友评论