flubberライブラリを使ったモーフィングするclippath画像を作ってみよう
こんにちわ。nap5です。
flubberライブラリを使ったモーフィングするclippath画像を作ってみたので紹介したいと思います。
twitterにも投稿してみました。
flubberライブラリはこちらです。
https://github.com/veltman/flubber
デモサイトです。
デモコードです。
コードも公開しているので、細かいのはそちらを見ていただくことにして、ポイントとなる点を抜粋します。
d3.pairs関数でfrom,toの形式に持ち替えているのがポイントです。データとして最初のパスコマンドstep1と最後のパスコマンドstep4を同じにしておくのがポイントになります。
const paths = {
step1: `M 17.352 24.122 C 31.685 -5.294 116.95 15.677 85.721 37.603 C 66.299 51.239 71.047 71.079 70.08 80.846 C 68.017 101.68 29.658 88.662 19.736 69.653 C 13.019 56.787 11.17 36.808 17.352 24.122 Z`,
step2: `M 40.185 33.49 C 48.118 21.773 59.756 22.799 75.15 38.316 C 86.578 49.835 78.14 65.96 62.042 77.212 C 48.267 86.841 29.623 79.343 21.566 64.069 C 16.111 53.731 33.832 42.873 40.185 33.49 Z`,
step3: `M 20.164 23.213 C 28.097 11.496 44.54 -0.692 59.934 14.825 C 71.362 26.344 78.14 65.96 62.042 77.212 C 48.267 86.841 29.623 79.343 21.566 64.069 C 16.111 53.731 13.811 32.596 20.164 23.213 Z`,
step4: `M 17.352 24.122 C 31.685 -5.294 116.95 15.677 85.721 37.603 C 66.299 51.239 71.047 71.079 70.08 80.846 C 68.017 101.68 29.658 88.662 19.736 69.653 C 13.019 56.787 11.17 36.808 17.352 24.122 Z`,
};
細かい調節をするケースを想定した場合、この手のアニメーションは汎用化等は特別せずに、べたで書くのが無難だと思います。
flubberライブラリの場合はmaxSegmentLengthを小さくしておくことで、線画境界がスムースになります。それでも結構大きいサイズでみるとカクカクしているので、サイズは小さめにしておいた方がいいかもしれません。
useEffect(() => {
const pathList = Object.entries(paths).map((item) => {
return item[1];
});
const pairs = d3.pairs(pathList);
const pathDom = pathDomRef.current;
const doMorph = ({pathDom, pathList, delay}) => {
d3.select(pathDom)
.transition()
.delay(delay)
.duration(1700)
.attrTween('d', function (d) {
return interpolate(pathList[0][0], pathList[0][1], {
maxSegmentLength: 1,
});
})
.transition()
.delay(delay)
.duration(1000)
.attrTween('d', function (d) {
return interpolate(pathList[1][0], pathList[1][1], {
maxSegmentLength: 1,
});
})
.transition()
.delay(delay)
.duration(1800)
.attrTween('d', function (d) {
return interpolate(pathList[2][0], pathList[2][1], {
maxSegmentLength: 1,
});
})
.on('end', function () {
return doMorph({pathDom, pathList, delay});
});
};
doMorph({pathDom, pathList: pairs, delay: 200});
}, []);
最近では、Twitterでモックアップ動画を公開しているので、こちらもよかったら、覗いてみてください。
最後に、Udemyでコースを公開しました。
良かったら覗いてみてください。
また、コースの内容紹介記事は以下になります。
簡単ですが、以上です。