2021-04-30 16:15:43 +08:00
|
|
|
import type { App } from 'vue';
|
|
|
|
|
|
|
|
// 按钮波浪指令
|
|
|
|
export function wavesDirective(app: App) {
|
|
|
|
app.directive('waves', {
|
|
|
|
mounted(el, binding) {
|
|
|
|
el.classList.add('waves-effect');
|
|
|
|
binding.value && el.classList.add('waves-' + binding.value);
|
|
|
|
function setConvertStyle(obj: any) {
|
|
|
|
let style: string = '';
|
|
|
|
for (let i in obj) {
|
2021-05-02 21:24:41 +08:00
|
|
|
if (obj.hasOwnProperty(i)) style += `${i}:${obj[i]};`;
|
2021-04-30 16:15:43 +08:00
|
|
|
}
|
|
|
|
return style;
|
|
|
|
}
|
|
|
|
function onCurrentClick(e: any) {
|
|
|
|
let elDiv = document.createElement('div');
|
|
|
|
elDiv.classList.add('waves-ripple');
|
|
|
|
el.appendChild(elDiv);
|
|
|
|
let styles = {
|
|
|
|
left: `${e.layerX}px`,
|
|
|
|
top: `${e.layerY}px`,
|
|
|
|
opacity: 1,
|
|
|
|
transform: `scale(${(el.clientWidth / 100) * 10})`,
|
|
|
|
'transition-duration': `750ms`,
|
|
|
|
'transition-timing-function': `cubic-bezier(0.250, 0.460, 0.450, 0.940)`,
|
|
|
|
};
|
|
|
|
elDiv.setAttribute('style', setConvertStyle(styles));
|
|
|
|
setTimeout(() => {
|
|
|
|
elDiv.setAttribute(
|
|
|
|
'style',
|
|
|
|
setConvertStyle({
|
|
|
|
opacity: 0,
|
|
|
|
transform: styles.transform,
|
|
|
|
left: styles.left,
|
|
|
|
top: styles.top,
|
|
|
|
})
|
|
|
|
);
|
|
|
|
setTimeout(() => {
|
|
|
|
elDiv && el.removeChild(elDiv);
|
|
|
|
}, 750);
|
|
|
|
}, 450);
|
|
|
|
}
|
|
|
|
el.addEventListener('mousedown', onCurrentClick, false);
|
|
|
|
},
|
|
|
|
unmounted(el) {
|
|
|
|
el.addEventListener('mousedown', () => {});
|
|
|
|
},
|
|
|
|
});
|
|
|
|
}
|