Customizable, lightweight React hook for implementing Google's Material UI style ripple effect
npm install use-ripple-hook
npm install use-ripple-hook
`
or
`
yarn add use-ripple-hook
`Usage
`tsx
import React from "react";
import useRipple from "use-ripple-hook";function Button() {
const [ripple, event] = useRipple();
return (
);
}
`Options
$3
`ts
useRipple({
duration: 450,
color: "rgba(255, 255, 255, .3)",
cancelAutomatically: false,
className: "__useRipple--ripple",
containerClassName: "__useRipple--ripple-container",
ignoreNonLeftClick: true,
timingFunction: "cubic-bezier(.42,.36,.28,.88)",
disabled: false,
ref: internalRef,
onSpawn: undefined,
});
`
$3
| Property | Description | Type | Default | Optional |
| --------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------- | ------------------------------- | -------- |
| duration | Duration in milliseconds | number | 450 | ✔️ |
| color | Color of the ripple effect | string | rgba(255, 255, 255, .3) | ✔️ |
| cancelAutomatically | If true, the ripple will begin to cancel after 40% of the duration | boolean | false | ✔️ |
| className | The ripple element's class name | string | __useRipple--ripple | ✔️ |
| containerClassName | The container element for the ripples | string | __useRipple--ripple-container | ✔️ |
| ignoreNonLeftClick | If false, non left click events such as right click and middle click will also trigger ripples | boolean | true | ✔️ |
| timingFunction | Transition timing function of the transform animation | string | cubic-bezier(.42,.36,.28,.88) | ✔️ |
| disabled | If true, no ripples will be spawned | boolean | false | ✔️ |
| ref | Optional outside ref, if unset, internal ref will be used | React.RefObject | undefined | ✔️ |
| onSpawn | A callback which is triggered when a ripple is spawned | options.onspawn | undefined | ✔️ |$3
Type
`ts
type OnSpawnCB = (ctx: {
/* the ripple element /
readonly ripple: HTMLDivElement; /* cancels the current ripple animation /
readonly cancelRipple: () => void;
/* the ref to the ripple host element /
readonly ref: React.RefObject;
/* the event that triggered the ripple (ts: casting required) /
readonly event: unknown;
/* the ripple container element /
readonly container: HTMLDivElement;
}) => void;
`
Example
`js
useRipple({
/ ... /
onSpawn: ({
ripple, ref, event, container
}) => {
console.table({ ripple, ref, event, container });
}
});
`Perfect circle
As demonstrated in the below GIF, useRipple adjusts the circle size to always for the host element's border box.Higher order function (HOF)
If you want to memoize a configuration for your ripple you can use the built in
customRipple() function.You can override the options you memoized for your custom ripple hook. The two options will be merged.
$3
`tsx
import { customRipple } from "use-ripple-hook";const useMyRipple = customRipple({
color: "rgb(144, 238, 144, .7)",
duration: 700,
});
function Button() {
const [ripple, event] = useMyRipple({}); // Optionally override previous config
return (
);
}
`This is useful if you want to avoid repetition in your code or if you want multiple different ripple effects for different components.
Examples
For examples of useRipple usage please click here.Dos and don'ts
$3
Using components 👍
`jsx
import React from "react";
import useRipple from "use-ripple-hook";function App() {
return (
<>
>
)
}
function Button({ color }) {
const [ripple, event] = useRipple({ color });
return (
);
}
`$3
Sharing references 👎
`jsx
import React from "react";
import useRipple from "use-ripple-hook";function App() {
const [ripple, event] = useRipple();
/ This will NOT work! Do not do this /
return (
<>
>
)
}
``