import { getNavigationBarHeight } from '../utils'
|
|
function getFixed ($el) {
|
let fixed
|
while ($el) {
|
const style = getComputedStyle($el)
|
const transform = style.transform || style.webkitTransform
|
fixed = transform && transform !== 'none' ? false : fixed
|
fixed = style.position === 'fixed' ? true : fixed
|
$el = $el.parentElement
|
}
|
return fixed
|
}
|
|
export default {
|
name: 'Native',
|
data () {
|
return {
|
position: {
|
top: '0px',
|
left: '0px',
|
width: '0px',
|
height: '0px',
|
position: 'static'
|
},
|
hidden: false
|
}
|
},
|
provide () {
|
return {
|
parentOnDraw: this._onDraw
|
}
|
},
|
inject: {
|
parentOnDraw: { default: null }
|
},
|
created () {
|
this.isNative = true
|
this.onCanInsertCallbacks = []
|
this.onDrawCallbacks = []
|
},
|
mounted () {
|
this._updatePosition()
|
this.onCanInsertCallbacks.forEach(callback => callback())
|
this.onCanInsertCallbacks = null
|
this.$on('uni-view-update', this._requestPositionUpdate)
|
},
|
methods: {
|
_updatePosition () {
|
const rect = (this.$refs.container || this.$el).getBoundingClientRect()
|
this.hidden = rect.width === 0 || rect.height === 0
|
if (!this.hidden) {
|
const position = this.position
|
position.position = getFixed(this.$el) ? 'absolute' : 'static'
|
const keys = ['top', 'left', 'width', 'height']
|
keys.forEach(key => {
|
let val = rect[key]
|
val = key === 'top' ? val + (position.position === 'static' ? (document.documentElement.scrollTop || document.body.scrollTop || 0) : getNavigationBarHeight()) : val
|
position[key] = val + 'px'
|
})
|
}
|
},
|
_requestPositionUpdate () {
|
if (this._positionUpdateRequest) {
|
cancelAnimationFrame(this._positionUpdateRequest)
|
}
|
this._positionUpdateRequest = requestAnimationFrame(() => {
|
delete this._positionUpdateRequest
|
this._updatePosition()
|
})
|
},
|
_onParentReady (parentReadyCallback) {
|
const callback = (parentPosition) => {
|
parentReadyCallback(parentPosition)
|
this.onDrawCallbacks.forEach(callback => callback(this.position))
|
this.onDrawCallbacks = null
|
}
|
this._onSelfReady(() => {
|
if (this.parentOnDraw) {
|
this.parentOnDraw(callback)
|
} else {
|
callback({
|
top: '0px',
|
left: '0px',
|
width: Number.MAX_SAFE_INTEGER + 'px',
|
height: Number.MAX_SAFE_INTEGER + 'px',
|
position: 'static'
|
})
|
}
|
})
|
},
|
_onSelfReady (callback) {
|
if (this.onCanInsertCallbacks) {
|
this.onCanInsertCallbacks.push(callback)
|
} else {
|
callback()
|
}
|
},
|
_onDraw (callback) {
|
if (this.onDrawCallbacks) {
|
this.onDrawCallbacks.push(callback)
|
} else {
|
callback(this.position)
|
}
|
}
|
}
|
}
|