1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
|
const pNodeInit = (el, isAbs) => { if (!isAbs) el.style.position = 'relative' el.style.overflow = 'hidden' el.style['webkit-backface-visibility'] = 'hidden' el.style['-webkit-transform'] = 'translate3d(0, 0, 0)' }
const emitRippleNode = (color, target) => { if (!target) { target = document.createElement('span') target.className = 'ripple' } target.style.background = `radial-gradient(ellipse 50% 50% at 50% 50%, ${color || 'rgba(255,255,255,.8)'} 80%,rgba(0,0,0,0) 100%)` return target }
const listenerClick = () => { let time const start = event => { if (time) return const rippleNode = event.target.querySelector('span[class="ripple"]') rippleNode.style.left = event.offsetX + 'px' rippleNode.style.top = event.offsetY + 'px' const maxLen = Math.max(event.target.clientHeight, event.target.clientWidth) rippleNode.style.width = maxLen * 2 + 'px' rippleNode.style.height = maxLen * 2 + 'px' rippleNode.style.display = 'block' time = setTimeout(() => { rippleNode.style.display = 'none' time = undefined }, 600) } return start }
const ripple = { bind (el, { value, modifiers }) { pNodeInit(el, modifiers.abs) el.appendChild(emitRippleNode(value)) el.addEventListener('click', listenerClick()) }, unbind (el) { el.removeEventListener('click', listenerClick()) el.removeChild(el.querySelector('span[class="ripple"]')) }, update (el, { value, oldValue }) { if (value === oldValue) return const rippleNode = el.querySelector('span[class="ripple"]') emitRippleNode(value, rippleNode) } }
export default ripple
|