mirror of
https://gitee.com/vant-contrib/vant-weapp.git
synced 2025-04-06 03:58:05 +08:00
fix(Sticky): avoid sticky not fixed when scroll slow & improve performance (#2703)
fix #2310
This commit is contained in:
parent
33c11facff
commit
5ed7ed5e1d
@ -35,27 +35,11 @@ VantComponent({
|
|||||||
},
|
},
|
||||||
|
|
||||||
data: {
|
data: {
|
||||||
wrapStyle: '',
|
height: 0,
|
||||||
containerStyle: ''
|
fixed: false
|
||||||
},
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
setStyle() {
|
|
||||||
const { offsetTop, height, fixed, zIndex } = this.data;
|
|
||||||
|
|
||||||
if (fixed) {
|
|
||||||
this.setData({
|
|
||||||
wrapStyle: `top: ${offsetTop}px;`,
|
|
||||||
containerStyle: `height: ${height}px; z-index: ${zIndex};`
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.setData({
|
|
||||||
wrapStyle: '',
|
|
||||||
containerStyle: ''
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
getContainerRect() {
|
getContainerRect() {
|
||||||
const nodesRef: WechatMiniprogram.NodesRef = this.data.container();
|
const nodesRef: WechatMiniprogram.NodesRef = this.data.container();
|
||||||
|
|
||||||
@ -96,9 +80,8 @@ VantComponent({
|
|||||||
|
|
||||||
this.disconnectObserver('contentObserver');
|
this.disconnectObserver('contentObserver');
|
||||||
const contentObserver = this.createIntersectionObserver({
|
const contentObserver = this.createIntersectionObserver({
|
||||||
thresholds: [0, 1]
|
thresholds: [0.9, 1]
|
||||||
});
|
});
|
||||||
this.contentObserver = contentObserver;
|
|
||||||
contentObserver.relativeToViewport({ top: -offsetTop });
|
contentObserver.relativeToViewport({ top: -offsetTop });
|
||||||
contentObserver.observe(ROOT_ELEMENT, res => {
|
contentObserver.observe(ROOT_ELEMENT, res => {
|
||||||
if (this.data.disabled) {
|
if (this.data.disabled) {
|
||||||
@ -107,6 +90,8 @@ VantComponent({
|
|||||||
|
|
||||||
this.setFixed(res.boundingClientRect.top);
|
this.setFixed(res.boundingClientRect.top);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
this.contentObserver = contentObserver;
|
||||||
},
|
},
|
||||||
|
|
||||||
observeContainer() {
|
observeContainer() {
|
||||||
@ -122,7 +107,7 @@ VantComponent({
|
|||||||
|
|
||||||
this.disconnectObserver('containerObserver');
|
this.disconnectObserver('containerObserver');
|
||||||
const containerObserver = this.createIntersectionObserver({
|
const containerObserver = this.createIntersectionObserver({
|
||||||
thresholds: [0, 1]
|
thresholds: [0.9, 1]
|
||||||
});
|
});
|
||||||
this.containerObserver = containerObserver;
|
this.containerObserver = containerObserver;
|
||||||
containerObserver.relativeToViewport({
|
containerObserver.relativeToViewport({
|
||||||
@ -145,7 +130,7 @@ VantComponent({
|
|||||||
|
|
||||||
const fixed =
|
const fixed =
|
||||||
containerHeight && height
|
containerHeight && height
|
||||||
? top > height - containerHeight && top < offsetTop
|
? top >= height - containerHeight && top < offsetTop
|
||||||
: top < offsetTop;
|
: top < offsetTop;
|
||||||
|
|
||||||
this.$emit('scroll', {
|
this.$emit('scroll', {
|
||||||
@ -154,10 +139,6 @@ VantComponent({
|
|||||||
});
|
});
|
||||||
|
|
||||||
this.setData({ fixed });
|
this.setData({ fixed });
|
||||||
|
|
||||||
wx.nextTick(() => {
|
|
||||||
this.setStyle();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1,7 +1,8 @@
|
|||||||
<wxs src="../wxs/utils.wxs" module="utils" />
|
<wxs src="../wxs/utils.wxs" module="utils" />
|
||||||
|
<wxs src="./index.wxs" module="computed" />
|
||||||
|
|
||||||
<view class="custom-class van-sticky" style="{{ containerStyle }}">
|
<view class="custom-class van-sticky" style="{{ computed.containerStyle({ fixed, height, zIndex }) }}">
|
||||||
<view class="{{ utils.bem('sticky-wrap', { fixed }) }}" style="{{ wrapStyle }}">
|
<view class="{{ utils.bem('sticky-wrap', { fixed }) }}" style="{{ computed.wrapStyle({ fixed, offsetTop }) }}">
|
||||||
<slot />
|
<slot />
|
||||||
</view>
|
</view>
|
||||||
</view>
|
</view>
|
||||||
|
21
packages/sticky/index.wxs
Normal file
21
packages/sticky/index.wxs
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/* eslint-disable */
|
||||||
|
function wrapStyle(data) {
|
||||||
|
if (data.fixed) {
|
||||||
|
return 'top: ' + data.offsetTop + 'px;';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
function containerStyle(data) {
|
||||||
|
if (data.fixed) {
|
||||||
|
return 'height: ' + data.height + 'px; z-index: ' + data.zIndex + ';';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
wrapStyle: wrapStyle,
|
||||||
|
containerStyle: containerStyle
|
||||||
|
};
|
Loading…
x
Reference in New Issue
Block a user