波紋が広がるようなボタンエフェクト(リップルアニメーション)を実装する手順です。CSS、Javascriptを用いて実装します。
目次
達成出来ること
- 波紋エフェクト(リップルアニメーション)ボタンを作成する
ボタンの作成
まずは適当にボタンを作成します。
<!-- html -->
<button class="btn">波紋エフェクト</button>
/* css */
.btn {
border: none;
user-select: none;
outline: none;
padding: 10px 25px;
color: #ffffff;
background: #4fc3f7;
text-align: center;
}
このような感じになります。
アニメーション用CSSの作成
CSSに下記の定義を追加します。
/* css */
.ripple {
position: relative;
overflow: hidden;
}
.ripple .ripple-active {
position: absolute;
pointer-events: none;
background: #FFF;
border-radius: 50%;
transform: scale(0);
animation: ripple .8s;
opacity: .3;
}
@keyframes ripple {
to {
opacity: 0;
transform: scale(2.0);
}
}
アニメーション用Javascriptの作成
下記のJavascriptを作成します。
// javascript
(() => {
const rippleEffect = (event) => {
let target = event.target;
if (!target) {
return;
}
const cover = document.createElement('span');
const coverSize = target.offsetWidth;
const loc = target.getBoundingClientRect();
const x = event.pageX - loc.left - window.pageXOffset - (coverSize / 2);
const y = event.pageY - loc.top - window.pageYOffset - (coverSize / 2);
const pos = `top: ${y}px; left: ${x}px; height: ${coverSize}px; width: ${coverSize}px;`;
target.appendChild(cover);
cover.setAttribute('style', pos);
cover.setAttribute('class', 'ripple-active');
setTimeout(() => {
cover.remove();
}, 2000);
};
document.addEventListener('DOMContentLoaded', () => {
Array.from(document.querySelectorAll('.ripple')).forEach((elem) => {
elem.addEventListener('click', rippleEffect)
});
});
})();
このスクリプトはDOMの構築が終了した時点で発火しますが、構築後動的に追加される要素(button.ripple
)に対しては影響出来ないため、必要に応じてカスタマイズが必要です。
ボタンに対してアニメーション用のクラスを設定
最初に準備したボタン要素に.ripple
クラスを追加します。
<!-- html -->
<button class="btn ripple">波紋エフェクト</button>
デモ
最終的にこうなります。
参考
波紋の色を変更したい場合は、.ripple-active
のbackground
を変更すればOKです。
/* css */
.ripple.ripple-dark .ripple-active {
background: #000;
}
<!-- html -->
<button class="btn ripple ripple-dark">波紋エフェクト</button>
結果