Blame view

node_modules/uview-ui/components/u-skeleton/u-skeleton.vue 5.91 KB
c7add6cf   “wangming”   初始版本开发完毕
1
  <template>
25852764   unknown   s
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
  	<view v-if="loading" :style="{
  		width: windowWinth + 'px', 
  		height: windowHeight + 'px', 
  		backgroundColor: bgColor, 
  		position: 'absolute', 
  		left: left + 'px', 
  		top: top + 'px', 
  		zIndex: 9998, 
  		overflow: 'hidden'
  	}"
  	 @touchmove.stop.prevent>
  		<view v-for="(item, index) in RectNodes" :key="$u.guid()" :class="[animation ? 'skeleton-fade' : '']" :style="{
  			width: item.width + 'px', 
  			height: item.height + 'px', 
  			backgroundColor: elColor, 
  			position: 'absolute', 
  			left: (item.left - left) + 'px', 
  			top: (item.top - top) + 'px'
  		}"></view>
  		<view v-for="(item, index) in circleNodes" :key="$u.guid()" :class="animation ? 'skeleton-fade' : ''" :style="{
  			width: item.width + 'px', 
  			height: item.height + 'px', 
  			backgroundColor: elColor, 
  			borderRadius: item.width/2 + 'px', 
  			position: 'absolute', 
  			left: (item.left - left) + 'px',
  			top: (item.top - top) + 'px'
  		}"></view>
  		<view v-for="(item, index) in filletNodes" :key="$u.guid()" :class="animation ? 'skeleton-fade' : ''" :style="{
  			width: item.width + 'px', 
  			height: item.height + 'px', 
  			backgroundColor: elColor, 
  			borderRadius: borderRadius + 'rpx', 
  			position: 'absolute', 
  			left: (item.left - left) + 'px',
  			top: (item.top - top) + 'px'
  		}"></view>
c7add6cf   “wangming”   初始版本开发完毕
39
40
41
42
  	</view>
  </template>
  
  <script>
c7add6cf   “wangming”   初始版本开发完毕
43
  	/**
25852764   unknown   s
44
  	 * skeleton 骨架屏
c7add6cf   “wangming”   初始版本开发完毕
45
46
  	 * @description 骨架屏一般用于页面在请求远程数据尚未完成时,页面用灰色块预显示本来的页面结构,给用户更好的体验。
  	 * @tutorial https://www.uviewui.com/components/skeleton.html
25852764   unknown   s
47
48
49
50
51
52
  	 * @property {String} el-color 骨架块状元素的背景颜色(默认#e5e5e5
  	 * @property {String} bg-color 骨架组件背景颜色(默认#ffffff
  	 * @property {Boolean} animation 骨架块是否显示动画效果(默认false
  	 * @property {String Number} border-radius u-skeleton-fillet类名元素,对应的骨架块的圆角大小,单位rpx(默认10
  	 * @property {Boolean} loading 是否显示骨架组件,请求完成后,将此值设置为false(默认true
  	 * @example <u-skeleton :loading="true" :animation="true"></u-skeleton>
c7add6cf   “wangming”   初始版本开发完毕
53
54
  	 */
  	export default {
25852764   unknown   s
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  		name: "u-skeleton",
  		props: {
  			// 需要渲染的元素背景颜色,十六进制或者rgb等都可以
  			elColor: {
  				type: String,
  				default: '#e5e5e5'
  			},
  			// 整个骨架屏页面的背景颜色
  			bgColor: {
  				type: String,
  				default: '#ffffff'
  			},
  			// 是否显示加载动画
  			animation: {
  				type: Boolean,
  				default: false
c7add6cf   “wangming”   初始版本开发完毕
71
  			},
25852764   unknown   s
72
73
74
75
  			// 圆角值,只对类名为u-skeleton-fillet的元素生效,为数值,不带单位
  			borderRadius: {
  				type: [String, Number],
  				default: "10"
c7add6cf   “wangming”   初始版本开发完毕
76
  			},
25852764   unknown   s
77
78
79
80
81
  			// 是否显示骨架,true-显示,false-隐藏
  			loading: {
  				type: Boolean,
  				default: true
  			}
c7add6cf   “wangming”   初始版本开发完毕
82
  		},
25852764   unknown   s
83
84
85
86
87
88
89
90
91
92
  		data() {
  			return {
  				windowWinth: 750, // 骨架屏宽度
  				windowHeight: 1500, // 骨架屏高度
  				filletNodes: [], // 圆角元素
  				circleNodes: [], // 圆形元素
  				RectNodes: [], // 矩形元素
  				top: 0,
  				left: 0,
  			}
c7add6cf   “wangming”   初始版本开发完毕
93
94
  		},
  		methods: {
25852764   unknown   s
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
  			// 查询各节点的信息
  			selecterQueryInfo() {
  				// 获取整个父组件容器的高度,当做骨架屏的高度 
  				// 在微信小程序中,如果把骨架屏放入组件中使用的话,需要调in(this)上下文为父组件才有效
  				let query = '';
  				// #ifdef MP-WEIXIN
  				query = uni.createSelectorQuery().in(this.$parent);
  				// #endif
  				// #ifndef MP-WEIXIN
  				query = uni.createSelectorQuery()
  				// #endif
  				query.selectAll('.u-skeleton').boundingClientRect().exec((res) => {
  					this.windowHeight = res[0][0].height;
  					this.windowWinth = res[0][0].width;
  					this.top = res[0][0].bottom - res[0][0].height;
  					this.left = res[0][0].left;
  				});
  				// 矩形骨架元素
  				this.getRectEls();
  				// 圆形骨架元素
  				this.getCircleEls();
  				// 圆角骨架元素
  				this.getFilletEls();
  			},
  			// 矩形元素列表
  			getRectEls() {
  				let query = '';
  				// 在微信小程序中,如果把骨架屏放入组件中使用的话,需要调in(this)上下文为父组件才有效
  				// #ifdef MP-WEIXIN
  				query = uni.createSelectorQuery().in(this.$parent);
  				// #endif
  				// #ifndef MP-WEIXIN
  				query = uni.createSelectorQuery()
c7add6cf   “wangming”   初始版本开发完毕
128
  				// #endif
25852764   unknown   s
129
130
131
  				query.selectAll('.u-skeleton-rect').boundingClientRect().exec((res) => {
  					this.RectNodes = res[0];
  				});
c7add6cf   “wangming”   初始版本开发完毕
132
  			},
25852764   unknown   s
133
134
135
136
137
138
  			// 圆角元素列表
  			getFilletEls() {
  				let query = '';
  				// 在微信小程序中,如果把骨架屏放入组件中使用的话,需要调in(this)上下文为父组件才有效
  				// #ifdef MP-WEIXIN
  				query = uni.createSelectorQuery().in(this.$parent);
c7add6cf   “wangming”   初始版本开发完毕
139
  				// #endif
25852764   unknown   s
140
141
142
143
144
145
  				// #ifndef MP-WEIXIN
  				query = uni.createSelectorQuery()
  				// #endif
  				query.selectAll('.u-skeleton-fillet').boundingClientRect().exec((res) => {
  					this.filletNodes = res[0];
  				});
c7add6cf   “wangming”   初始版本开发完毕
146
  			},
25852764   unknown   s
147
148
149
150
151
152
  			// 圆形元素列表
  			getCircleEls() {
  				let query = '';
  				// 在微信小程序中,如果把骨架屏放入组件中使用的话,需要调in(this)上下文为父组件才有效
  				// #ifdef MP-WEIXIN
  				query = uni.createSelectorQuery().in(this.$parent);
c7add6cf   “wangming”   初始版本开发完毕
153
  				// #endif
25852764   unknown   s
154
155
  				// #ifndef MP-WEIXIN
  				query = uni.createSelectorQuery()
c7add6cf   “wangming”   初始版本开发完毕
156
  				// #endif
25852764   unknown   s
157
158
159
  				query.selectAll('.u-skeleton-circle').boundingClientRect().exec((res) => {
  					this.circleNodes = res[0];
  				});
c7add6cf   “wangming”   初始版本开发完毕
160
  			}
25852764   unknown   s
161
162
163
164
165
166
167
168
  		},
  		// 组件被挂载
  		mounted() {
  			// 获取系统信息
  			let systemInfo = uni.getSystemInfoSync();
  			this.windowHeight = systemInfo.windowHeight;
  			this.windowWinth = systemInfo.windowWidth;
  			this.selecterQueryInfo();
c7add6cf   “wangming”   初始版本开发完毕
169
170
171
172
173
  		}
  	}
  </script>
  
  <style lang="scss" scoped>
25852764   unknown   s
174
175
176
177
178
179
180
181
182
183
  	@import "../../libs/css/style.components.scss";
  	
  	.skeleton-fade {
  		width: 100%;
  		height: 100%;
  		background: rgb(194, 207, 214);
  		animation-duration: 1.5s;
  		animation-name: blink;
  		animation-timing-function: ease-in-out;
  		animation-iteration-count: infinite;
c7add6cf   “wangming”   初始版本开发完毕
184
185
  	}
  
25852764   unknown   s
186
187
188
  	@keyframes blink {
  		0% {
  			opacity: 1;
c7add6cf   “wangming”   初始版本开发完毕
189
  		}
c7add6cf   “wangming”   初始版本开发完毕
190
  
25852764   unknown   s
191
192
  		50% {
  			opacity: 0.4;
c7add6cf   “wangming”   初始版本开发完毕
193
194
195
  		}
  
  		100% {
25852764   unknown   s
196
  			opacity: 1;
c7add6cf   “wangming”   初始版本开发完毕
197
198
  		}
  	}
c7add6cf   “wangming”   初始版本开发完毕
199
  </style>