vuetify
Version:
Vue.js 2 Semantic Component Framework
98 lines (82 loc) • 1.71 kB
JavaScript
require('../../stylus/components/_parallax.styl')
import Translatable from '../../mixins/translatable'
export default {
name: 'v-parallax',
mixins: [Translatable],
data () {
return {
isBooted: false
}
},
props: {
alt: String,
height: {
type: [String, Number],
default: 500
},
src: String
},
computed: {
styles () {
return {
display: 'block',
opacity: this.isBooted ? 1 : 0,
transform: `translate(-50%, ${this.parallax}px)`
}
}
},
watch: {
parallax () {
this.isBooted = true
}
},
mounted () {
this.init()
},
methods: {
init () {
if (!this.$refs.img) return
if (this.$refs.img.complete) {
this.translate()
this.listeners()
} else {
this.$refs.img.addEventListener('load', () => {
this.translate()
this.listeners()
}, false)
}
},
objHeight () {
return this.$refs.img.naturalHeight
},
elOffsetTop () {
return this.$el.offsetTop
}
},
render (h) {
const imgData = {
staticClass: 'parallax__image',
style: this.styles,
attrs: {
src: this.src
},
ref: 'img'
}
if (this.alt) imgData.attrs.alt = this.alt
const container = h('div', {
staticClass: 'parallax__image-container'
}, [
h('img', imgData)
])
const content = h('div', {
staticClass: 'parallax__content'
}, this.$slots.default)
return h('div', {
staticClass: 'parallax',
style: {
height: `${this.normalizedHeight}px`
},
on: this.$listeners
}, [container, content])
}
}