社区精选|React 制作全局 Tooltip 文字提示组件
今天小编为大家带来的是社区作者 Awbeci 的文章,让我们一起来学习用 React 制作全局 Tooltip 文字提示组件。
前言
操作
1、创建一个悬浮的 dom div,并且设置一下基本样式且是隐藏状态
const tooltipRef = useRef(null)
const [content, setContent] = useState(null)
<div className={styles.tooltip} ref = {tooltipRef }>
{content}
</div>
.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;
}
`// 鼠标移开
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}`)
}
}}`
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)

总结
2、最重要的一点其实是如何获取被提示组件或者元素的位置坐标信息,所以e.currentTarget.getBoundingClientRect()代码非常重要。
3、有了坐标就可以设置 tooltip 要显示的位置了,不过还需要手动调整一下,top:${top-42}px;left: ${left-79}px。
引用
getBoundingClientRect:https://github.com/facebook/react/issues/16201
MDN getBoundingClientRect:https://developer.mozilla.org/en-US/docs/Web/API/Element/getBoundingClientRect


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- WebOS酷似windows11风格的web私有云网盘
- 澳元兑换人民币汇率2023年5月29日
- 澳元兑换人民币汇率
- iPhone 14 Pro DXO影像成绩公布:排名全球第二!榜首令人意外
- iQOO Z6全面评测:性能小超人,快充大提升
- 【杂谈快报】小米:向3142人奖励9274.84万股股票,约9.42亿元人民币
- 不知不觉每日优鲜竟在外面投资了 10 来个项目,有的还「整挺好」
- 东方甄选火了,但财报还看不出来
- 美国Open RAN先锋企业大规模裁员!曾经号称颠覆行业的技术路线将走向何方?
- 统信2022操作系统生态创享会(首期)即将开启,速来!
- Facebook 又双叒崩了!网友:扎克伯格一周只上三天班?
- 我为“十四五”建言丨中国移动研究院副院长魏晨光:以5G助力“双循环”新发展格局
赞助链接