@prettyy/ui
Version:
vue2 UI
90 lines (74 loc) • 2.67 kB
JavaScript
import { on, off } from "../../../utils/dom"
import { renderThumbStyle, BAR_MAP } from "./util"
export default {
name: "Bar",
props: {
vertical: Boolean,
size: String,
move: Number
},
computed: {
bar() {
return BAR_MAP[this.vertical ? 'vertical' : 'horizontal']
},
wrap() {
return this.$parent.wrap
}
},
render() {
const { size, move, bar } = this
return (
<div
class={ ['vl-scrollbar__bar', 'is-' + bar.key] }
onMousedown={ this.clickTrackHandler } >
<div
ref="thumb"
class="vl-scrollbar__thumb"
onMousedown={ this.clickThumbHandler }
style={ renderThumbStyle({ size, move, bar }) }>
</div>
</div>
)
},
methods: {
clickThumbHandler(e) {
// prevent click event of right button
if (e.ctrlKey || e.button === 2) {
return
}
this.startDrag(e)
this[this.bar.axis] = (e.currentTarget[this.bar.offset] - (e[this.bar.client] - e.currentTarget.getBoundingClientRect()[this.bar.direction]))
},
clickTrackHandler(e) {
const offset = Math.abs(e.target.getBoundingClientRect()[this.bar.direction] - e[this.bar.client])
const thumbHalf = (this.$refs.thumb[this.bar.offset] / 2)
const thumbPositionPercentage = ((offset - thumbHalf) * 100 / this.$el[this.bar.offset])
this.wrap[this.bar.scroll] = (thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100)
},
startDrag(e) {
e.stopImmediatePropagation()
this.cursorDown = true
on(document, 'mousemove', this.mouseMoveDocumentHandler)
on(document, 'mouseup', this.mouseUpDocumentHandler)
document.onselectstart = () => false
},
mouseMoveDocumentHandler(e) {
if (this.cursorDown === false) return
const prevPage = this[this.bar.axis]
if (!prevPage) return
const offset = ((this.$el.getBoundingClientRect()[this.bar.direction] - e[this.bar.client]) * -1)
const thumbClickPosition = (this.$refs.thumb[this.bar.offset] - prevPage)
const thumbPositionPercentage = ((offset - thumbClickPosition) * 100 / this.$el[this.bar.offset])
this.wrap[this.bar.scroll] = (thumbPositionPercentage * this.wrap[this.bar.scrollSize] / 100)
},
mouseUpDocumentHandler() {
this.cursorDown = false
this[this.bar.axis] = 0
off(document, 'mousemove', this.mouseMoveDocumentHandler)
document.onselectstart = null
}
},
destroyed() {
off(document, 'mouseup', this.mouseUpDocumentHandler)
}
}