服务粉丝

我们一直在努力
当前位置:首页 > 财经 >

社区精选|React 制作全局 Tooltip 文字提示组件

日期: 来源:SegmentFault思否收集编辑:

今天小编为大家带来的是社区作者 Awbeci 的文章,让我们一起来学习用 React 制作全局 Tooltip 文字提示组件。




前言


最近项目中使用 antd 的 tooltip 组件的时候发现它有点不稳定,经常会出现漂浮到左上角的情况,让人困惑之余还不知道如何解决,再加上它是在每个 dom 上面添加的 tooltip 这样数据量一大的话就会产生冗余的 dom 元素,于是想起 react-tooltip 组件,它可以在全局设置 tooltip,并且只要在想要提示的 dom 上面添加 data-tip='xxxx'即可,而且我项目中也是用的这个组件,但是最近发现一个问题,就是 v5 版本的写法和 v4 差别非常大,于是冲动之下自己写一个 tooltip 以满足自身需求,分享给大家。


操作


tooltip 组件的实现步骤:

1、创建一个悬浮的 dom div,并且设置一下基本样式且是隐藏状态

组件:

const tooltipRef = useRef(null)
const [content, setContent] = useState(null)

<div className={styles.tooltip} ref = {tooltipRef }>
   {content}
</div>

这里代码解释一下const tooltipRef = useRef(null)的作用就是通过 ref 控制 tooltip 元素的位置,后面会讲到。

const [content, setContent] = useState(null)的使用就是你 tooltip 想显示的内容,这里可以自定义。

样式:

.tooltip{
    display: flex;
    position: fixed;
    align-items: center;
    justify-content: center;
    height: 34px;
    width: 170px;
    background-color: #000;
    color: #fff;
    visibility: hidden;
    z-index: 100;
    border-radius: 6px;
    font-size: 12px;
}

// 制作三角箭头
.tooltip::after {
    content: " ";
    position: absolute;
    top: 100%; /* At the bottom of the tooltip */
    left: 50%;
    margin-left: -5px;
    border-width: 5px;
    border-style: solid;
    border-color: black transparent transparent transparent;
}

上面都是基础样式加三角箭头。

2、在你想要提示的 dom 元素上面添加 hover 事件

`// 鼠标移开
onMouseLeave={(e,value,currentDate) => {
  // 鼠标移开的时候要隐藏 tooltip 
  tooltipRef.current.style = `visibility:hidden;`
}}
// 鼠标进入
onMouseOver={(e, value, currentDate)=>{
  // 获取你的 dom 元素距离窗口的 left 和 top,这个 left 和 top 就是你 tooltip 相对的位置
  const { left, top } = e.currentTarget.getBoundingClientRect();
  // 有了 left 和 top 我们设置 tooltip 的位置,并且要设置 visibility 为显示状态
  tooltipRef.current.style = `visibility:visible;top:${top-42}px;left: ${left-79}px`
  if (!value || !value.date) {
    setCalContent(`提交 0 次,${currentDate}`)
  }else{
    setCalContent(`提交 ${value.count} 次,${value.date}`)
  }
}}`

这里你的组件或者 dom 元素上面有两个事件:onMouseOver和onMouseLeave。

onMouseOver 的使用就是鼠标移动到上面的时候

2.1、首先获取元素的位置坐标信息
const { left, top } = e.currentTarget.getBoundingClientRect();
2.2、有了坐标我们就要让 tooltip 显示到那里
tooltipRef.current.style = `visibility:visible;top:${top-42}px;left: ${left-79}px`
2.3、并且设置显示的内容
setCalContent(xxxx)

最后不要忘了鼠标移开的时候要隐藏 tooltip,这样就完成了 tooltip 的全部制作。tooltipRef.current.style = 'visibility:hidden;'


总结


1、先要理解下实现思路,有了思路实现起来就简单了,实在不知道可以看看别人的代码。
2、最重要的一点其实是如何获取被提示组件或者元素的位置坐标信息,所以e.currentTarget.getBoundingClientRect()代码非常重要。
3、有了坐标就可以设置 tooltip 要显示的位置了,不过还需要手动调整一下,top:${top-42}px;left: ${left-79}px。


引用


CSS Tooltip:https://www.w3schools.com/css/css_tooltip.asp
getBoundingClientRect:https://github.com/facebook/react/issues/16201
MDN getBoundingClientRect:https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect



点击左下角阅读原文,到 SegmentFault 思否社区 和文章作者展开更多互动和交流,“公众号后台“回复“ 入群 ”即可加入我们的技术交流群,收获更多的技术文章~

- END -

相关阅读

  • 智能家居大百科|智能家居的专业术语

  • 点击上方“蓝字”,关注更多精彩在信息泛滥的时代,想要获得各类信息,几乎都能0成本搜索获取,但在这个搜索的过程中所耗费的时间与精力是非常多的。为此,零狐特地以“智能家居大百
  • 智能家居大百科二|智能家居起源与运用

  • 点击上方“蓝字”,关注更多精彩据申万宏源测算,2022年全屋智能市场规模将达到215亿元,2025年则有望突破500亿元,对智能家居行业贡献将超过15%。智能家居市场正在飞速发展,它是如
  • 用人经理使用的报告,不培训即可懂

  • 北森的测评新品「关键岗位计算机自适应测评」自发布后,受到了市场的广泛关注。除了其本身具备的先进技术,切实解决了企业一直以来关注的痛点,具体可见[人才测评届的国货之光 |
  • 中铁十八局集团2023届校园招聘正式启动

  • 制图、编辑:王睿、王晓珏来源:集团公司党委干部部(人力资源部)审核:李慧楠、王飞辉、曾凡泓、吴东主办:中铁十八局集团党委工作部(党委宣传部、团委、企业文化部)近期热文,欢迎回顾!
  • 量化类私募基金净值跟踪20230113

  • 点击上方蓝字关注我们~免责声明:您在阅读或使用本公众号文章即表明您已事先接受以下“免责声明”之所载条款:1、阅读本文前,请确认您符合私募基金合格投资者条件。2、本公众号

热门文章

  • “复活”半年后 京东拍拍二手杀入公益事业

  • 京东拍拍二手“复活”半年后,杀入公益事业,试图让企业捐的赠品、家庭闲置品变成实实在在的“爱心”。 把“闲置品”变爱心 6月12日,“益心一益·守护梦想每一步”2018年四

最新文章

  • SegmentFault 思否写作挑战赛!

  • SegmentFault 思否写作挑战赛 是思否社区新上线的系列社区活动,在 2 月 8 日 正式面向社区所有用户开启;挑战赛中包含多个可供作者选择的热门技术方向,根据挑战难度分为多个等
  • 社区精选|微服务的版本号要怎么设计?

  • 今天小编为大家带来的是社区作者 江南一点雨 的文章,让我们一起来学习设计微服务的版本号。今天我们来聊一下微服务项目中的版本号要怎么设计。小伙伴们平时看到的项目版本号
  • 深圳各口岸的地铁乘车攻略速戳→

  • 2月6日起深港陆路口岸全面恢复正常通关并且所有口岸不设人数限制、无需预约7天内无境外(不含港澳)旅居史的人员出入境前无需提交核酸检测阴性证明今天带来了大家期待的深圳各