c7add6cf
“wangming”
初始版本开发完毕
|
1
|
<template>
|
25852764
unknown
s
|
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
<view class="">
<view class="u-sticky-wrap" :class="[elClass]" :style="{
height: fixed ? height + 'px' : 'auto',
backgroundColor: bgColor
}">
<view class="u-sticky" :style="{
position: fixed ? 'fixed' : 'static',
top: stickyTop + 'px',
left: left + 'px',
width: width == 'auto' ? 'auto' : width + 'px',
zIndex: uZIndex
}">
<slot></slot>
</view>
|
c7add6cf
“wangming”
初始版本开发完毕
|
16
17
18
19
20
|
</view>
</view>
</template>
<script>
|
c7add6cf
“wangming”
初始版本开发完毕
|
21
22
23
24
|
/**
* sticky 吸顶
* @description 该组件与CSS中position: sticky属性实现的效果一致,当组件达到预设的到顶部距离时, 就会固定在指定位置,组件位置大于预设的顶部距离时,会重新按照正常的布局排列。
* @tutorial https://www.uviewui.com/components/sticky.html
|
25852764
unknown
s
|
25
26
27
28
29
30
31
32
33
|
* @property {String Number} offset-top 吸顶时与顶部的距离,单位rpx(默认0)
* @property {String Number} index 自定义标识,用于区分是哪一个组件
* @property {Boolean} enable 是否开启吸顶功能(默认true)
* @property {String} bg-color 组件背景颜色(默认#ffffff)
* @property {String Number} z-index 吸顶时的z-index值(默认970)
* @property {String Number} h5-nav-height 导航栏高度,自定义导航栏时(无导航栏时需设置为0),需要传入此值,单位px(默认44)
* @event {Function} fixed 组件吸顶时触发
* @event {Function} unfixed 组件取消吸顶时触发
* @example <u-sticky offset-top="200"><view>塞下秋来风景异,衡阳雁去无留意</view></u-sticky>
|
c7add6cf
“wangming”
初始版本开发完毕
|
34
35
|
*/
export default {
|
25852764
unknown
s
|
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
name: "u-sticky",
props: {
// 吸顶容器到顶部某个距离的时候,进行吸顶,在H5平台,NavigationBar为44px
offsetTop: {
type: [Number, String],
default: 0
},
//列表中的索引值
index: {
type: [Number, String],
default: ''
},
// 是否开启吸顶功能
enable: {
type: Boolean,
default: true
},
// h5顶部导航栏的高度
h5NavHeight: {
type: [Number, String],
default: 44
},
// 吸顶区域的背景颜色
bgColor: {
type: String,
default: '#ffffff'
},
// z-index值
zIndex: {
type: [Number, String],
default: ''
}
},
|
c7add6cf
“wangming”
初始版本开发完毕
|
69
70
|
data() {
return {
|
25852764
unknown
s
|
71
|
fixed: false,
|
c7add6cf
“wangming”
初始版本开发完毕
|
72
|
height: 'auto',
|
25852764
unknown
s
|
73
74
75
76
77
|
stickyTop: 0,
elClass: this.$u.guid(),
left: 0,
width: 'auto',
};
|
c7add6cf
“wangming”
初始版本开发完毕
|
78
|
},
|
25852764
unknown
s
|
79
80
81
|
watch: {
offsetTop(val) {
this.initObserver();
|
c7add6cf
“wangming”
初始版本开发完毕
|
82
|
},
|
25852764
unknown
s
|
83
84
85
86
87
88
|
enable(val) {
if (val == false) {
this.fixed = false;
this.disconnectObserver('contentObserver');
} else {
this.initObserver();
|
c7add6cf
“wangming”
初始版本开发完毕
|
89
|
}
|
25852764
unknown
s
|
90
91
92
93
94
|
}
},
computed: {
uZIndex() {
return this.zIndex ? this.zIndex : this.$u.zIndex.sticky;
|
c7add6cf
“wangming”
初始版本开发完毕
|
95
96
97
|
}
},
mounted() {
|
25852764
unknown
s
|
98
|
this.initObserver();
|
c7add6cf
“wangming”
初始版本开发完毕
|
99
100
|
},
methods: {
|
25852764
unknown
s
|
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
initObserver() {
if (!this.enable) return;
// #ifdef H5
this.stickyTop = this.offsetTop != 0 ? uni.upx2px(this.offsetTop) + this.h5NavHeight : this.h5NavHeight;
// #endif
// #ifndef H5
this.stickyTop = this.offsetTop != 0 ? uni.upx2px(this.offsetTop) : 0;
// #endif
this.disconnectObserver('contentObserver');
this.$uGetRect('.' + this.elClass).then((res) => {
this.height = res.height;
this.left = res.left;
this.width = res.width;
|
c7add6cf
“wangming”
初始版本开发完毕
|
115
|
this.$nextTick(() => {
|
25852764
unknown
s
|
116
117
118
|
this.observeContent();
});
});
|
c7add6cf
“wangming”
初始版本开发完毕
|
119
120
|
},
observeContent() {
|
25852764
unknown
s
|
121
122
|
this.disconnectObserver('contentObserver');
const contentObserver = this.createIntersectionObserver({
|
c7add6cf
“wangming”
初始版本开发完毕
|
123
|
thresholds: [0.95, 0.98, 1]
|
25852764
unknown
s
|
124
|
});
|
c7add6cf
“wangming”
初始版本开发完毕
|
125
126
|
contentObserver.relativeToViewport({
top: -this.stickyTop
|
25852764
unknown
s
|
127
128
129
130
131
132
|
});
contentObserver.observe('.' + this.elClass, res => {
if (!this.enable) return;
this.setFixed(res.boundingClientRect.top);
});
this.contentObserver = contentObserver;
|
c7add6cf
“wangming”
初始版本开发完毕
|
133
134
|
},
setFixed(top) {
|
25852764
unknown
s
|
135
136
137
138
|
const fixed = top < this.stickyTop;
if (fixed) this.$emit('fixed', this.index);
else if(this.fixed) this.$emit('unfixed', this.index);
this.fixed = fixed;
|
c7add6cf
“wangming”
初始版本开发完毕
|
139
140
|
},
disconnectObserver(observerName) {
|
25852764
unknown
s
|
141
142
|
const observer = this[observerName];
observer && observer.disconnect();
|
c7add6cf
“wangming”
初始版本开发完毕
|
143
|
},
|
c7add6cf
“wangming”
初始版本开发完毕
|
144
145
|
},
beforeDestroy() {
|
25852764
unknown
s
|
146
|
this.disconnectObserver('contentObserver');
|
c7add6cf
“wangming”
初始版本开发完毕
|
147
|
}
|
25852764
unknown
s
|
148
|
};
|
c7add6cf
“wangming”
初始版本开发完毕
|
149
150
|
</script>
|
25852764
unknown
s
|
151
152
153
|
<style scoped lang="scss">
@import "../../libs/css/style.components.scss";
|
c7add6cf
“wangming”
初始版本开发完毕
|
154
|
.u-sticky {
|
25852764
unknown
s
|
155
|
z-index: 9999999999;
|
c7add6cf
“wangming”
初始版本开发完毕
|
156
157
|
}
</style>
|