Blame view

node_modules/uview-ui/components/u-sticky/u-sticky.vue 4.2 KB
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>