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);
|
}
|
};
|