Googleマテリアルデザインのripple(リップル)を本気で取り組んでみた

Googleマテリアルデザインでも最も重要な部分に当たるripple(リップル)に挑戦してみました。参考にしたのはもちろんGoogle。

先ずはripple(リップル)の説明ですが、マウスや指でボタン(リンク)をクリック(タップ)すると波紋(ripple)が発生して触った感覚を視覚的に演出する手法のことです。

今回は以下のボタンをメインに製作を行ってみました。

完成したのが以下になります。CodePenにてソースは実装公開しております。

See the Pen Googleマテリアルデザインripple(リップル) by yoshiaki nakao (@woopeer) on CodePen.

Google実装例を確認してみて分かった事なのですが、さすがGoogle!といったものでした。

アニメーションはすべてCSSで行われており、とてもスムーズな動きを実現させています。Javascriptでクラス名を変更する事でリップルアニメーションを実現させています。ただクラス名を変更するだけでは、リップルのスタート位置やサイズが変更できないのですが、Javascriptでスタート位置、エンド位置、サイズ、拡大サイズの4つの変数をCSS変数を指定する方法でCSSアニメーションに渡しています。

実装例ですが、「ripple-radius-in」というアニメーションを「--ripple-start」「--ripple-end」「--ripple-scale」という3つの変数で用意しておきマウスイベント等で発火させマウス座標やサイズ等を「style.cssText」で自身に設定するといった方法で変数をCSSに渡しています。CSSアニメーションに変数を渡すというのが私には発想がなかったので結構衝撃的でした。とても勉強になりました。今後、活用していきたいと思います。

CSS
@keyframes ripple-radius-in {
  from { transform: translate(var(--ripple-start, 0)) scale(1); }
  to { transform: translate(var(--ripple-end, 0)) scale(var(--ripple-scale, 1)); }
}
Javascript
element.addEventListener('mousedown', function(e){
this.style.cssText =
    "--ripple-scale:" + v_rippleScale + ";" +
    "--ripple-start:" + start_x + "px," + start_y + "px;"+
    "--ripple-end:" + end_x + "px," + end_y + "px;";
}, false);

ところで、Google実装例でGoogleとしてSEO的にこれはどうなの?という部分もございました。リップルの実装を<div class="mdc-button__ripple"></div>というブロックで行っており、これはW3Cで定義されている「デザインのために空要素を追加してはいけない」に反する行為となってしまいます。あくまで推測なのですが、リップルを擬似要素「::before」「::after」で実装している関係で、既に疑似要素を使用している場合などでは使用が困難になる場合が出てきてしまい汎用的に使用したい要望があったのかもしれません。ただ、リップルを使う場面で疑似要素を使う場面は少ないと思いますし、もしそのような場合でも内側に要素追加すれば対処は可能かと思いましたので、今回は「ripple」というクラス名だけで実装できるようにいたしました。

コメント

このブログの人気の投稿

パタパタ時計flip clockを作ってみた

「…続きを読む」リンク

100マス計算をwebで作ってみた