美文网首页
手动实现a标签title,hover之后的提示效果

手动实现a标签title,hover之后的提示效果

作者: 菜蚴菜 | 来源:发表于2022-11-07 21:53 被阅读0次
1、实现效果

提示框会跟随鼠标移动,如果超出显示边界,会自动计算贴着边界进行展示。


微信图片_20221107215200.png
2、具体代码(vue3写法)
<template>
  <div class="recent-item" @mouseover="handleMouseOver" @mouseleave="handleMouseLeave">
    <div>hover看效果</div>
    <div
      v-show="show"
      ref="recentRef"
      class="recent-item-tip"
      :style="{ left: posX + 'px', top: posY + 'px', opacity: opacity }"
    >
      我是提示
    </div>
  </div>
</template>

<script setup lang="ts">
import { ref, nextTick } from 'vue';
/** 鼠标的位置x */
let posX = ref(0);
/** 鼠标的位置y */
let posY = ref(0);
/** 显示状态 */
let show = ref(false);
/** 透明度 */
let opacity = ref(0);
/** 当前组件dom */
const recentRef = ref<HTMLDivElement | null>(null);
const timer = ref(null);
/** 鼠标滑过时,取鼠标的位置 */
function handleMouseOver(e) {
  /** 防抖执行更新数据 */
  if (timer.value) {
    clearTimeout(timer.value);
  }
  timer.value = setTimeout(() => {
    /** 更新最近使用的列表 */
    handleChangePos(e);
    clearTimeout(timer.value);
  }, 10);
}
/** 更改提示条的展示位置 */
function handleChangePos(e) {
  show.value = true;
  let clientHeight = document.documentElement.clientHeight;
  let clientWidth = document.documentElement.clientWidth;
  let pointX = e.clientX;
  let pointY = e.clientY;
  nextTick(() => {
    // 内容的宽度和高度
    let selfWidth = recentRef.value.clientWidth;
    let selfHeight = 86;
    // 判断有没有到容器的边界
    if (pointX + selfWidth > clientWidth) {
      pointX = clientWidth - selfWidth;
    }
    if (pointY + selfHeight > clientHeight) {
      pointY = clientHeight - selfHeight;
    }
    posX.value = pointX;
    posY.value = pointY;
    opacity.value = 1;
  });
}
/** 鼠标滑走时,隐藏tip */
function handleMouseLeave() {
  posX.value = 0;
  posY.value = 0;
  show.value = false;
  opacity.value = 0;
  clearTimeout(timer.value);
  timer.value = null;
}
</script>

<style lang="scss" scoped>
.recent-item {
  text-align: center;
  height: 60px;
  line-height: 60px;
  width: 100px;
  cursor: pointer;
  background: rgba(8, 48, 93, 0.04);
  &:hover {
    background: red;
  }
  .recent-item-tip {
    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;
  }
}
</style>


相关文章

网友评论

      本文标题:手动实现a标签title,hover之后的提示效果

      本文链接:https://www.haomeiwen.com/subject/ljbutdtx.html