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.
83 lines
2.2 KiB
83 lines
2.2 KiB
import { createNamespace } from '../utils';
|
|
import { ChildrenMixin } from '../mixins/relation';
|
|
import { BORDER_BOTTOM } from '../utils/constant';
|
|
import { getScrollTop, getRootScrollTop } from '../utils/dom/scroll';
|
|
|
|
var _createNamespace = createNamespace('index-anchor'),
|
|
createComponent = _createNamespace[0],
|
|
bem = _createNamespace[1];
|
|
|
|
export default createComponent({
|
|
mixins: [ChildrenMixin('vanIndexBar', {
|
|
indexKey: 'childrenIndex'
|
|
})],
|
|
props: {
|
|
index: [Number, String]
|
|
},
|
|
data: function data() {
|
|
return {
|
|
top: 0,
|
|
left: null,
|
|
rect: {
|
|
top: 0,
|
|
height: 0
|
|
},
|
|
width: null,
|
|
active: false
|
|
};
|
|
},
|
|
computed: {
|
|
sticky: function sticky() {
|
|
return this.active && this.parent.sticky;
|
|
},
|
|
anchorStyle: function anchorStyle() {
|
|
if (this.sticky) {
|
|
return {
|
|
zIndex: "" + this.parent.zIndex,
|
|
left: this.left ? this.left + "px" : null,
|
|
width: this.width ? this.width + "px" : null,
|
|
transform: "translate3d(0, " + this.top + "px, 0)",
|
|
color: this.parent.highlightColor
|
|
};
|
|
}
|
|
}
|
|
},
|
|
mounted: function mounted() {
|
|
var rect = this.$el.getBoundingClientRect();
|
|
this.rect.height = rect.height;
|
|
},
|
|
methods: {
|
|
scrollIntoView: function scrollIntoView() {
|
|
this.$el.scrollIntoView();
|
|
},
|
|
getRect: function getRect(scroller, scrollerRect) {
|
|
var el = this.$el;
|
|
var elRect = el.getBoundingClientRect();
|
|
this.rect.height = elRect.height;
|
|
|
|
if (scroller === window || scroller === document.body) {
|
|
this.rect.top = elRect.top + getRootScrollTop();
|
|
} else {
|
|
this.rect.top = elRect.top + getScrollTop(scroller) - scrollerRect.top;
|
|
}
|
|
|
|
return this.rect;
|
|
}
|
|
},
|
|
render: function render() {
|
|
var _ref;
|
|
|
|
var h = arguments[0];
|
|
var sticky = this.sticky;
|
|
return h("div", {
|
|
"style": {
|
|
height: sticky ? this.rect.height + "px" : null
|
|
}
|
|
}, [h("div", {
|
|
"style": this.anchorStyle,
|
|
"class": [bem({
|
|
sticky: sticky
|
|
}), (_ref = {}, _ref[BORDER_BOTTOM] = sticky, _ref)]
|
|
}, [this.slots('default') || this.index])]);
|
|
}
|
|
}); |