2024-4-10关于父子节点在页面中重叠问题的解决方案

1.发现的问题

测试同事在测试环境下发现点击以下热区蓝色文案区域的时候跳去A页面,点击紫色区域空白有时候跳入B页面。 由于此组件是多页面共用组件,经过和线上生产环境其他页面对比情况后,线上逻辑是无论点击热区的任一部分都是跳去A页面。 我以为是别的需求变动导致的问题。遂仔细寻找问题的原因。

2.定位问题并寻找导致问题的原因

首先查看测试环境的代码改动记录,发现相关模块并没有改动记录。

于是本人便根据gitlog 的file记录寻找近期变动如下。

发现近期1个月内的代码变更是本人改写的。于是本人尝试注释掉新增代码区域(黄色区域),发现上述问题并没有复现!

本次实现需求的方法是创建一个伪元素,再贴上背景图便可以实现一个背景icon的样式。以下是元素css样式。

css 复制代码
.fake-element{
background: url('../star.png');
background-repeat: no-repeat;
background-size: contain;
background-position-x: 100%;
margin-top: -182px;
margin-right: -32px;
height: 182px;
}

考虑到热区无文案区域(紫色区域)刚刚和伪元素区域重叠,点击伪元素区域和热区是同一层级并且伪元素区域没有点击事件。点击伪元素和热区重叠区域时有可能是dom向上冒泡到父节点的点击事件。找到原因后便开始寻求解决办法。

蓝色区域为伪元素

3.问题的解决方案

3.1 阻止事件向上冒泡

给伪元素的点击事件添加一个禁止向上冒泡的方法,但是使用后发现点击热区和伪元素重叠区域不会转跳到A页面也不会转跳到B页面。

js 复制代码
        <View 
            onClick={(e): void => {
                e.preventDefault();
                e.stopPropagation();
            }}
            className={styles.fake-element}
            >
         </View>

3.2 通过绝对定位修改相应层级

以下是热区样式

js 复制代码
   .hot-area{
       position:absolute;
       z-index:2;
       ... //此处省略热区其他内容样式
   }

以下是伪元素样式

js 复制代码
   .fake-element{
        position:absolute;
        z-index:1;
        ... //此处省略伪元素其他内容样式
    }

虽然问题解决了,但是页面需要重新排版。由于热区是绝对定位,所以还得修改父节点预留空间给热区展示。考虑到尽量做到较少改动来实现需求,这个方案放弃。

3.3 为元素添加point-event属性

后面参考了别的同事代码,发现设置point-event属性就可以实现我们想要的效果。

js 复制代码
   .fake-element{
       point-event:none;
       ... //此处省略伪元素其他内容样式
   }

4.总结

在遇到问题时多一些寻求解决方案,并且要考虑到最小成本改动来解决问题。

相关推荐
SadSunset2 分钟前
(19)Bean的循环依赖问题
java·开发语言·前端
JIngJaneIL5 分钟前
基于Java+ vue图书管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
几何心凉13 分钟前
容器平台集群管理和调度
前端
几何心凉19 分钟前
openFuyao 总体定位和解决方案
前端
IT_陈寒27 分钟前
Vue 3.4 实战:5个被低估的Composition API技巧让我的开发效率提升40%
前端·人工智能·后端
JH灰色33 分钟前
【大模型】-LangChain多模态输入和自定义输出
java·前端·langchain
JIngJaneIL33 分钟前
基于Java + vue校园论坛系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
馬致远1 小时前
Vue TodoList 待办事项小案例(代码版)
前端·javascript·vue.js
一字白首1 小时前
Vue 进阶,Vuex 核心概念 + 项目打包发布配置全解析
前端·javascript·vue.js
栀秋6661 小时前
从前端送花说起:HTML敲击乐与JavaScript代理模式的浪漫邂逅
前端·javascript·css