用 RxJS 使每个 Safari 滚动都更平滑

阅读时长 4 分钟读完

引言

Safari 是一个非常流行的浏览器,但是它有一个显著的缺陷 - 其滚动效果不如其他浏览器平滑。有些人认为这是因为 Safari 使用了默认的系统滚动方式,而不是使用硬件加速滚动。但是,这并不是问题的全部原因。

在这篇文章中,我们将介绍如何使用 RxJS,这是一个流式编程的工具库,来实现平滑的滚动效果,让你的用户更加愉悦地使用 Safari。

深入理解滚动

在实现平滑滚动之前,我们需要了解滚动是如何工作的。当用户滚动页面时,浏览器会生成一个事件流,其中会包含许多滚动事件。这些事件包括滚动开始、滚动进行中和滚动结束事件。我们可以使用 RxJS 来处理这个事件流并控制滚动的细节。

使用 RxJS 实现平滑滚动

首先,我们需要添加 RxJS 至你的项目中。你可以通过以下命令在你的项目中安装:

接下来,我们需要创建一个观察者,它会订阅原生的滚动事件流,并通过 RxJS 进行处理:

这里使用了 Rx.fromEvent 来创建一个可观察对象来订阅原生的滚动事件。我们将它从滚动事件中分离出来,并仅仅观察 window.scrollY 属性的变化。我们可以使用 map 运算符来筛选出要观察的值。接着,我们使用 distinctUntilChanged 运算符来确保只有在值发生了真正的变化时才会发送值。然后,我们使用 debounceTime 运算符来限制发出事件的速率。最后,我们添加了 share 运算符来确保该可观察对象将始终与所有的观察者共享。

接下来,我们通过订阅该可观察对象,并使用处理后的值来控制滚动:

-- -------------------- ---- -------
----- ------------------ - --------------------------- -- -
  ----- ------------- - -----------------------
  -- -------------- ---------- ------------ -
    ---------------------
  -
  -----------------
    ---- --------
    --------- ---------
  ---
---

通过订阅可观察对象并获取 scrollY 的最新值,我们可以使用 scrollTo 方法来平滑地滚动页面到该值。这里我们还添加了一些额外的代码来确保不会让任何正在聚焦的元素在滚动时出现问题。

示例代码

-- -------------------- ---- -------
------ - --------- - ---- -------
------ - ---- --------------------- ------------- ----- - ---- -----------------

----- ------- - ----------------- ---------------
  ------ -- ----------------
  -----------------------
  -----------------
  -------
--

----- ------------------ - --------------------------- -- -
  ----- ------------- - -----------------------
  -- -------------- ---------- ------------ -
    ---------------------
  -
  -----------------
    ---- --------
    --------- ---------
  ---
---

结论

使用 RxJS 可以很容易地处理滚动事件,并控制页面的滚动效果。在这篇文章中,我们使用 RxJS 的一些运算符来实现平滑的滚动效果,可以让你的用户更加愉悦地使用 Safari。如果你还没有使用 RxJS 来管理你的项目中的事件或数据流,那么 RxJS 是一款可以考虑了解加入你的工具库的工具。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/66f5f911c5c563ced57e2066

纠错
反馈