我做的是通過(guò)接口返回的列表數(shù)據(jù)渲染元素,元素可以調(diào)整位置和大小,所以遍歷中的item包含元素的positionX,positionY,width,height等信息,也可通過(guò)獲取元素的offsetLeft、offsetTop、width、height等方式參考下面的幾種重疊的情況進(jìn)行判斷:
watch: {
pageData: {
handler(nVal, oVal) {
//設(shè)置元素重疊默認(rèn)標(biāo)識(shí)
nVal.articles.forEach((item1, index1) => {
item1.overlap = false;
});
nVal.articles.forEach((item1, index1) => {
nVal.articles.forEach((item2, index2) => {
// 1左上在其他元素內(nèi)
let leftTopOver =
item1.positionX > item2.positionX &&
item1.positionX < item2.positionX + item2.width &&
item1.positionY > item2.positionY &&
item1.positionY < item2.positionY + item2.height;
// 2右下在其他元素內(nèi)
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右上在其他元素內(nèi)
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左下在其他元素內(nèi)
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
) {
//設(shè)置元素重疊標(biāo)識(shí)
item1.overlap = true;
item2.overlap = true;
}
});
});
},
deep: true
}
},