forked from muicss/mui
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathripple.js
More file actions
122 lines (96 loc) · 3.18 KB
/
ripple.js
File metadata and controls
122 lines (96 loc) · 3.18 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/**
* MUI CSS/JS ripple module
* @module ripple
*/
'use strict';
var jqLite = require('./lib/jqLite'),
util = require('./lib/util'),
animationHelpers = require('./lib/animationHelpers'),
supportsTouch = 'ontouchstart' in document.documentElement,
mouseDownEvents = (supportsTouch) ? 'touchstart' : 'mousedown',
mouseUpEvents = (supportsTouch) ? 'touchend' : 'mouseup mouseleave';
/**
* Add ripple effects to button element.
* @param {Element} buttonEl - The button element.
*/
function initialize(buttonEl) {
// check flag
if (buttonEl._muiRipple === true) return;
else buttonEl._muiRipple = true;
// exit if element is INPUT (doesn't support absolute positioned children)
if (buttonEl.tagName === 'INPUT') return;
// attach event handler
jqLite.on(buttonEl, mouseDownEvents, mouseDownHandler);
}
/**
* MouseDown Event handler.
* @param {Event} ev - The DOM event
*/
function mouseDownHandler(ev) {
// only left clicks
if (ev.type === 'mousedown' && ev.button !== 0) return;
var buttonEl = this,
rippleEl = buttonEl._rippleEl;
// exit if button is disabled
if (buttonEl.disabled) return;
if (!rippleEl) {
// add ripple container (to avoid https://github.com/muicss/mui/issues/169)
var el = document.createElement('span');
el.className = 'mui-btn__ripple-container';
el.innerHTML = '<span class="mui-ripple"></span>';
buttonEl.appendChild(el);
// cache reference to ripple element
rippleEl = buttonEl._rippleEl = el.children[0];
// add mouseup handler on first-click
jqLite.on(buttonEl, mouseUpEvents, mouseUpHandler);
}
// get ripple element offset values and (x, y) position of click
var offset = jqLite.offset(buttonEl),
clickEv = (ev.type === 'touchstart') ? ev.touches[0] : ev,
radius,
diameter;
// calculate radius
radius = Math.sqrt(offset.height * offset.height +
offset.width * offset.width);
diameter = radius * 2 + 'px';
// set position and dimensions
jqLite.css(rippleEl, {
width: diameter,
height: diameter,
top: Math.round(clickEv.pageY - offset.top - radius) + 'px',
left: Math.round(clickEv.pageX - offset.left - radius) + 'px'
});
jqLite.removeClass(rippleEl, 'mui--is-animating');
jqLite.addClass(rippleEl, 'mui--is-visible');
// start animation
util.requestAnimationFrame(function() {
jqLite.addClass(rippleEl, 'mui--is-animating');
});
}
/**
* MouseUp event handler.
* @param {Event} ev - The DOM event
*/
function mouseUpHandler(ev) {
// get ripple element
var rippleEl = this._rippleEl;
// allow a repaint to occur before removing class so animation shows for
// tap events
util.requestAnimationFrame(function() {
jqLite.removeClass(rippleEl, 'mui--is-visible');
});
}
/** Define module API */
module.exports = {
/** Initialize module listeners */
initListeners: function() {
// markup elements available when method is called
var elList = document.getElementsByClassName('mui-btn'),
i = elList.length;
while (i--) initialize(elList[i]);
// listen for new elements
animationHelpers.onAnimationStart('mui-btn-inserted', function(ev) {
initialize(ev.target);
});
}
};