-
Notifications
You must be signed in to change notification settings - Fork 15
/
fashion-listing-v1.js
63 lines (52 loc) · 2.54 KB
/
fashion-listing-v1.js
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
import { Xt } from 'xtend-library'
import 'xtend-library/src/variables.js'
import gsap from 'gsap'
Xt.mount.push({
matches: '#iframe--fashion-listing-v1 body .block-listing_item', // add your own selector instead of body to contain the code
mount: object => {
// append
if (!object.querySelector('.media_mask')) {
object.querySelector('.media-container').prepend(Xt.createElement('<span class="media_mask"></span>'))
}
// vars
const imgScaleContainer = 0.03
const imgScale = 0.06
const maskOpacityOn = 0.2
const maskOpacityOff = 0.2
const maskOpacityDone = 0.1
// enter
const eventEnter = e => {
const tr = e.target
// img
const img = tr.querySelector('.media-container')
gsap.to(img, { scale: 1 + imgScaleContainer, duration: Xt.vars.timeSmall, ease: 'quart.out' })
const imgInner = tr.querySelector('.media-inner')
gsap.to(imgInner, { scale: 1 + imgScale, duration: Xt.vars.timeBig, ease: 'quart.out' })
// mask
const mask = tr.querySelector('.media_mask')
gsap.set(mask, { height: 0, y: img.offsetHeight, skewY: 0, opacity: maskOpacityOff })
gsap.to(mask, { height: '150%', y: 0, opacity: maskOpacityOn, duration: Xt.vars.timeSmall, ease: 'quart.out' }) // @FIX to cover height: '150%'
gsap.to(mask, { skewY: -10, duration: Xt.vars.timeSmall / 2, ease: 'quart.out' }).eventCallback('onComplete', () => {
gsap.to(mask, { skewY: 0, duration: Xt.vars.timeSmall / 2, ease: 'quart.out' })
})
gsap.to(mask, { opacity: maskOpacityDone, duration: Xt.vars.timeMedium, ease: 'quart.out', delay: Xt.vars.timeSmall })
}
object.addEventListener('mouseenter', eventEnter)
// leave
const eventLeave = e => {
const tr = e.target
// img
const img = tr.querySelector('.media-container')
gsap.to(img, { scale: 1, duration: Xt.vars.timeSmall, ease: 'quart.out' })
const imgInner = tr.querySelector('.media-inner')
gsap.to(imgInner, { scale: 1, duration: Xt.vars.timeBig, ease: 'quart.out' })
// mask
const mask = tr.querySelector('.media_mask')
gsap.to(mask, { height: '50%', y: '-100%', opacity: maskOpacityOff, duration: Xt.vars.timeSmall, ease: 'quart.out' }) // @FIX to cover height: '50%', y: '-100%'
gsap.to(mask, { skewY: 10, duration: Xt.vars.timeSmall / 2, ease: 'quart.out' }).eventCallback('onComplete', () => {
gsap.to(mask, { skewY: 0, duration: Xt.vars.timeSmall / 2, ease: 'quart.out' })
})
}
object.addEventListener('mouseleave', eventLeave)
},
})