解决两个div切换显示;鼠标还未离开另一个容器消失,没法操作选择问题;

一、问题描述:
两个div切换显示;第一个是负责数据显示;第二个是选择要显示的数据,默认显示第一个DIV容器,选择时候隐藏第一个容器,显示第二个容器选择数据,鼠标离开后隐藏第二个容器,显示第一个容器,两个IDV容器切换显示;问题是点击以后鼠标还未离开第二个容器就已经小时了,没法选中数据去第一个容器里边显示;

示例效果图

二、示例代码
示例代码如下:

<div>
  <div v-if="!show" @click="showClick">{{levelStr}}</div>
  <div class=" biaConfirmHtmlSelect tempSeleceBox" v-else @mouseleave="updateShow">
    <select @change="update" v-model="value">
      <option :value="item.value" :selected="value==item.value" v-for="item in resultArr">{{item.name}}</option>
    </select>
  </div>
</div>
    methods: {
        update: function(event) {
            var params = {
                type: 'edit',
                index: this.index,
                rowData: this.rowData,
                field: this.field,
                value: this.value
            };
            this.value = event.target.value;
            this.rowData[this.field] = this.value;
            this.$emit('on-custom-comp', params);
            this.show = !this.show;
        },
        updateShow: function(event) {
            if (window.event.toElement == null) return;
              this.show = false;
        },
        showClick: function() {
            // console.log(this.$parent.$parent.$parent);
            if (this.$parent.$parent.$parent.isEdit
              || this.$parent.$parent.$parent.isAssess
              || this.$parent.$parent.$parent.isRevise) {
                this.show = true;
            }
        }
    }

折腾了半天终于找到原因;把代码里边的 mouseleave 事件改写 onmouseout

老版本写法的代码
<div class=" biaConfirmHtmlSelect tempSeleceBox" v-else @mouseleave="updateShow">
    <select @change="update" v-model="value">
改写后的写法
<div class=" biaConfirmHtmlSelect tempSeleceBox" v-else @onmouseout="updateShow">
    <select @change="update" v-model="value">

那到底是怎么回事呢?猜测估计是事件冒泡搞得鬼!大家都知道常用的浏览器中有两种事件流:事件冒泡和事件捕获。让我们看一下事件冒泡的定义:事件按照从最特定的事件目标逐级向上传播到最不特定的事件目标(document对象)的顺序。所以说当鼠标移入移除A的子元素B的时候,B的mouseover事件和mouseout事件会触发,但是它自己没有这两个事件啊,就把这两个事件传递给了它的父元素A,A有这两个事件所以就发生了我们看到的情况。

你可以使用JavaScript和CSS实现这个效果。 首先需要在HTML中添加两个div一个用来显示原始图片,一个用来显示鼠标移动时的图片: ```html <div id="image-container"> <img src="your-image-source.jpg" id="original-image"> </div> <div id="hover-image-container"> <img src="" id="hover-image"> </div> ``` 然后在CSS中设置这两个div的样式: ```css #image-container { position: relative; width: 500px; height: 500px; } #original-image { width: 100%; height: 100%; object-fit: cover; } #hover-image-container { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: none; } #hover-image { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 80%; max-height: 80%; object-fit: contain; } ``` 其中,`#image-container`是原始图片的容器,设置了相对定位和宽高。`#original-image`是原始图片,设置了宽高为100%并使用了`object-fit: cover`来保持图片比例。 `#hover-image-container`是鼠标移动时图片的容器,设置了绝对定位和宽高为100%,并使用了`display: none`来隐藏初始状态下的图片。`#hover-image`是鼠标移动时显示的图片,设置了绝对定位和最大宽高,使用`object-fit: contain`来保持图片比例,并使用`transform: translate(-50%, -50%)`来将图片居中显示。 最后,使用JavaScript来监听鼠标移动事件,并将鼠标所在位置的图片显示在`#hover-image-container`中: ```javascript const originalImage = document.getElementById('original-image'); const hoverImage = document.getElementById('hover-image'); const hoverImageContainer = document.getElementById('hover-image-container'); originalImage.addEventListener('mousemove', function(e) { const x = e.offsetX / this.offsetWidth; const y = e.offsetY / this.offsetHeight; hoverImage.src = this.src; hoverImage.style.top = `${y * 100}%`; hoverImage.style.left = `${x * 100}%`; hoverImageContainer.style.display = 'block'; }); originalImage.addEventListener('mouseleave', function() { hoverImageContainer.style.display = 'none'; }); ``` 其中,`originalImage`是原始图片的DOM元素,`hoverImage`是鼠标移动时显示的图片的DOM元素,`hoverImageContainer`是鼠标移动时图片的容器的DOM元素。 使用`addEventListener`来监听`mousemove`事件,计算鼠标相对于图片左上角的位置,并将原始图片的`src`属性赋值给`hoverImage`,同时设置`hoverImage`的`top`和`left`属性来将图片放置到鼠标所在位置。最后设置`hoverImageContainer`的`display`属性为`block`,显示鼠标移动时的图片。 同样,也可以使用`addEventListener`来监听`mouseleave`事件,当鼠标离开原始图片时,将`hoverImageContainer`的`display`属性设置为`none`,隐藏鼠标移动时的图片。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值