【发布时间】:2019-10-17 09:19:24
【问题描述】:
好吧,伙计们,这对你们所有的巫师来说都是一个棘手的问题......
我正在开发一个沉浸式网络应用程序,它会覆盖移动设备上的默认触摸滚动行为。内容分为使用 100% 视口的页面,并且导航是通过在页面之间之间上下滑动来处理的。
在第一次滑动时,我在 body 元素上调用 requestFullscreen(),这当然会在视口调整大小时导致回流。问题是我还希望第一次滑动来触发自定义滚动行为,但我使用的是Element.nextElementSibling.scrollIntoView({ block : start, behavior : 'smooth' }),直到回流完成,下一页的顶部边缘(HTMLSectionElement)已经可见,所以滚动不不会发生。
如果我使用 setTimeout 等待大约 600 毫秒,直到回流完成,滚动效果会按预期工作,但我对这种 hacky 解决方法不满意,我更喜欢使用更优雅的异步解决方案。
我首先尝试从 requestFullscreen 返回的 Promise 的 resolve 执行器内部触发滚动效果,但这没有帮助。这个承诺在执行流程的早期就解决了。
然后我从fullscreenchange 事件处理程序内部尝试。这里也没有运气,因为此事件在全屏更改发生之前立即触发。
最后,我从窗口resize 事件处理程序内部尝试,但这会在回流发生之前触发。我也在这里添加了requestIdleCallback,但没有任何区别。
所以我的问题是...... 有没有可靠的方法来检测回流操作的结束? 或者......有没有人有比放弃使用 @987654332 更好的 B 计划@ 并将我自己的滚动效果编码到窗口调整大小处理程序中。
【问题讨论】:
-
reflow 操作是同步的。可能不是什么时候调用它。见this answer of mine。所以,不,你并不是真的在寻找“检测回流操作的结束”。不过,我不确定您在寻找什么,因为您的问题缺少minimal reproducible example。也许您更愿意“强制”重排,以便在您开始滚动时 CSSOM 是最新的,或者您愿意检测调整大小何时结束?但你没有问正确的问题。
-
大约 2 年前,我问过这个问题,是关于我当时正在开发的一个网络应用程序的一个具体问题。不幸的是,
Fullscreen API请求在iframe元素中不起作用,因此添加一个有效的问题 sn-p 是不可行的。无论如何,我 2 年前遇到的具体问题已经不再重要,所以我可能会做的就是重写这个问题,使其成为一个对更广泛的受众更通用和有用的问题。
标签: javascript html window-resize reflow html5-fullscreen