| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- import type { App } from 'vue';
- /**
- * 按钮波浪指令
- * @directive 默认方式:v-waves,如 `<div v-waves></div>`
- * @directive 参数方式:v-waves=" |light|red|orange|purple|green|teal",如 `<div v-waves="'light'"></div>`
- */
- 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: { [key: string]: unknown }) {
- let style: string = '';
- for (let i in obj) {
- if (obj.hasOwnProperty(i)) style += `${i}:${obj[i]};`;
- }
- return style;
- }
- function onCurrentClick(e: { [key: string]: unknown }) {
- 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', () => {});
- },
- });
- }
|