# mouse effects
# tilt
import { gsap } from 'gsap/all'
/**
*
*/
class tilt {
/**
*
* @param container {String} マウスの動かす領域
* @param target {String} 動かす対象
* @param perspective {Number} Z 深度の係数
* @param duration {Number} 動くスピード
* @param fixer {Number} エフェクトを軽減する度合
* @param reverse {Boolean} 傾きの z 深度を反転させる
*/
constructor(container, target, perspective = 1200, duration = 1, fixer = .02, reverse = false) {
this.container = document.getElementById(container);
this.targets = [...this.container.querySelectorAll(target)];
this.perspective = perspective;
this.dutation = duration;
this.reverse = reverse ? 1 : -1;
this.addEvent();
this.leaveEvent();
}
mouseMove(event) {
const pageX = event.layerX - this.container.offsetWidth * 0.5;
const pageY = event.layerY - this.container.offsetHeight * 0.5;
this.targets.forEach(el => {
const target = el;
const speedX = target.dataset.speedX;
const speedY = target.dataset.speedY;
const tiltx = pageY / (this.container.offsetWidth * 0.5);
const tilty = pageX / (this.container.offsetHeight * 0.5) * -1;
const radius = Math.sqrt(tiltx ** 2 + tilty ** 2);
const degree = radius * 15;
gsap.set(target, {transformPerspective: this.perspective});
gsap.to(target, this.dutation, {
x: (target.offsetLeft + pageX * speedX) * this.fixer,
y: (target.offsetTop + pageY * speedY) * this.fixer,
rotationX: tiltx * degree * this.reverse,
rotationY: tilty * degree * this.reverse,
ease: 'Power2.out',
});
});
}
mouseLeave() {
this.targets.forEach(el => {
gsap.to(el, .85, {
x: 0,
y: 0,
rotationX: 0,
rotationY: 0,
ease: 'Power2.out',
});
});
}
addEvent() {
const event = (e) => this.mouseMove(e);
this.container.addEventListener('mousemove', event);
}
leaveEvent() {
const event = (e) => this.mouseLeave(e);
this.container.addEventListener('mouseleave', event);
}
}
export default tilt;
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
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
# skew
import { gsap } from 'gsap/all'
import _event from './utility/EventListener'
/**
* Effect tilting the element to make it look like 3D
* 要素を傾けて3Dのように見せるエフェクト
*/
class skewElement {
/**
* @param wrapper {Object} id element
* @param target {Object} some elements
*/
constructor(wrapper, target) {
this.app = document.getElementById(wrapper);
this.target = target;
this._eventList = []
this.app && this.init();
}
init() {
const handleMouseMove = (e) => this.mouseMoveFn(e);
const handleMouseLeave = (e) => this.mouseLeaveFn(e);
this._eventList.push(new _event(this.app, 'mousemove', handleMouseMove))
this._eventList.push(new _event(this.app, 'mouseleave', handleMouseLeave))
}
destroy() {
this._eventList.forEach(event => event.destroyed())
}
mouseMoveFn(e) {
let xMouse = e.pageX - e.currentTarget.getBoundingClientRect().left - (e.currentTarget.offsetWidth / 2),
yMouse = e.pageY - window.pageYOffset - e.currentTarget.getBoundingClientRect().top - (e.currentTarget.offsetHeight / 2);
let mouseElements = [...e.currentTarget.querySelectorAll(this.target)];
mouseElements.forEach(el => {
let factor = el.dataset.mouseParallax,
xFinal = xMouse * factor,
yFinal = yMouse * factor;
gsap.to(el, 1.2, {
x: xFinal,
y: yFinal,
skewX: xFinal * 0.05,
skewY: xFinal * 0.05,
});
});
};
mouseLeaveFn(e) {
const mouseElements = [...e.currentTarget.querySelectorAll(this.target)];
mouseElements.forEach(el => {
gsap.to(el, 1.2, {
x: 0,
y: 0,
skewX: 0,
skewY: 0,
});
});
};
}
export default skewElement;
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
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
← GSAP3 reveal effects →