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

Sep 18, 202210 min read

This post was last modified 569 days ago, and some of the content may be outdated.

最近把 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 参数,这个参数可以让你控制动效的展现方式, 可以发现切换时候那个小球有个弹簧反弹效果。 你可以自己尝试修改一下参数,查看他们有什么不同, 我在这里推荐一个可视化配置工具

HITS

LAST UPDATED

Sep 18, 2022
Made withbyXiaojun