碰见一个问题(后期有空补图)
使用 antd Select、DatePiker
等会弹出浮层的组件时,浮层会一直存在,在滚动屏幕时,不会自动关闭浮层。
前提条件:
如果你的 getPopupContainer
(也可以是类似的功能参数) 未填,默认渲染到body上,但是页面中的 滚动条 并不依赖于 body 而是页面中其他的元素,属于div中的内滚动条。这时,浮层由于是相对于body定位,无论怎么滚动div内滚动条,浮层便会依赖于body定位,永久处于屏幕中的某个位置不变。
如果浮层一直在这个位置,自然会影响我们滚动时看其他数据。
如果将滚动条所在的节点传入 getPopupContainer
便不会有这个问题,这是因为浮层会相对于滚动条所在的位置 absolute 定位。
但是当前的场景无法使用 getPopupContainer
,这时可以用另外一种 hack 的办法。
hack
尝试后可知道,在点击出浮层后,点击页面中其他任意位置,便可以关闭浮层。所以可以利用这个方式,在滚动时来关闭浮层。
这时候便可以模拟一个事件来触发这个操作
1 | const input = document.querySelector('input') |
利用 dispatchEvent 来模拟点击事件,来触发antd的关闭浮层的操作。(至于为什么是touchstart,可以自己看看源码,或者直接点击测试)