用 react-spring 开发一个灵动的黑暗模式切换按钮

Sep 18, 202210 min read

此文最后修改于 670 天前,可能包含很多不再适用的废话,阅读需谨慎~

最近把 blog 右上角的黑暗模式切换按钮重写了一下,为此还学了学 Figma,虽然技术不难,但是收获颇多,至少自己可以照猫画虎设计一些简单的 SVG 图形了, 废话不多说,下边我介绍一下我是怎样使用 react-spring 来实现如此丝滑的切换动画的,你可以点击下方按钮进行体验, 为了蹭一波 iPhone 灵动岛 热度,我标题还特意用了 灵动 这俩字 🤣。

👈 戳我

准备工作

写之前先拆解一下该组件的元素构成,大概分为以下四部分:

  1. 整个 switch 容器,主题切换时动态修改背景色
  2. 中间的小球,黑暗模式是月球,浅色模式是太阳
  3. 左侧的星星,黑暗模式下显示
  4. 右侧的云(姑且称它为云,过于抽象了点),浅色模式下显示

其中 1 和 2 这里直接用 div 来写,3 和 4 我们可以用 SVG 来弄。

黑暗模式情况下,中间的小球会变成月球,它里边有三颗月球坑我们也直接用 div 来模拟

SVG 我是用 Figma 来画的,我这里直接提供一下代码,有能力的也可以自己画一些不一样的图形。

云朵

SVG

星星 ✨

SVG

组件搭建

资源准备好后,让我们先把整个组件的样板代码写出来

TSX

上述代码中我使用了 TailwindCSS,如果你不喜欢,请把他替换成普通的样式写法。

写到这里,一个基础框架就算完成了,不过现在它是一点动效都没有,显得很生硬,接下来让它动起来。

动效

动画库我使用的是 react-spring,它是一个模仿弹簧效果的动画库,可以使你的组件更生动,具体的文档大家可以去官网看。 然后有时间可以看看这个大佬的演讲视频,介绍了类似的动效理念,英语渣的我全程开着汉语机翻看完的。

Cheng Lou - The State of Animation in React at react-europe 2015A talk on the past, the present and the future of animation, and the place React can potentially take in this. I will be focusing on a few experiments on ani...
og

小球

让我们先弄中间小球的左右切换动效,毕竟它是最显眼的一个。

TSX

星星和云朵

接下来再弄星星和云朵的动画

星星动效

TSX

星星动效同时使用缩放、不透明度与旋转,并错开运行,看着有种 bulingbuling 的感觉。

云朵动效

TSX

容器

容器动效很简单,只有一个背景色

TSX

最终代码

动效配置编写完毕后,把它们绑定到元素上,最终的代码如下

TSX

注意一点,把动效绑定到元素上时,该元素必须是 animated.xxx,原生元素必须被 react-spring 包裹后动效才可用。 另外可以看到我在使用 useSpringuseTranslation 时传入了一个 config 参数,这个参数可以让你控制动效的展现方式, 可以发现切换时候那个小球有个弹簧反弹效果。 你可以自己尝试修改一下参数,查看他们有什么不同, 我在这里推荐一个可视化配置工具

浏览量

最后修改于

Sep 18, 2022
Made withbyXiaojun Zhou