customDirective.ts 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. import type { App } from 'vue';
  2. /**
  3. * 按钮波浪指令
  4. * @directive 默认方式:v-waves,如 `<div v-waves></div>`
  5. * @directive 参数方式:v-waves=" |light|red|orange|purple|green|teal",如 `<div v-waves="'light'"></div>`
  6. */
  7. export function wavesDirective(app: App) {
  8. app.directive('waves', {
  9. mounted(el, binding) {
  10. el.classList.add('waves-effect');
  11. binding.value && el.classList.add(`waves-${binding.value}`);
  12. function setConvertStyle(obj: { [key: string]: unknown }) {
  13. let style: string = '';
  14. for (let i in obj) {
  15. if (obj.hasOwnProperty(i)) style += `${i}:${obj[i]};`;
  16. }
  17. return style;
  18. }
  19. function onCurrentClick(e: { [key: string]: unknown }) {
  20. let elDiv = document.createElement('div');
  21. elDiv.classList.add('waves-ripple');
  22. el.appendChild(elDiv);
  23. let styles = {
  24. left: `${e.layerX}px`,
  25. top: `${e.layerY}px`,
  26. opacity: 1,
  27. transform: `scale(${(el.clientWidth / 100) * 10})`,
  28. 'transition-duration': `750ms`,
  29. 'transition-timing-function': `cubic-bezier(0.250, 0.460, 0.450, 0.940)`,
  30. };
  31. elDiv.setAttribute('style', setConvertStyle(styles));
  32. setTimeout(() => {
  33. elDiv.setAttribute(
  34. 'style',
  35. setConvertStyle({
  36. opacity: 0,
  37. transform: styles.transform,
  38. left: styles.left,
  39. top: styles.top,
  40. })
  41. );
  42. setTimeout(() => {
  43. elDiv && el.removeChild(elDiv);
  44. }, 750);
  45. }, 450);
  46. }
  47. el.addEventListener('mousedown', onCurrentClick, false);
  48. },
  49. unmounted(el) {
  50. el.addEventListener('mousedown', () => {});
  51. },
  52. });
  53. }