使用过 Antd
的小伙伴应该深有体会,但是我们用的多了,也就想了解它怎么做的(:跟我一样吧
乍一看实现方式并不难,但是其实本篇文章更想表述一些细节的内容。
目标能力
构造容器
其实大家大可关注到精髓点:
createPortal
getBoundingClientRect
createPortal
的目的是脱离文档流,getBoundingClientRect
是为了拿到目标元素的具体位置 坐标
、宽高
。
我们可以设置 Popover
的模式,大体分为两种 hover
和 click
模式:
click
hover
- 监听
onMouseEnter
- 监听
onMouseLeave
到这里,你觉得结束了吗?
答案是:没有,因为我们要考虑,点击模式常驻屏幕,滚动跟随移动的场景。
在这里我们借助 ResizeObserver
来实现:
兼容性还是可以的,但是我们依旧要考虑我们程序的鲁棒性:
到此,一个简单的跟随移动 Popover
就实现了,如果你有更好的想法 ,欢迎交流~