distinctui-uni 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,419 +1,476 @@
1
- <template>
2
- <view v-if="wrapperShow">
3
- <view
4
- class="d-popup__mask"
5
- :class="{ 'animate-fade-in': innerShow, 'animate-fade-out': !innerShow }"
6
- v-if="mask"
7
- :style="{ background: maskBackground }"
8
- @tap.stop="onClickMask"
9
- @touchmove.stop.prevent="stop"
10
- />
11
- <view
12
- class="d-popup__popup"
13
- :class="{ 'animate-slide-up': innerShow, 'animate-slide-down': !innerShow }"
14
- :style="[popupStyle]"
15
- @tap.stop="stop"
16
- >
17
- <view class="d-popup__popup__top" v-if="showSlideIcon" @touchmove.stop="handleClose" @tap.stop="handleClose">
18
- <view class="d-popup__slide-icon" />
19
- </view>
20
- <view class="d-popup__popup__hd">
21
- <view class="d-popup__popup__hd__left">
22
- <view v-if="showMoreBtn" class="d-popup__popup__more" hover-class="d-active" @tap.stop="clickMore">
23
- <image
24
- mode="widthFix"
25
- class="d-popup__popup__more-icon"
26
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFDUlEQVR4nO3b0W1URxiG4bM0gFMBpAKMgOtsCaYCSAV2KsBUgKkgUAHuIMk1IEwHUEGM4BrnXwVLZLV8MvbZmQl6Hmk0g2+s/0jv7C4Liwn4JoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAYPpB79+7tnp2dPajjbq2dOq/2abFYnNR2Wuukzs9fvnx5Uuf/FbONP9uQgSyXy51Pnz7t10M9qD/u1LqI03rgR69evXpc52EtzbZu6NkWtYZy586dvdqe1Lo5Xc67aZp+e/369XHtQzFb9G4acLZFrWHcvXv3yZfb58rqVjoc6VYy28WMNtui1hDqBvq9tofTvJ7VjfRr7V2Z7bsNMdvKolZ39ZCPatuvNbu6kR7XjXQ4dWK2y+k927nugdRD3qvtRa1tul830nHtTZntyrrM9rWugSzrbz0+fvz4po43p+16Vw/659qbWZptDs1nW7eo1U19uDusD3eP6rh1rV+yzTaP1rOt6xpIvUz/XdtOrRZO6zb6qfYmzDabprOt6xZI3ULLuoX+qGMz165du93im1uzzavVbJt0C6RuoaPa9mu19LRuo4Pat8pss2sy2ybdAqmb6M+6iX6pYzP1fvavej+7nLbMbPNqNdsmPQN5Uw96t47N1IM+qQd9u45bZbZ5tZptk26B1Ev1WW3N1Uv11mc22/xazLZJl1+68iM/aLPNr8Vsm3T5pSv1oE9qu1Wrpbf1oHdr3yqzza7JbJt0C6Tey/6wH/bMNq9Ws23SLZC6iY5q26/V0tO6iQ5q3yqzza7JbJt0C2T1XzI/f/78po7NtPrCyWzzajXbJt0CWanb6LS267Va+FC30E7tTZhtNk1nW9c1kHo/e1jvZx/Vcevqfezjeh97ODVitnm0nm1d10CW//6z6ZM63qi1Te/rFro5NbQ02xyaz7auayAr9XK9V9uLWtt0vx70ce1Nme3Kusz2te6BrGzzJbv3S7TZLqf3bOeGCGSlbqRn0zQ9qDWn53UDPZw6M9t3G2K2lWECWZnzRhrlBjpntosZbbahAlmpG2mvtqNaN2pdxvtaB3UDHdc+FLNFQ862qDWkL7fSQR2v17qID3X7HI10+3yL2f5j6NmGDeTcl29uH9ZD3K0Hv1M/ulVr5W397LR+dlLftD7r9U3rVZht/NmGDwR6EggEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBIJ/AEZQjudcAs0hAAAAAElFTkSuQmCC"
27
- />
28
- </view>
29
- <slot v-else name="header-left"></slot>
30
- </view>
31
- <view class="d-popup__popup__hd__middle">
32
- <span v-if="title" class="d-popup__popup__hd__title ellipse-one-line">{{ title }}</span>
33
- <slot v-else name="header-middle"></slot>
34
- </view>
35
- <view class="d-popup__popup__hd__right">
36
- <view v-if="closabled" class="d-popup__popup__close" @tap.stop="handleClose" hover-class="d-active">
37
- <image
38
- mode="widthFix"
39
- class="d-popup__popup__close-icon"
40
- src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IArs4c6QAAADZQTFRFAAAAAAAAQEBAMzMzMzMzMzMzNDQ0MjIyNDQ0MzMzNDQ0NDQ0MzMzMzMzMzMzMzMzNDQ0NTU1nbBS4wAAAA90Uk5TAAIEBQ8UWXBxpKyys/b+RAoM/gAAAMRJREFUSMftlUsOwyAMRMMfAqnh/petqqpqBBgYKdnFSw/Yj2Am2/bEjSGsN7yqnRVVyh6UJLdeRjpslXNEZWd2yL0Q+bppLK+SdJcnfSTTLdOjkolpzghsoV9rvZAcFGN5GHnA0wUY8nRKTniaRVOeCmOB50yl1ArPiSqEJZ4/Vc5rPN9QIRPloLa7NqBI6KHRz4peHDoa6PCh440+IPSJoiaA2gxqZCaNrTLWkp+ZsWvtPo78qrF7Yd3ggoxvfihPXBpv888R1ZroG5MAAAAASUVORK5CYII="
41
- />
42
- </view>
43
- <slot v-else name="header-right"></slot>
44
- </view>
45
- </view>
46
- <view class="d-popup__popup__bd" scroll-y scroll-with-animation>
47
- <slot name="body">
48
- <view class="d-popup__popup__bd__desc">{{ desc }}</view>
49
- <view class="d-popup__popup__bd__tips">{{ tips }}</view>
50
- </slot>
51
- <view style="width: 100%; height: 100rpx" v-if="!hiddenFooter" />
52
- </view>
53
- <view class="d-popup__popup__ft d-popup__popup__ft__tool" v-if="!hiddenFooter">
54
- <slot name="footer">
55
- <view class="d-popup__popup__ft__buttons">
56
- <d-button width="272rpx" type="secondary" margin="0 15rpx">次要按钮</d-button>
57
- <d-button width="272rpx" type="primary" margin="0 15rpx">主按钮</d-button>
58
- </view>
59
- </slot>
60
- </view>
61
- <view class="d-popup__safe-bottom"></view>
62
- </view>
63
- </view>
64
- </template>
65
-
66
- <script>
67
- /*如果底部有自定义导航栏,可适当设置内容padding-bottom值*/
68
- export default {
69
- name: "d-popup",
70
- emits: ['update:show', 'clickMore', 'close', 'open', 'clickMask'],
71
- props: {
72
- // 是否显示
73
- show: {
74
- type: Boolean,
75
- default: false
76
- },
77
- // 是否展示更多按钮
78
- showMoreBtn: {
79
- type: Boolean,
80
- default: false
81
- },
82
- // 是否展示关闭按钮
83
- closabled: {
84
- type: Boolean,
85
- default: true
86
- },
87
- // 标题
88
- title: {
89
- type: String,
90
- default: ""
91
- },
92
- // 辅助操作描述内容
93
- desc: {
94
- type: String,
95
- default: ""
96
- },
97
- // 辅助操作提示内容
98
- tips: {
99
- type: String,
100
- default: ""
101
- },
102
- //背景颜色
103
- background: {
104
- type: String,
105
- default: "#fff"
106
- },
107
- // Popup圆角
108
- radius: {
109
- type: String,
110
- default: "24rpx"
111
- },
112
- // 是否显示遮罩
113
- mask: {
114
- type: Boolean,
115
- default: true
116
- },
117
- // 点击遮罩 是否可关闭
118
- maskClosable: {
119
- type: Boolean,
120
- default: true
121
- },
122
- // 遮罩背景色
123
- maskBackground: {
124
- type: String,
125
- default: "rgba(0,0,0,.6)"
126
- },
127
- // 弹窗固定高度
128
- height: {
129
- type: String,
130
- default: ""
131
- },
132
- // 弹窗最大高度
133
- maxHeight: {
134
- type: String,
135
- default: "75%"
136
- },
137
- // 顶部是否显示下滑Icon
138
- showSlideIcon: {
139
- type: Boolean,
140
- default: false
141
- },
142
- // 隐藏底部(同时最大高度底部遮罩也会消失)
143
- hiddenFooter: {
144
- type: Boolean,
145
- default: false
146
- }
147
- },
148
- data() {
149
- return {
150
- wrapperShow: false,
151
- innerShow: false
152
- };
153
- },
154
- computed: {
155
- popupStyle() {
156
- const style = {
157
- borderTopLeftRadius: this.radius,
158
- borderTopRightRadius: this.radius,
159
- background: this.background,
160
- maxHeight: this.maxHeight
161
- };
162
- // 只有当 height 有值时才设置 height 属性,避免影响现有组件
163
- if (this.height) {
164
- style.height = this.height;
165
- }
166
- return style;
167
- }
168
- },
169
- watch: {
170
- show(nv) {
171
- if (nv) {
172
- this.wrapperShow = true;
173
- this.innerShow = true;
174
- this.$emit('open');
175
- } else {
176
- this.innerShow = false;
177
- setTimeout(() => {
178
- this.wrapperShow = false;
179
- }, 300);
180
- }
181
- }
182
- },
183
- methods: {
184
- onClickMask() {
185
- this.$emit('clickMask');
186
- if (!this.maskClosable) return;
187
- this.handleClose();
188
- },
189
-
190
- handleClose() {
191
- this.$emit("update:show", false);
192
- this.$emit("close");
193
- },
194
-
195
- clickMore() {
196
- this.$emit("clickMore");
197
- },
198
-
199
- stop() {
200
- // do nothing
201
- }
202
- }
203
- };
204
- </script>
205
-
206
- <style scoped>
207
- @keyframes fadeIn {
208
- from {
209
- opacity: 0;
210
- }
211
- to {
212
- opacity: 1;
213
- }
214
- }
215
-
216
- @keyframes fadeOut {
217
- from {
218
- opacity: 1;
219
- }
220
- to {
221
- opacity: 0;
222
- }
223
- }
224
-
225
- @keyframes slideUp {
226
- from {
227
- transform: translate3d(0, 100%, 0);
228
- }
229
-
230
- to {
231
- transform: translate3d(0, 0, 0);
232
- }
233
- }
234
-
235
- @keyframes slideDown {
236
- from {
237
- transform: translate3d(0, 0, 0);
238
- }
239
-
240
- to {
241
- transform: translate3d(0, 100%, 0);
242
- }
243
- }
244
-
245
- .animate_fade-in {
246
- animation: fadeIn ease 0.3s forwards;
247
- }
248
-
249
- .animate_fade-out {
250
- animation: fadeOut ease 0.3s forwards;
251
- }
252
-
253
- .animate-slide-up {
254
- animation: slideUp ease 0.3s forwards;
255
- }
256
-
257
- .animate-slide-down {
258
- animation: slideDown ease 0.3s forwards;
259
- }
260
-
261
- .d-active {
262
- opacity: 0.6;
263
- }
264
-
265
- .d-popup__mask {
266
- position: fixed;
267
- left: 0;
268
- right: 0;
269
- top: 0;
270
- bottom: 0;
271
- z-index: 1000;
272
- }
273
-
274
- .d-popup__popup {
275
- position: fixed;
276
- left: 0;
277
- right: 0;
278
- bottom: 0;
279
- min-height: 255rpx;
280
- max-height: 75%;
281
- z-index: 5000;
282
- overflow: hidden;
283
- box-sizing: border-box;
284
- display: flex;
285
- flex-direction: column;
286
- outline: 0;
287
- }
288
- .d-popup__popup__more-icon {
289
- width: 42rpx;
290
- height: 42rpx;
291
- }
292
-
293
- .d-popup__slide-icon {
294
- width: 100rpx;
295
- height: 8rpx;
296
- border-radius: 30rpx;
297
- background: #d8d8d8;
298
- }
299
-
300
- .d-popup__popup__close-icon {
301
- width: 32rpx;
302
- height: 32rpx;
303
- }
304
-
305
- .d-popup__popup-show {
306
- transform: translate3d(0, 0, 0);
307
- }
308
-
309
- .d-popup__popup__top {
310
- width: 100%;
311
- display: flex;
312
- flex-direction: column;
313
- align-items: center;
314
- padding: 20rpx 0 10rpx;
315
- }
316
-
317
- .d-popup__popup__hd {
318
- display: grid;
319
- grid-template-columns: auto 1fr auto;
320
- padding: 30rpx 30rpx 40rpx 30rpx;
321
- }
322
-
323
- .d-popup__popup__hd__left {
324
- min-width: 30rpx;
325
- padding-right: 10rpx;
326
- }
327
-
328
- .d-popup__popup__hd__middle {
329
- text-align: center;
330
- flex: 1;
331
- margin: 0 10rpx;
332
- }
333
-
334
- .d-popup__popup__hd__right {
335
- min-width: 30rpx;
336
- padding-left: 10rpx;
337
- }
338
-
339
- .d-popup__popup__hd__title {
340
- line-height: 48rpx;
341
- font-size: 34rpx;
342
- color: #3d3d3d;
343
- font-weight: bold;
344
- }
345
-
346
- .d-popup__popup__bd {
347
- padding: 0 30rpx;
348
- box-sizing: border-box;
349
- width: 100%;
350
- overflow-y: auto;
351
- }
352
-
353
- .d-popup__popup__bd__desc {
354
- font-size: 32rpx;
355
- font-weight: bold;
356
- color: #333;
357
- line-height: 42rpx;
358
- }
359
-
360
- .d-popup__popup__bd__tips {
361
- font-size: 30rpx;
362
- color: #666;
363
- line-height: 40rpx;
364
- margin-top: 20rpx;
365
- }
366
-
367
- .d-popup__popup__ft {
368
- position: relative;
369
- z-index: 9;
370
- }
371
-
372
- .d-popup__safe-bottom {
373
- height: env(safe-area-inset-bottom);
374
- }
375
-
376
- .d-popup__popup__ft__tool {
377
- position: relative;
378
- z-index: 50;
379
- }
380
-
381
- .d-popup__popup__ft__tool::before {
382
- content: "";
383
- height: 100rpx;
384
- background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
385
- position: absolute;
386
- bottom: calc(100% - 1px);
387
- left: 0;
388
- right: 0;
389
- transform: translateZ(0);
390
- pointer-events: none;
391
- background-image: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
392
- }
393
-
394
- .d-popup__popup__ft__mask {
395
- position: absolute;
396
- bottom: 0;
397
- left: 0;
398
- width: 100%;
399
- height: 100rpx;
400
- opacity: 1;
401
- }
402
-
403
- .d-popup__popup__ft__buttons {
404
- display: flex;
405
- align-items: center;
406
- justify-content: center;
407
- padding-bottom: 60rpx;
408
- }
409
-
410
- .ellipse-one-line {
411
- word-break: break-all;
412
- text-overflow: ellipsis;
413
- display: -webkit-box;
414
- /*! autoprefixer: off */
415
- -webkit-box-orient: vertical;
416
- -webkit-line-clamp: 1;
417
- overflow: hidden;
418
- }
419
- </style>
1
+ <template>
2
+ <view v-if="wrapperShow">
3
+ <view
4
+ class="d-popup__mask"
5
+ :class="{ 'animate-fade-in': innerShow, 'animate-fade-out': !innerShow }"
6
+ v-if="mask"
7
+ :style="{ background: maskBackground }"
8
+ @tap.stop="onClickMask"
9
+ @touchmove.stop.prevent="stop"
10
+ />
11
+ <view
12
+ class="d-popup__popup"
13
+ :class="{ 'animate-slide-up': innerShow, 'animate-slide-down': !innerShow }"
14
+ :style="[popupStyle]"
15
+ @tap.stop="stop"
16
+ @touchmove="onPopupTouchMove"
17
+ >
18
+ <view class="d-popup__popup__top" v-if="showSlideIcon" @touchmove.stop="handleClose" @tap.stop="handleClose">
19
+ <view class="d-popup__slide-icon" />
20
+ </view>
21
+ <view class="d-popup__popup__hd" @touchmove.stop="stop">
22
+ <view class="d-popup__popup__hd__left">
23
+ <view v-if="showMoreBtn" class="d-popup__popup__more" hover-class="d-active" @tap.stop="clickMore">
24
+ <image
25
+ mode="widthFix"
26
+ class="d-popup__popup__more-icon"
27
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAYAAACtWK6eAAAFDUlEQVR4nO3b0W1URxiG4bM0gFMBpAKMgOtsCaYCSAV2KsBUgKkgUAHuIMk1IEwHUEGM4BrnXwVLZLV8MvbZmQl6Hmk0g2+s/0jv7C4Liwn4JoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAYPpB79+7tnp2dPajjbq2dOq/2abFYnNR2Wuukzs9fvnx5Uuf/FbONP9uQgSyXy51Pnz7t10M9qD/u1LqI03rgR69evXpc52EtzbZu6NkWtYZy586dvdqe1Lo5Xc67aZp+e/369XHtQzFb9G4acLZFrWHcvXv3yZfb58rqVjoc6VYy28WMNtui1hDqBvq9tofTvJ7VjfRr7V2Z7bsNMdvKolZ39ZCPatuvNbu6kR7XjXQ4dWK2y+k927nugdRD3qvtRa1tul830nHtTZntyrrM9rWugSzrbz0+fvz4po43p+16Vw/659qbWZptDs1nW7eo1U19uDusD3eP6rh1rV+yzTaP1rOt6xpIvUz/XdtOrRZO6zb6qfYmzDabprOt6xZI3ULLuoX+qGMz165du93im1uzzavVbJt0C6RuoaPa9mu19LRuo4Pat8pss2sy2ybdAqmb6M+6iX6pYzP1fvavej+7nLbMbPNqNdsmPQN5Uw96t47N1IM+qQd9u45bZbZ5tZptk26B1Ev1WW3N1Uv11mc22/xazLZJl1+68iM/aLPNr8Vsm3T5pSv1oE9qu1Wrpbf1oHdr3yqzza7JbJt0C6Tey/6wH/bMNq9Ws23SLZC6iY5q26/V0tO6iQ5q3yqzza7JbJt0C2T1XzI/f/78po7NtPrCyWzzajXbJt0CWanb6LS267Va+FC30E7tTZhtNk1nW9c1kHo/e1jvZx/Vcevqfezjeh97ODVitnm0nm1d10CW//6z6ZM63qi1Te/rFro5NbQ02xyaz7auayAr9XK9V9uLWtt0vx70ce1Nme3Kusz2te6BrGzzJbv3S7TZLqf3bOeGCGSlbqRn0zQ9qDWn53UDPZw6M9t3G2K2lWECWZnzRhrlBjpntosZbbahAlmpG2mvtqNaN2pdxvtaB3UDHdc+FLNFQ862qDWkL7fSQR2v17qID3X7HI10+3yL2f5j6NmGDeTcl29uH9ZD3K0Hv1M/ulVr5W397LR+dlLftD7r9U3rVZht/NmGDwR6EggEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBAKBQCAQCAQCgUAgEAgEAoFAIBAIBIJ/AEZQjudcAs0hAAAAAElFTkSuQmCC"
28
+ />
29
+ </view>
30
+ <slot v-else name="header-left"></slot>
31
+ </view>
32
+ <view class="d-popup__popup__hd__middle">
33
+ <span v-if="title" class="d-popup__popup__hd__title ellipse-one-line">{{ title }}</span>
34
+ <slot v-else name="header-middle"></slot>
35
+ </view>
36
+ <view class="d-popup__popup__hd__right">
37
+ <view v-if="closabled" class="d-popup__popup__close" @tap.stop="handleClose" hover-class="d-active">
38
+ <image
39
+ mode="widthFix"
40
+ class="d-popup__popup__close-icon"
41
+ src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAMAAABg3Am1AAAAAXNSR0IArs4c6QAAADZQTFRFAAAAAAAAQEBAMzMzMzMzMzMzNDQ0MjIyNDQ0MzMzNDQ0NDQ0MzMzMzMzMzMzMzMzNDQ0NTU1nbBS4wAAAA90Uk5TAAIEBQ8UWXBxpKyys/b+RAoM/gAAAMRJREFUSMftlUsOwyAMRMMfAqnh/petqqpqBBgYKdnFSw/Yj2Am2/bEjSGsN7yqnRVVyh6UJLdeRjpslXNEZWd2yL0Q+bppLK+SdJcnfSTTLdOjkolpzghsoV9rvZAcFGN5GHnA0wUY8nRKTniaRVOeCmOB50yl1ArPiSqEJZ4/Vc5rPN9QIRPloLa7NqBI6KHRz4peHDoa6PCh440+IPSJoiaA2gxqZCaNrTLWkp+ZsWvtPo78qrF7Yd3ggoxvfihPXBpv888R1ZroG5MAAAAASUVORK5CYII="
42
+ />
43
+ </view>
44
+ <slot v-else name="header-right"></slot>
45
+ </view>
46
+ </view>
47
+ <!-- scrollableBody 时:scroll-view + 固定高度,真机可手势滚动 -->
48
+ <template v-if="scrollableBody">
49
+ <view class="d-popup__popup__bd-wrap" @touchmove.stop="stop">
50
+ <scroll-view
51
+ class="d-popup__popup__bd d-popup__popup__bd--scroll"
52
+ scroll-y
53
+ :enhanced="true"
54
+ :scroll-with-animation="true"
55
+ :show-scrollbar="false"
56
+ >
57
+ <slot name="body">
58
+ <view class="d-popup__popup__bd__desc">{{ desc }}</view>
59
+ <view class="d-popup__popup__bd__tips">{{ tips }}</view>
60
+ </slot>
61
+ <view style="width: 100%; height: 100rpx" v-if="!hiddenFooter" />
62
+ </scroll-view>
63
+ </view>
64
+ </template>
65
+ <!-- 默认:原有 view+scroll-y,弹窗按内容高度,不影响现有用法 -->
66
+ <view v-else class="d-popup__popup__bd d-popup__popup__bd--plain" scroll-y scroll-with-animation>
67
+ <slot name="body">
68
+ <view class="d-popup__popup__bd__desc">{{ desc }}</view>
69
+ <view class="d-popup__popup__bd__tips">{{ tips }}</view>
70
+ </slot>
71
+ <view style="width: 100%; height: 100rpx" v-if="!hiddenFooter" />
72
+ </view>
73
+ <view class="d-popup__popup__ft d-popup__popup__ft__tool" v-if="!hiddenFooter" @touchmove.stop="stop">
74
+ <slot name="footer">
75
+ <view class="d-popup__popup__ft__buttons">
76
+ <d-button width="272rpx" type="secondary" margin="0 15rpx">次要按钮</d-button>
77
+ <d-button width="272rpx" type="primary" margin="0 15rpx">主按钮</d-button>
78
+ </view>
79
+ </slot>
80
+ </view>
81
+ <view class="d-popup__safe-bottom" @touchmove.stop="stop"></view>
82
+ </view>
83
+ </view>
84
+ </template>
85
+
86
+ <script>
87
+ /*如果底部有自定义导航栏,可适当设置内容padding-bottom值*/
88
+ export default {
89
+ name: "d-popup",
90
+ emits: ['update:show', 'clickMore', 'close', 'open', 'clickMask'],
91
+ props: {
92
+ // 是否显示
93
+ show: {
94
+ type: Boolean,
95
+ default: false
96
+ },
97
+ // 是否展示更多按钮
98
+ showMoreBtn: {
99
+ type: Boolean,
100
+ default: false
101
+ },
102
+ // 是否展示关闭按钮
103
+ closabled: {
104
+ type: Boolean,
105
+ default: true
106
+ },
107
+ // 标题
108
+ title: {
109
+ type: String,
110
+ default: ""
111
+ },
112
+ // 辅助操作描述内容
113
+ desc: {
114
+ type: String,
115
+ default: ""
116
+ },
117
+ // 辅助操作提示内容
118
+ tips: {
119
+ type: String,
120
+ default: ""
121
+ },
122
+ //背景颜色
123
+ background: {
124
+ type: String,
125
+ default: "#fff"
126
+ },
127
+ // Popup圆角
128
+ radius: {
129
+ type: String,
130
+ default: "24rpx"
131
+ },
132
+ // 是否显示遮罩
133
+ mask: {
134
+ type: Boolean,
135
+ default: true
136
+ },
137
+ // 点击遮罩 是否可关闭
138
+ maskClosable: {
139
+ type: Boolean,
140
+ default: true
141
+ },
142
+ // 遮罩背景色
143
+ maskBackground: {
144
+ type: String,
145
+ default: "rgba(0,0,0,.6)"
146
+ },
147
+ // 弹窗固定高度
148
+ height: {
149
+ type: String,
150
+ default: ""
151
+ },
152
+ // 弹窗最大高度
153
+ maxHeight: {
154
+ type: String,
155
+ default: "75%"
156
+ },
157
+ // 顶部是否显示下滑Icon
158
+ showSlideIcon: {
159
+ type: Boolean,
160
+ default: false
161
+ },
162
+ // 隐藏底部(同时最大高度底部遮罩也会消失)
163
+ hiddenFooter: {
164
+ type: Boolean,
165
+ default: false
166
+ },
167
+ // 内容区是否可滚动(长内容时设为 true,弹窗会占满 maxHeight 并使用 scroll-view 保证真机可滑;默认 false 保持原有按内容高度,不影响现有用法)
168
+ scrollableBody: {
169
+ type: Boolean,
170
+ default: false
171
+ }
172
+ },
173
+ data() {
174
+ return {
175
+ wrapperShow: false,
176
+ innerShow: false
177
+ };
178
+ },
179
+ computed: {
180
+ popupStyle() {
181
+ const style = {
182
+ borderTopLeftRadius: this.radius,
183
+ borderTopRightRadius: this.radius,
184
+ background: this.background,
185
+ maxHeight: this.maxHeight
186
+ };
187
+ // 有固定 height 时用 height;仅当 scrollableBody 时用 maxHeight 作为 height(真机 scroll-view 需明确高度),否则不设 height 保持按内容高度
188
+ if (this.height) {
189
+ style.height = this.height;
190
+ } else if (this.scrollableBody) {
191
+ style.height = this.maxHeight;
192
+ }
193
+ return style;
194
+ }
195
+ },
196
+ watch: {
197
+ show(nv) {
198
+ if (nv) {
199
+ this.wrapperShow = true;
200
+ this.innerShow = true;
201
+ this.$emit('open');
202
+ } else {
203
+ this.innerShow = false;
204
+ setTimeout(() => {
205
+ this.wrapperShow = false;
206
+ }, 300);
207
+ }
208
+ }
209
+ },
210
+ methods: {
211
+ onClickMask() {
212
+ this.$emit('clickMask');
213
+ if (!this.maskClosable) return;
214
+ this.handleClose();
215
+ },
216
+
217
+ handleClose() {
218
+ this.$emit("update:show", false);
219
+ this.$emit("close");
220
+ },
221
+
222
+ clickMore() {
223
+ this.$emit("clickMore");
224
+ },
225
+
226
+ stop() {
227
+ // 仅用于 @touchmove.stop 占位,阻止冒泡由修饰符完成
228
+ },
229
+
230
+ onPopupTouchMove(e) {
231
+ // 仅在不使用 scrollableBody 时在弹层统一拦截,防穿透且不绑在内容区上避免影响原有滚动
232
+ if (!this.scrollableBody) {
233
+ e.stopPropagation();
234
+ }
235
+ }
236
+ }
237
+ };
238
+ </script>
239
+
240
+ <style scoped>
241
+ @keyframes fadeIn {
242
+ from {
243
+ opacity: 0;
244
+ }
245
+ to {
246
+ opacity: 1;
247
+ }
248
+ }
249
+
250
+ @keyframes fadeOut {
251
+ from {
252
+ opacity: 1;
253
+ }
254
+ to {
255
+ opacity: 0;
256
+ }
257
+ }
258
+
259
+ @keyframes slideUp {
260
+ from {
261
+ transform: translate3d(0, 100%, 0);
262
+ }
263
+
264
+ to {
265
+ transform: translate3d(0, 0, 0);
266
+ }
267
+ }
268
+
269
+ @keyframes slideDown {
270
+ from {
271
+ transform: translate3d(0, 0, 0);
272
+ }
273
+
274
+ to {
275
+ transform: translate3d(0, 100%, 0);
276
+ }
277
+ }
278
+
279
+ .animate_fade-in {
280
+ animation: fadeIn ease 0.3s forwards;
281
+ }
282
+
283
+ .animate_fade-out {
284
+ animation: fadeOut ease 0.3s forwards;
285
+ }
286
+
287
+ .animate-slide-up {
288
+ animation: slideUp ease 0.3s forwards;
289
+ }
290
+
291
+ .animate-slide-down {
292
+ animation: slideDown ease 0.3s forwards;
293
+ }
294
+
295
+ .d-active {
296
+ opacity: 0.6;
297
+ }
298
+
299
+ .d-popup__mask {
300
+ position: fixed;
301
+ left: 0;
302
+ right: 0;
303
+ top: 0;
304
+ bottom: 0;
305
+ z-index: 1000;
306
+ }
307
+
308
+ .d-popup__popup {
309
+ position: fixed;
310
+ left: 0;
311
+ right: 0;
312
+ bottom: 0;
313
+ min-height: 255rpx;
314
+ max-height: 75%;
315
+ z-index: 5000;
316
+ overflow: hidden;
317
+ box-sizing: border-box;
318
+ display: flex;
319
+ flex-direction: column;
320
+ outline: 0;
321
+ }
322
+ .d-popup__popup__more-icon {
323
+ width: 42rpx;
324
+ height: 42rpx;
325
+ }
326
+
327
+ .d-popup__slide-icon {
328
+ width: 100rpx;
329
+ height: 8rpx;
330
+ border-radius: 30rpx;
331
+ background: #d8d8d8;
332
+ }
333
+
334
+ .d-popup__popup__close-icon {
335
+ width: 32rpx;
336
+ height: 32rpx;
337
+ }
338
+
339
+ .d-popup__popup-show {
340
+ transform: translate3d(0, 0, 0);
341
+ }
342
+
343
+ .d-popup__popup__top {
344
+ width: 100%;
345
+ display: flex;
346
+ flex-direction: column;
347
+ align-items: center;
348
+ padding: 20rpx 0 10rpx;
349
+ }
350
+
351
+ .d-popup__popup__hd {
352
+ display: grid;
353
+ grid-template-columns: auto 1fr auto;
354
+ padding: 30rpx 30rpx 40rpx 30rpx;
355
+ }
356
+
357
+ .d-popup__popup__hd__left {
358
+ min-width: 30rpx;
359
+ padding-right: 10rpx;
360
+ }
361
+
362
+ .d-popup__popup__hd__middle {
363
+ text-align: center;
364
+ flex: 1;
365
+ margin: 0 10rpx;
366
+ }
367
+
368
+ .d-popup__popup__hd__right {
369
+ min-width: 30rpx;
370
+ padding-left: 10rpx;
371
+ }
372
+
373
+ .d-popup__popup__hd__title {
374
+ line-height: 48rpx;
375
+ font-size: 34rpx;
376
+ color: #3d3d3d;
377
+ font-weight: bold;
378
+ }
379
+
380
+ .d-popup__popup__bd-wrap {
381
+ flex: 1;
382
+ min-height: 0;
383
+ overflow: hidden;
384
+ display: flex;
385
+ flex-direction: column;
386
+ }
387
+
388
+ .d-popup__popup__bd {
389
+ padding: 0 30rpx;
390
+ box-sizing: border-box;
391
+ width: 100%;
392
+ }
393
+
394
+ .d-popup__popup__bd--plain {
395
+ overflow-y: auto;
396
+ }
397
+
398
+ .d-popup__popup__bd--scroll {
399
+ height: 100%;
400
+ /* 隐藏滚动条:小程序由 show-scrollbar="false" 控制,H5 等由 CSS 兜底 */
401
+ scrollbar-width: none;
402
+ -ms-overflow-style: none;
403
+ }
404
+ .d-popup__popup__bd--scroll::-webkit-scrollbar {
405
+ display: none;
406
+ width: 0;
407
+ height: 0;
408
+ }
409
+
410
+ .d-popup__popup__bd__desc {
411
+ font-size: 32rpx;
412
+ font-weight: bold;
413
+ color: #333;
414
+ line-height: 42rpx;
415
+ }
416
+
417
+ .d-popup__popup__bd__tips {
418
+ font-size: 30rpx;
419
+ color: #666;
420
+ line-height: 40rpx;
421
+ margin-top: 20rpx;
422
+ }
423
+
424
+ .d-popup__popup__ft {
425
+ position: relative;
426
+ z-index: 9;
427
+ }
428
+
429
+ .d-popup__safe-bottom {
430
+ height: env(safe-area-inset-bottom);
431
+ }
432
+
433
+ .d-popup__popup__ft__tool {
434
+ position: relative;
435
+ z-index: 50;
436
+ }
437
+
438
+ .d-popup__popup__ft__tool::before {
439
+ content: "";
440
+ height: 100rpx;
441
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
442
+ position: absolute;
443
+ bottom: calc(100% - 1px);
444
+ left: 0;
445
+ right: 0;
446
+ transform: translateZ(0);
447
+ pointer-events: none;
448
+ background-image: linear-gradient(180deg, rgba(255, 255, 255, 0) 0%, #ffffff 100%);
449
+ }
450
+
451
+ .d-popup__popup__ft__mask {
452
+ position: absolute;
453
+ bottom: 0;
454
+ left: 0;
455
+ width: 100%;
456
+ height: 100rpx;
457
+ opacity: 1;
458
+ }
459
+
460
+ .d-popup__popup__ft__buttons {
461
+ display: flex;
462
+ align-items: center;
463
+ justify-content: center;
464
+ padding-bottom: 60rpx;
465
+ }
466
+
467
+ .ellipse-one-line {
468
+ word-break: break-all;
469
+ text-overflow: ellipsis;
470
+ display: -webkit-box;
471
+ /*! autoprefixer: off */
472
+ -webkit-box-orient: vertical;
473
+ -webkit-line-clamp: 1;
474
+ overflow: hidden;
475
+ }
476
+ </style>
package/lib/index.js CHANGED
@@ -13,7 +13,7 @@ import DTabs from './components/d-tabs/d-tabs.vue';
13
13
  }
14
14
  });
15
15
  }
16
- const version = '0.2.1';
16
+ const version = '0.2.2';
17
17
  export { install, version };
18
18
 
19
19
  export default { install, version };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "distinctui-uni",
3
- "version": "0.2.1",
3
+ "version": "0.2.3",
4
4
  "description": "Distinct MiniProgram UI",
5
5
  "author": "benzheng <benzheng@distinctclinic.com>",
6
6
  "scripts": {
@@ -17,7 +17,7 @@
17
17
  ],
18
18
  "publishConfig": {
19
19
  "access": "public",
20
- "registry": "https://registry.npmjs.org/"
20
+ "registry": "https://registry.npmjs.com/"
21
21
  },
22
22
  "keywords": [
23
23
  "MiniProgram",