vue 鼠标划入划出多传一个参数

// item可以传递弹窗显示数据, $event相关参数可以用来做弹窗定位用
@mouseover="handleMouseOver($event, item)" @mouseleave="handleMouseLeave($event, item)"

举个栗子: 做一个hover提示弹窗组件(用的vue3框架 + less插件)
可以将组件放在代码的最外层

<div
   v-show="show"
   ref="recentRef"
   class="recent-item-tip"
   :style="{ left: posX + 'px', top: posY + 'px', opacity: opacity }"
   @mouseover="handleMouseOver2" @mouseleave="handleMouseLeave2"
  >
      {{ '这里添加提示相关信息' }}
</div>

<script>
import { ref, ,nextTick } from 'vue';
// 提示内容
const titleInfo = ref('')
// 鼠标的横轴 
let posX = ref(0);
// 鼠标纵轴
let posY = ref(0);
// 控制显隐
let show = ref(false);
// 是否透明
let opacity = ref(0);
// 触发hover的DOM
const recentRef = ref<HTMLDivElement | null>(null);
const timer = ref(null);
// 获取鼠标位置
function handleMouseOver(e, item) {
  titleInfo.value = item.titleInfo;
  // 防抖
  if (timer.value) {
    clearTimeout(timer.value);
  }
  timer.value = setTimeout(() => {
    // 更新列表
    handleChangePos(e, item);
    clearTimeout(timer.value);
  }, 500);
}
// 这两个xx2函数是为了当鼠标划入提示弹窗内让弹窗不消失
function handleMouseOver2(e, item) {
  show.value = true;
}
function handleMouseLeave2(e, item) {
  show.value = false;
}
// 提示框定位
function handleChangePosition(e, item) {
  show.value = true;
  pushInfo.value = item.pushTime;
  let clientHeight = document.documentElement.clientHeight;
  let clientWidth = document.documentElement.clientWidth;
  let pointX = e.clientX;
  let pointY = e.clientY;
  nextTick(() => {
    // 内容宽高
    let selfWidth = recentRef.valueOf.clientWidth;
    let selfHeight = 80;
    if (pointX + selfWidth > clientWidth) {
      pointX = clientWidth - selfWidth - 10;
    }
    if (pointY + selfHeight > clientHeight) {
      pointY = clientHeight - selfHeight - 10;
    }
    opacity.value = 1;
    posX.value = pointX;
    posY.value = pointY;
  });
}
// 鼠标滑走隐藏
function handleMouseLeave() {
  // show.value = false;
  // opacity.value = 0;
  // pushInfo.value = '';
  clearTimeout(timer.value);
  timer.value = null;
}
</script>

<style lang="less">
  .recent-item-tip {
    height: 80px;
    width: 200px;
    overflow-y: scroll;
    position: fixed;
    z-index: 999;
    top: 0;
    left: 0;
    font-size: 12px;
    padding: 5px;
    line-height: 20px;
    box-sizing: border-box;
    word-break: keep-all;
    background-color: #fff; // #fff
    border: 1px solid #1113171a; // #1113171A
    border-radius: 4px;
    box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.3);
    opacity: 0;
  }
 	//滚动条样式
   ::-webkit-scrollbar {
   width: 5px;
   height: 6px;
   border-radius: 16px;
  }
  ::-webkit-scrollbar-thumb {
    border-radius: 16px;
  }
  ::-webkit-scrollbar-track {
    border-radius: 16px;
  }
</style>
### 鼠标 Hover 划入划出效果的实现 鼠标 `hover` 效果可以通过种方式实现,以下是几种常见的技术方案及其特点: #### 1. 使用 CSS 实现简单的 Hover 效果 CSS 的伪类 `:hover` 可以轻松实现当鼠标悬停在某个元素上时的效果变化。这种方式简单高效,适合不需要复杂逻辑的场景。 ```css .box { width: 200px; height: 200px; background-color: blue; transition: all 0.3s ease-in-out; } .box:hover { transform: scale(1.2); background-color: green; } ``` 上述代码展示了如何通过 `:hover` 改变盒子的颜色和大小[^1]。 --- #### 2. Vue.js 结合 Transition 动画库实现动态 Hover 效果 Vue 提供了内置的 `<transition>` 组件,可以方便地处理 DOM 元素进入或离开时的动画效果。结合鼠标事件(如 `mouseenter` 和 `mouseleave`),能够创建复杂的交互体验。 以下是一个基于 Vue 和 Element UI 的例子,展示如何实现鼠标滑过展开内容并支持防抖功能的功能[^3]。 ```vue <template> <div @mouseenter="handleEnter" @mouseleave="handleLeave"> <transition name="fade"> <div v-if="isShow" class="content">这里是隐藏的内容</div> </transition> </div> </template> <script> import _ from 'lodash'; export default { data() { return { isShow: false, }; }, methods: { handleEnter: _.debounce(function () { this.isShow = true; }, 300), handleLeave: _.debounce(function () { this.isShow = false; }, 300), }, }; </script> <style scoped> .fade-enter-active, .fade-leave-active { transition: opacity 0.5s; } .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ { opacity: 0; } .content { padding: 20px; border: 1px solid black; } </style> ``` 这段代码利用了 Vue 的数据绑定机制以及 Lodash 的 `debounce` 方法防止频繁触发事件。 --- #### 3. jQuery 实现高级 Hover 效果 jQuery 是一种强大的 JavaScript 库,提供了丰富的 API 来简化 DOM 操作和事件监听器管理。例如,`.hover()` 方法允许开发者定义两个回调函数分别用于鼠标进入和离开的行为[^4]。 下面是一段使用 jQuery 控制悬浮框显示/隐藏的例子: ```javascript $(".contact_suspension_frame").hover( function () { $("#contactContent").show(); $("#contactContent").stop().animate({ height: "195px" }, "normal"); }, function () { $("#contactContent").stop().animate({ height: "0px" }, "normal", function () { $("#contactContent").hide(); }); } ); ``` 此脚本实现了平滑的高度调整动画,并且调用了 `.stop()` 方法避免次快速触发导致队列堆积问题。 --- #### 4. 基于 HTML 和原生 JavaScript 的方向检测 Hover 如果需要更精确控制鼠标的移动路径,则可能需要用到额外计算来判断鼠标是从哪个方向进入目标区域的。这种方法通常涉及比较坐标位置差值找出最近边界[^2]。 假设我们有一个矩形容器,希望知道用户是从上方还是下方接近它: ```javascript const box = document.querySelector('.box'); let rect; box.addEventListener('mouseover', (e) => { const { top, bottom, left, right } = (rect = e.target.getBoundingClientRect()); let distances = [ Math.abs(e.clientY - top), // 上边距离 Math.abs(bottom - e.clientY), // 下边距离 Math.abs(e.clientX - left), // 左边距离 Math.abs(right - e.clientX) // 右边距离 ]; console.log(['top', 'bottom', 'left', 'right'][distances.indexOf(Math.min(...distances))]); }); ``` 以上片段会打印出最短的一侧名称作为当前访问入口方向。 --- ### 总结 无论是采用纯前端样式修改的方式还是借助框架扩展能力,亦或是深入研究物理行为模拟,都可以达成理想的用户体验设计目的。每种手段各有优劣,在实际开发过程中应视具体情况灵活选用最佳工具集组合而成解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值