想进一步了解设计思路相关信息,可以阅读 Instruction 文档。
市面上已经有了一些骨架屏实现方案,但他们或多或少有些问题:
-
骨架屏中的元素不能实现全局连续动画
这是最常见的问题,你会发现骨架屏中显示动画效果的那些元素,是分别执行各自的动画效果,看起来就不那么优雅。
-
只能显示简单的统一颜色变化效果
为了避免暴露问题 1,有些骨架屏方案选择只能让所有动画元素一起执行一个统一的色彩或透明度变化效果,而无法实现色彩线性渐变流转的效果。
-
使用门槛
为了彻底解决上面的两个问题,有些骨架屏方案选择用 svg 来实现,但这样无疑会使得骨架屏组件的使用门槛变高。
skeleton-screen-react 就是为解决这些问题而生!
skeleton-screen-react 使用非常灵活,你可以用很简单的代码来实现一个普通的骨架屏效果
或者把产品名称之类的文字作为骨架屏的占位符,像这样
甚至,如果确实需要的话,你还可以用设计师提供的 SVG 版的产品 Logo 来作为骨架屏的占位符
首先在你的项目中添加对 Laser Pen 的依赖:
yarn add skeleton-screen-react
或者
npm i skeleton-screen-react
接下来在代码中引入 skeleton 组件和它的样式文件
import { Skeleton } from "skeleton-screen-react";
import "skeleton-screen-react/dist/styles/skeleton.css";
再然后,在页面上加载 Skeleton 组件,并设置好相应的属性
<Skeleton
maskColor='#fff'
animationColorBackground='#fafafa'
animationColorHighlight='#ebebeb'
>
{(color: string) => {
// skeleton placeholder elements
return (
<div style={{ position: 'relative', width: '100%', height: '100%', textAlign: 'center', fontSize: '20px', color }}>
skeleton-screen-react<br/>Silent Tiger
</div>
);
}}
</Skeleton>
这样,你就得到了一个以文本 “skeleton-screen-react Silent Tiger” 为占位符的骨架屏效果。
Property | Type | Required | Description |
---|---|---|---|
maskColor | string | Y | 遮罩部分的颜色 |
animationColorBackground | string | Y | 动画效果中的背景色 |
animationColorHighlight | string | Y | 动画效果中高亮的颜色 |
children | (color: string) => ReactElement | Y | 返回骨架屏动画元素的函数 |
wrapperStyle | CSSProperties | 骨架屏组件外层容器自定义样式 | |
backgroundStyle | CSSProperties | 骨架屏背景动画自定义样式 | |
isDarkMode | boolean | 黑暗模式 | |
className | string | 骨架屏组件外层容器自定义 class name |
skeleton-screen-react 的实现方式类似于在一个有着渐变动画效果的背景上覆盖了一层由用户自行定义结构的蒙板,通过 maskColor
、animationColorBackground
、animationColorHighlight
三个属性就可以基本确定骨架屏的整体色彩效果,如下图所示
而 children
函数则定义了“蒙板”的结构,需要注意的是,children
函数接收了一个 color
参数,只需把这个参数赋值给需要“镂空”区域的元素的颜色属性即可,如果镂空的区域是一个矩形区域,则可以把 color
参数赋值给一个 div 的 background-color
样式属性,如果需要镂空的部分是文字,则可以把 color
参数赋值给文字的 color
样式属性,以此类推。
这里要特别提一下 isDarkMode
属性,当 animationColorBackground
所指定的颜色比 maskColor
更浅的时候,记得把 isDarkMode
标记为 true
,否则你可能会在镂空区域的边缘看到一些毛刺,这个属性在你的页面处于黑暗模式的时候可能会很有用。
你可以在这个 Storybook 页面尝试各种属性的效果。
skeleton-screen-react 提供了尽可能灵活的定制能力,如果 skeleton-screen-react 默认的动画效果不能满足你的要求,你可以通过backgroundStyle
属性个性化地修改动画效果,如果 skeleton-screen-react 组件在页面中布局时有特殊需求,也可以通过wrapperStyle
属性进行设置,而且,你还可以通过className
属性再更大范围内修改 skeleton-screen-react 的样式或区分不同类型的 Skeleton。
另外,你还可以通过覆盖 skeleton-screen-react 提供的 css 样式文件来进行更彻底和深入的样式定制开发。
Have fun!
MIT