You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.6 KiB
92 lines
2.6 KiB
import { on, off } from 'element-ui/src/utils/dom'; |
|
import { renderThumbStyle, BAR_MAP } from './util'; |
|
|
|
/* istanbul ignore next */ |
|
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(h) { |
|
const { size, move, bar } = this; |
|
|
|
return ( |
|
<div |
|
class={ ['el-scrollbar__bar', 'is-' + bar.key] } |
|
onMousedown={ this.clickTrackHandler } > |
|
<div |
|
ref="thumb" |
|
class="el-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(e) { |
|
this.cursorDown = false; |
|
this[this.bar.axis] = 0; |
|
off(document, 'mousemove', this.mouseMoveDocumentHandler); |
|
document.onselectstart = null; |
|
} |
|
}, |
|
|
|
destroyed() { |
|
off(document, 'mouseup', this.mouseUpDocumentHandler); |
|
} |
|
};
|
|
|