123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- // https://forum.vuejs.org/t/how-to-use-helper-functions-for-imported-modules-in-vuejs-vue-template/6266/5
- export default {
- directives: {
- lazy: {
- bind (figure, binding) {
- // console.log('directive lazy bind', figure, binding)
- // show only the first image
- if (binding.value === 0) {
- const img = figure.querySelector('img:not(.blank)')
- figure.classList.add('loading')
- img.addEventListener('load', function (e) {
- // console.log('img loaded', e)
- figure.classList.remove('loading')
- figure.classList.add('loaded')
- })
- img.addEventListener('error', function (e) {
- console.error('img ERROR', e)
- e.target.classList.remove('loading')
- e.target.classList.add('error')
- })
- img.setAttribute('src', img.getAttribute('data-src'))
- // img.removeAttribute('data-src')
- // img.classList.remove('lazy')
- }
- }
- },
- switcher: {
- inserted (el, binding) {
- // switch images on mousemove
- el.addEventListener('mousemove', function (event) {
- const figs = this.querySelectorAll('figure.loaded')
- // console.log('mousemove', figs.length, this, event)
- // let len = figs.length
- // let w = this.clientWidth;
- // let g = w / len;
- // let delta = Math.floor(event.layerX / g)
- // console.log(event.offsetX, this.clientWidth, figs.length)
- // console.log(event.offsetX / (this.clientWidth / figs.length))
- let delta = Math.floor(event.offsetX / (this.clientWidth / figs.length))
- delta = delta < 0 ? 0 : delta >= figs.length ? figs.length - 1 : delta
- // console.log('delta', delta)
- figs.forEach((fig, index) => {
- // console.log(index)
- if (index === delta) {
- // fig.style.display = "block"
- fig.classList.remove('hide')
- fig.classList.add('show')
- } else {
- // fig.style.display = "none"
- fig.classList.remove('show')
- fig.classList.add('hide')
- }
- })
- })
- }
- }
- },
- mounted () {
- // lazy load images on mouseover
- // console.log('card mounted', this.$options.name)
- // if (this.$options.name ==! 'ModalCard') {
- this.activateLazyLoad()
- // }
- },
- updated () {
- // lazy load images on mouseover
- // console.log('card updated', this.$options.name)
- // if (this.$options.name ==! 'ModalCard') {
- this.activateLazyLoad()
- // }
- },
- methods: {
- // used by ModalCard
- activateLazyLoad () {
- // console.log('card activateLazyLoad', this.$options.name)
- this.$el.addEventListener('mouseover', function (event) {
- const figures = this.querySelectorAll('.images figure.lazy:not(.loaded):not(.loading)')
- console.log('mouseover', this, figures)
- figures.forEach((figure, index) => {
- const img = figure.querySelector('img:not(.blank)')
- // console.log('forEach img',img)
- img.classList.add('loading')
- img.addEventListener('load', function (e) {
- // console.log('img loaded', e)
- figure.classList.remove('loading')
- figure.classList.add('loaded')
- })
- img.addEventListener('error', function (e) {
- console.error('img ERROR', figure, e)
- })
- const src = img.getAttribute('data-src')
- // for debug purpose
- console.log(figures.length, index)
- // let src = img.getAttribute('data-src')
- // if (index > 0 && index < figures.length - 1) {
- // src = img.getAttribute('data-src').replace('?', '/bad?')
- // }
- img.setAttribute('src', src)
- // img.removeAttribute('data-src')
- // img.classList.remove('lazy')
- })
- }, { once: true })
- }
- }
- }
|