讲述一下事件穿透的需求,大家可以根据实际情况来考虑是否采用这种方式来制作页面,(项目中遇到了底部是地图,两侧面板,但是UI在设计的时候为了好看,会有很大的遮罩阴影部分,如果按照时间制作会导致地图可点击的区域变得很小,这个时候就考虑了使用事件穿透,即按照效果图还原了页面,也不影响地图操作),我们来看案例
按图上样式来组件化,每次我们只需管左右两侧的内容就可以了
<template><div class="body"><header class="animated fadeInDown"> 头部 </header><article><div class="leftMain"><div @click="handleModel"><slot name="left"></slot></div></div><div class="centerMain"><slot name="center"></slot></div><div class="rightMain"><div @click="handleModel"><slot name="right"></slot></div></div></article><footer class="animated fadeInUp">底部</footer></div>
</template><script>
export default {data() {return {}},methods: {handleModel() {console.log("点击左右两侧模版,不触发地图事件")}}
}
</script><style scoped>
.body {width: 100%;height: 100%;position: relative;
}
.body header,
.body footer {width: 100%;color: #ffffff;text-align: center;position: absolute;left: 0;z-index: 1;
}.body header {height: 8vh;line-height: 8vh;top: 0;pointer-events: none; /* 事件穿透 */
}
.body header::before {content: "";position: relative;
}
.body footer {height: 2vh;line-height: 2vh;bottom: 0;pointer-events: none;
}
.body article {width: 100%;height: 100%;position: relative;
}
.body article .leftMain,
.body article .rightMain {width: 6rem;height: calc(100% - 10vh);position: absolute;top: 8vh; /* 8vh 是头部的高度 */background-color: rgba(137, 43, 226, 0.4);z-index: 1;pointer-events: none; /* 事件穿透 */display: flex;
}
.body article .rightMain {justify-content: flex-end;
}
.body article .leftMain > div,
.body article .rightMain > div {width: 4rem;height: 100%;pointer-events: auto; /* 禁止事件穿透 */color: #ffffff;background-color: rgba(43, 226, 58, 0.37);
}.body article .leftMain {left: 0.1rem;animation: bounceLeft 1s;
}
@keyframes bounceLeft {0% {left: -4rem;}100% {left: 0.1rem;}
}.body article .rightMain {right: 0.1rem;animation: bounceRight 1s;
}
@keyframes bounceRight {0% {right: -4rem;}100% {right: 0.1rem;}
}.body article .centerMain {width: 100%;height: 100%;position: relative;
}
.cash {position: fixed;width: 100%;height: 100%;left: 0;top: 0;bottom: 0;z-index: -1;
}
</style>
使用组件
<template><panel-model class="demo6"><template #left>测试ui设计地图上面会加遮罩,不影响地图操作,变成小手说明是可以操作地图</template><template #center><div class="gis" id="map" @click="mapHandle">放置地图</div></template><template #right></template></panel-model>
</template><script>
import panelModel from "./common/panelModel.vue";
export default {components: {panelModel,},data() {return {}},methods: {mapHandle() {console.log("点击地图")}}
}
</script><style scoped>
.gis {width: 100%;height: 100%;cursor: pointer;
}
</style>
完成,具体效果可以拿到自己项目中去实验一下,通过点击事件的操作来观察具体细节!