s-mousetip.vue
<template> <div ref="mouseTip" class="mouseTipClass" :style="mouseTipStyle"> <slot></slot> </div> </template> <script> export default { data() { return { mouseTipStyle: {} } }, mounted() { // 监听鼠标在浏览器可见区域中移动 window.addEventListener('mousemove', this.mousemove) // 监听鼠标移出浏览器可见区域 window.addEventListener('mouseout', this.mouseout) }, methods: { mouseout() { this.$set(this.mouseTipStyle, 'display', 'none') }, mousemove(e) { this.$set(this.mouseTipStyle, 'display', 'block') // 获取信息框的宽度 let mouseTipWidth = window.getComputedStyle(this.$refs.mouseTip).width // 获取信息框的高度 let mouseTipHeight = window.getComputedStyle(this.$refs.mouseTip).height // 当鼠标上方容不下信息框时,信息框改在鼠标下方显示 if (e.clientY < Number(mouseTipHeight.replace('px', '')) + 20) { this.$set(this.mouseTipStyle, 'top', e.clientY + 20 + 'px') } else { this.$set(this.mouseTipStyle, 'top', e.clientY - 36 + 'px') } // 当鼠标右侧容不下信息框时,信息框改在鼠标左边显示 if (e.clientX > document.documentElement.clientWidth - Number(mouseTipWidth.replace('px', ''))) { this.$set(this.mouseTipStyle, 'left', e.clientX - Number(mouseTipWidth.replace('px', '')) + 'px') } else { this.$set(this.mouseTipStyle, 'left', e.clientX + 'px') } }, } } </script> <style scoped> .mouseTipClass { display: none; position: fixed; z-index: 9999; background: white; border: 1px solid gray; padding: 4px; border-radius: 4px; } </style>
使用方法
在 s-mousetip 标签中,输入任何想随鼠标移动的内容即可(因是通过插槽实现,可以是文字、图片、组件等任意内容)
<template> <s-mousetip>我是随鼠标移动的信息框</s-mousetip> </template>