@shijiu/jsview-vue 0.9.254 → 0.9.267

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.
Files changed (168) hide show
  1. package/dom/bin/package.json +11 -11
  2. package/dom/browser-root-style.css +21 -21
  3. package/loader/jsview-main.js +41 -41
  4. package/loader/jsview.config.default.js +37 -37
  5. package/loader/jsview.default.config.js +37 -37
  6. package/package.json +1 -5
  7. package/samples/AdvanceMetroWidget/App.vue +122 -122
  8. package/samples/AdvanceMetroWidget/Frame.vue +100 -100
  9. package/samples/AdvanceMetroWidget/Item.vue +57 -57
  10. package/samples/AdvanceMetroWidget/data.js +136 -136
  11. package/samples/AnimPicture/App.vue +223 -223
  12. package/samples/Basic/App.vue +128 -128
  13. package/samples/Basic/components/TitleBar.vue +28 -28
  14. package/samples/Basic/components/anim/AnimGroup.vue +67 -67
  15. package/samples/Basic/components/anim/AnimKeyframeBasic.vue +101 -101
  16. package/samples/Basic/components/anim/AnimKeyframeComposite.vue +52 -52
  17. package/samples/Basic/components/anim/AnimTransition.vue +116 -116
  18. package/samples/Basic/components/div/DivBackground.vue +14 -14
  19. package/samples/Basic/components/div/DivClip.vue +80 -80
  20. package/samples/Basic/components/div/DivCssScoped.vue +26 -26
  21. package/samples/Basic/components/div/DivCssVar.vue +49 -49
  22. package/samples/Basic/components/div/DivGroup1.vue +32 -32
  23. package/samples/Basic/components/div/DivGroup2.vue +40 -40
  24. package/samples/Basic/components/div/DivLayout.vue +11 -11
  25. package/samples/Basic/components/div/DivRadius.vue +46 -46
  26. package/samples/Basic/components/text/TextAlign.vue +47 -47
  27. package/samples/Basic/components/text/TextFontStyle.vue +57 -57
  28. package/samples/Basic/components/text/TextGroup.vue +31 -31
  29. package/samples/Basic/components/text/TextOverflow.vue +77 -77
  30. package/samples/BasicFocusControl/App.vue +124 -124
  31. package/samples/BasicFocusControl/components/BaseBlock.vue +50 -50
  32. package/samples/BasicFocusControl/components/MainArea.vue +97 -97
  33. package/samples/BasicFocusControl/components/MainAreaLeftBlock.vue +20 -20
  34. package/samples/BasicFocusControl/components/MainAreaRightBlock.vue +29 -29
  35. package/samples/BasicFocusControl/components/SideBar.vue +72 -72
  36. package/samples/BasicFocusControl/components/SideBarBlock.vue +29 -29
  37. package/samples/ClassNameDemo/App.vue +119 -119
  38. package/samples/ClassNameDemo/components/ContentItem.vue +252 -252
  39. package/samples/ClassNameDemo/components/LoadingView.vue +43 -43
  40. package/samples/ClassNameDemo/components/TitleView.vue +24 -24
  41. package/samples/ClassNameDemo/data.js +24 -24
  42. package/samples/ColorSpace/App.vue +134 -134
  43. package/samples/DemoHomepage/App.vue +31 -31
  44. package/samples/DemoHomepage/components/BodyFrame.vue +81 -81
  45. package/samples/DemoHomepage/components/Dialog.vue +93 -93
  46. package/samples/DemoHomepage/components/Item.vue +76 -76
  47. package/samples/DemoHomepage/components/TabFrame.vue +86 -86
  48. package/samples/DemoHomepage/router.js +132 -132
  49. package/samples/DemoHomepage/views/Homepage.vue +186 -186
  50. package/samples/FlipCard/App.vue +80 -80
  51. package/samples/FlipCard/FlipCard.vue +123 -123
  52. package/samples/FlipCard/data.js +12 -12
  53. package/samples/FlowMultiWidget/App.vue +90 -90
  54. package/samples/FlowMultiWidget/components/Block.vue +106 -106
  55. package/samples/FlowMultiWidget/components/FlowPage.vue +59 -59
  56. package/samples/FlowMultiWidget/components/Item.vue +102 -102
  57. package/samples/FlowMultiWidget/components/MenuItem.vue +71 -71
  58. package/samples/FlowMultiWidget/components/MyMenu.vue +89 -89
  59. package/samples/FlowMultiWidget/data.js +446 -446
  60. package/samples/HashHistory/App.vue +124 -124
  61. package/samples/HashHistory/components/HorizontalButtonList.vue +113 -113
  62. package/samples/HashHistory/components/Item.vue +73 -73
  63. package/samples/HashHistory/router.js +29 -29
  64. package/samples/HashHistory/views/BasePage.vue +18 -18
  65. package/samples/HashHistory/views/MainPage.vue +67 -67
  66. package/samples/HashHistory/views/SubPage.vue +78 -78
  67. package/samples/HashHistory/views/SubPageFirst.vue +9 -9
  68. package/samples/HashHistory/views/SubPageSecond.vue +9 -9
  69. package/samples/LongImage/App.vue +96 -96
  70. package/samples/LongImage/Button.vue +153 -153
  71. package/samples/LongImage/LongImageScroll.vue +126 -126
  72. package/samples/LongImage/Scroll.vue +15 -15
  73. package/samples/LongText/App.vue +111 -111
  74. package/samples/LongText/Button.vue +153 -153
  75. package/samples/LongText/LongTextScroll.vue +224 -224
  76. package/samples/LongText/Scroll.vue +15 -15
  77. package/samples/Preload/App.vue +145 -145
  78. package/samples/Preload/data.js +22 -22
  79. package/samples/Preload/preloadItem.vue +21 -21
  80. package/samples/QrcodeDemo/App.vue +72 -72
  81. package/samples/SimpleWidgetDemo/App.vue +203 -203
  82. package/samples/SimpleWidgetDemo/Item.vue +82 -82
  83. package/samples/SimpleWidgetDemo/components/ContentItem.vue +411 -411
  84. package/samples/SimpleWidgetDemo/components/MyTab.vue +116 -116
  85. package/samples/SimpleWidgetDemo/data.js +110 -110
  86. package/samples/SprayView/App.vue +269 -269
  87. package/samples/SpriteImage/App.vue +174 -174
  88. package/samples/SpriteImage/images/egg_break.json +116 -116
  89. package/samples/TextBox/App.vue +178 -178
  90. package/samples/TextBox/RenderCenter.vue +108 -108
  91. package/samples/TextBox/RenderLeft.vue +108 -108
  92. package/samples/TextBox/RenderOneLine.vue +119 -119
  93. package/samples/TextBox/RenderRight.vue +106 -106
  94. package/samples/TextShadowDemo/App.vue +97 -97
  95. package/samples/TextureSize/App.vue +141 -141
  96. package/samples/ThrowMoveDemo/AccelerateDemo.vue +117 -117
  97. package/samples/ThrowMoveDemo/App.vue +113 -113
  98. package/samples/ThrowMoveDemo/LRParabolicDemo.vue +115 -115
  99. package/samples/ThrowMoveDemo/TargetDemo.vue +116 -116
  100. package/samples/ThrowMoveDemo/UDParabolicDemo.vue +121 -121
  101. package/samples/TransitPage/App.vue +40 -40
  102. package/samples/VideoDemo/App.vue +137 -137
  103. package/samples/VideoDemo/components/Button.vue +68 -68
  104. package/samples/VideoDemo/components/Controllor.vue +195 -195
  105. package/samples/VideoDemo/components/VideoFrame.vue +152 -152
  106. package/scripts/common.js +57 -115
  107. package/scripts/jsview-install-local-packages.js +73 -73
  108. package/scripts/jsview-post-build.js +127 -127
  109. package/scripts/jsview-post-install.js +78 -78
  110. package/scripts/jsview-run-android.js +64 -64
  111. package/utils/JsViewEngineWidget/bin/index.js +1 -1
  112. package/utils/JsViewEngineWidget/bin/package.json +11 -11
  113. package/utils/JsViewVueTools/JsvHashHistory.js +111 -111
  114. package/utils/JsViewVueTools/JsvRuntimeBridge.js +417 -417
  115. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserPreload.vue +80 -80
  116. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserQrcode.vue +147 -147
  117. package/utils/JsViewVueWidget/BrowserDebugWidget/BrowserSpray.vue +54 -54
  118. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/ApicDataBase.js +28 -28
  119. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/BrowserApic.vue +123 -123
  120. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/GifData.js +83 -83
  121. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/LoopToolBase.js +25 -25
  122. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/NormalLoopTool.js +61 -61
  123. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/PartLoopTool.js +119 -119
  124. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/Viewer.js +106 -106
  125. package/utils/JsViewVueWidget/BrowserDebugWidget/JsvApic/WebpData.js +141 -141
  126. package/utils/JsViewVueWidget/BrowserDebugWidget/WidgetLoader.js +20 -20
  127. package/utils/JsViewVueWidget/JsvActorMove/ActorControlBase.js +204 -204
  128. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMove.vue +63 -63
  129. package/utils/JsViewVueWidget/JsvActorMove/JsvActorMoveControl.js +426 -426
  130. package/utils/JsViewVueWidget/JsvActorMove/index.js +12 -12
  131. package/utils/JsViewVueWidget/JsvApic/JsvApic.vue +178 -178
  132. package/utils/JsViewVueWidget/JsvApic/index.js +17 -17
  133. package/utils/JsViewVueWidget/JsvMarquee.vue +196 -196
  134. package/utils/JsViewVueWidget/JsvNinePatch.vue +76 -76
  135. package/utils/JsViewVueWidget/JsvPreload/JsvPreload.vue +350 -350
  136. package/utils/JsViewVueWidget/JsvPreload/index.js +21 -21
  137. package/utils/JsViewVueWidget/JsvQrcode/JsvQrcode.vue +140 -140
  138. package/utils/JsViewVueWidget/JsvQrcode/index.js +18 -18
  139. package/utils/JsViewVueWidget/JsvSpray/JsvSpray.vue +139 -139
  140. package/utils/JsViewVueWidget/JsvSpray/index.js +14 -14
  141. package/utils/JsViewVueWidget/JsvSpriteAnim/JsvSpriteAnim.vue +447 -447
  142. package/utils/JsViewVueWidget/JsvSpriteAnim/SpriteController.js +56 -56
  143. package/utils/JsViewVueWidget/JsvSpriteAnim/index.js +6 -6
  144. package/utils/JsViewVueWidget/JsvSwiper/Indicator.vue +34 -34
  145. package/utils/JsViewVueWidget/JsvSwiper/JsvSwiper.vue +494 -494
  146. package/utils/JsViewVueWidget/JsvSwiper/index.js +9 -9
  147. package/utils/JsViewVueWidget/JsvSwiper3D/Indicator.vue +34 -34
  148. package/utils/JsViewVueWidget/JsvSwiper3D/JsvSwiper.vue +403 -403
  149. package/utils/JsViewVueWidget/JsvSwiper3D/index.js +9 -9
  150. package/utils/JsViewVueWidget/JsvTextBox.vue +110 -110
  151. package/utils/JsViewVueWidget/JsvVideo.vue +35 -35
  152. package/patches/node_modules/@babel/preset-env/lib/available-plugins.js +0 -219
  153. package/patches/node_modules/@vue/cli-plugin-typescript/index.js +0 -100
  154. package/patches/node_modules/@vue/cli-service/lib/commands/serve.js +0 -395
  155. package/patches/node_modules/@vue/cli-service/lib/config/app.js +0 -272
  156. package/patches/node_modules/@vue/cli-service/lib/config/assets.js +0 -70
  157. package/patches/node_modules/@vue/cli-service/lib/config/base.js +0 -212
  158. package/patches/node_modules/@vue/compiler-sfc/dist/compiler-sfc.cjs.js +0 -2566
  159. package/patches/node_modules/@vue/compiler-sfc/dist/jsview-css-to-js.js +0 -274
  160. package/patches/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js +0 -1596
  161. package/patches/node_modules/postcss-js/objectifier.js +0 -90
  162. package/patches/node_modules/vue-loader/dist/resolveScript.js +0 -70
  163. package/scripts/deploy-fast-pack.js +0 -17
  164. package/scripts/deploy-fast-publish.js +0 -44
  165. package/scripts/deploy-git-commit-empty.js +0 -21
  166. package/scripts/deploy-prepare.js +0 -56
  167. package/scripts/make-js.sh +0 -181
  168. package/vetur.config.js +0 -5
@@ -1,404 +1,404 @@
1
- <!--
2
- * @Author: ChenChanghua
3
- * @Date: 2021-11-23 09:42:26
4
- * @LastEditors: ChenChanghua
5
- * @LastEditTime: 2021-11-29 11:04:37
6
- * @Description: file content
7
- -->
8
- <script>
9
- import Indicator from "./Indicator.vue";
10
- import { ref } from "vue";
11
-
12
- const VIEW_NUM = 4;
13
-
14
- function modToRange(value, mod, start = 0) {
15
- let m = value % mod;
16
- if (m < start) {
17
- m += mod;
18
- } else if (m >= start + mod) {
19
- m -= mod;
20
- }
21
- return m;
22
- }
23
-
24
- window.modToRange = modToRange;
25
-
26
- export default {
27
- components: { Indicator },
28
- props: {
29
- showIndicator: {
30
- type: Boolean,
31
- default: true,
32
- },
33
- dotSize: {
34
- type: Number,
35
- default: 10,
36
- },
37
- dotGap: {
38
- type: Number,
39
- default: 10,
40
- },
41
- indicatorPos: {
42
- type: Number,
43
- default: -1,
44
- },
45
- indicatorAlign: {
46
- type: String,
47
- default: "middle",
48
- },
49
- totalFrame: {
50
- type: Number,
51
- require: true,
52
- },
53
- firstFrame: {
54
- type: Number,
55
- default: 0,
56
- },
57
- layoutInfo: {
58
- type: Object,
59
- require: true,
60
- },
61
- onClick: {
62
- type: Function,
63
- },
64
- onChange: {
65
- type: Function,
66
- },
67
- scale: {
68
- type: Number,
69
- default: 1.0,
70
- },
71
- autoplayInterval: {
72
- type: Number,
73
- default: 5000,
74
- },
75
- animation: {
76
- type: Object,
77
- default() {
78
- return {
79
- duration: 200,
80
- easing: "linear",
81
- };
82
- },
83
- },
84
- vertical: {
85
- type: Boolean,
86
- default: false,
87
- },
88
- name: {
89
- type: String,
90
- },
91
- onFocus: {
92
- type: Function,
93
- },
94
- onBlur: {
95
- type: Function,
96
- },
97
- backgroundImage: {
98
- type: String,
99
- },
100
- backgroundColor: {
101
- type: String,
102
- },
103
- },
104
- computed: {
105
- indicatorLayout() {
106
- let indicatorSize =
107
- this.totalFrame * (this.dotSize + this.dotGap) - this.dotGap;
108
- if (this.vertical) {
109
- let top;
110
- if (this.indicatorAlign === "start") {
111
- top = this.dotGap;
112
- } else if (this.indicatorAlign === "end") {
113
- top = this.layoutInfo.widgetHeight - indicatorSize - this.dotGap;
114
- } else {
115
- top = (this.layoutInfo.widgetHeight - indicatorSize) / 2;
116
- }
117
- return {
118
- left:
119
- this.indicatorPos < 0
120
- ? this.layoutInfo.widgetWidth * 0.8
121
- : this.indicatorPos,
122
- top,
123
- zIndex: 1,
124
- };
125
- } else {
126
- let left;
127
- if (this.indicatorAlign === "start") {
128
- left = this.dotGap;
129
- } else if (this.indicatorAlign === "end") {
130
- left = this.layoutInfo.widgetWidth - indicatorSize - this.dotGap;
131
- } else {
132
- left = (this.layoutInfo.widgetWidth - indicatorSize) / 2;
133
- }
134
- return {
135
- left,
136
- top:
137
- this.indicatorPos < 0
138
- ? this.layoutInfo.widgetHeight * 0.8
139
- : this.indicatorPos,
140
- zIndex: 1,
141
- };
142
- }
143
- },
144
- indicatorDotSize() {
145
- return this.dotSize + this.dotGap;
146
- },
147
- currentDataIndex() {
148
- return modToRange(this.firstFrame + this.offset, this.totalFrame);
149
- },
150
- currentViewIndex() {
151
- return modToRange(this.offset + (VIEW_NUM / 2 - 1), VIEW_NUM);
152
- },
153
- viewInfoList() {
154
- let layoutInfo = this.layoutInfo;
155
- let currentLeft =
156
- (this.layoutInfo.widgetWidth - this.layoutInfo.frameWidth) / 2;
157
- let currentTop =
158
- (this.layoutInfo.widgetHeight - this.layoutInfo.frameHeight) / 2;
159
- let duration = this.animation.duration / 1000;
160
- let easing = this.animation.easing ? this.animation.easing : "linear";
161
- let styleList = [
162
- {
163
- layout: {
164
- top: currentTop + (this.vertical ? -layoutInfo.deltaPos : 0),
165
- left: currentLeft + (this.vertical ? 0 : -layoutInfo.deltaPos),
166
- zIndex: this.offset - this.preOffset > 0 ? 3 : 1,
167
- transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
168
- },
169
- transform: {
170
- transform: `scale3d(${this.scale}, ${this.scale}, 1.0)`,
171
- width: this.layoutInfo.frameWidth,
172
- height: this.layoutInfo.frameHeight,
173
- transition: `transform ${duration}s ${easing}`,
174
- },
175
- } /*左副位*/,
176
- {
177
- layout: {
178
- top: currentTop,
179
- left: currentLeft,
180
- zIndex: 4,
181
- transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
182
- },
183
- transform: {
184
- transform: "scale3d(1.0, 1.0, 1.0)",
185
- width: this.layoutInfo.frameWidth,
186
- height: this.layoutInfo.frameHeight,
187
- transition: `transform ${duration}s ${easing}`,
188
- },
189
- } /*主位*/,
190
- {
191
- layout: {
192
- top: currentTop + (this.vertical ? layoutInfo.deltaPos : 0),
193
- left: currentLeft + (this.vertical ? 0 : layoutInfo.deltaPos),
194
- zIndex: this.offset - this.preOffset > 0 ? 1 : 3,
195
- transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
196
- },
197
- transform: {
198
- transform: `scale3d(${this.scale}, ${this.scale}, 1.0)`,
199
- width: this.layoutInfo.frameWidth,
200
- height: this.layoutInfo.frameHeight,
201
- transition: `transform ${duration}s ${easing}`,
202
- },
203
- } /*右副位*/,
204
- {
205
- layout: {
206
- top: currentTop,
207
- left: currentLeft,
208
- zIndex: 0,
209
- transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
210
- },
211
- transform: {
212
- transform: `scale3d(${this.scale}, ${this.scale}, 1.0)`,
213
- width: this.layoutInfo.frameWidth,
214
- height: this.layoutInfo.frameHeight,
215
- transition: `transform ${duration}s ${easing}`,
216
- },
217
- } /*隐藏位*/,
218
- ];
219
- let viewList = [];
220
- for (let i = 0; i < VIEW_NUM; i++) {
221
- viewList.push({
222
- dataIndex: modToRange(
223
- this.currentDataIndex +
224
- modToRange(i - this.currentViewIndex, VIEW_NUM, -1),
225
- this.totalFrame
226
- ),
227
- style: styleList[modToRange(i - this.offset, VIEW_NUM)],
228
- });
229
- }
230
- return viewList;
231
- },
232
- },
233
- setup() {
234
- let preOffset = -1;
235
- let offset = ref(0);
236
- let focused = ref(false);
237
- let intervalHandler = -1;
238
- return {
239
- preOffset,
240
- offset,
241
- focused,
242
- intervalHandler,
243
- };
244
- },
245
- watch: {
246
- offset(newValue) {
247
- this.onChange?.(modToRange(this.firstFrame + newValue, this.totalFrame));
248
- },
249
- },
250
- methods: {
251
- _onKeyDown(ev) {
252
- switch (ev.keyCode) {
253
- case 37:
254
- if (!this.vertical) {
255
- this.preOffset = this.offset;
256
- this.offset = this.offset - 1;
257
- return true;
258
- }
259
- break;
260
- case 38:
261
- if (this.vertical) {
262
- this.preOffset = this.offset;
263
- this.offset = this.offset - 1;
264
- return true;
265
- }
266
- break;
267
- case 39:
268
- if (!this.vertical) {
269
- this.preOffset = this.offset;
270
- this.offset = this.offset + 1;
271
- return true;
272
- }
273
- break;
274
- case 40:
275
- if (this.vertical) {
276
- this.preOffset = this.offset;
277
- this.offset = this.offset + 1;
278
- return true;
279
- }
280
- break;
281
- case 13:
282
- this.onClick?.();
283
- return true;
284
- default:
285
- break;
286
- }
287
-
288
- return false;
289
- },
290
- _enableAutoplay() {
291
- if (this.autoplayInterval > 0) {
292
- this.intervalHandler = setInterval(() => {
293
- this.preOffset = this.offset;
294
- this.offset = this.offset + 1;
295
- }, this.autoplayInterval);
296
- }
297
- },
298
- _onFocus() {
299
- this.focused = true;
300
- clearInterval(this.intervalHandler);
301
- this.onFocus?.();
302
- },
303
- _onBlur() {
304
- this.focused = false;
305
- this._enableAutoplay();
306
- this.onBlur?.();
307
- },
308
- },
309
- created() {
310
- this._enableAutoplay();
311
- },
312
- };
313
- </script>
314
-
315
- <template>
316
- <jsv-focus-block
317
- :name="name"
318
- :onAction="{
319
- onFocus: _onFocus,
320
- onBlur: _onBlur,
321
- onKeyDown: _onKeyDown,
322
- }"
323
- >
324
- <div
325
- :style="{
326
- width: layoutInfo.widgetWidth,
327
- height: layoutInfo.widgetHeight,
328
- overflow: 'hidden',
329
- }"
330
- >
331
- <div :style="{ zIndex: 0 }">
332
- <div
333
- v-if="backgroundImage || backgroundColor"
334
- :style="{
335
- width: layoutInfo.widgetWidth,
336
- height: layoutInfo.widgetHeight,
337
- zIndex: 2,
338
- backgroundImage,
339
- backgroundColor,
340
- }"
341
- />
342
- <div
343
- v-for="(item, index) in viewInfoList"
344
- :key="index"
345
- :style="item.style.layout"
346
- >
347
- <div :style="item.style.transform">
348
- <slot
349
- name="itemView"
350
- :currentIndex="currentDataIndex"
351
- :dataIndex="item.dataIndex"
352
- :focused="focused"
353
- ></slot>
354
- <!-- <div
355
- :style="{
356
- width: 50,
357
- height: 50,
358
- top: 50,
359
- fontSize: '30px',
360
- color: '#FF0000'
361
- }"
362
- >
363
- {{ index }}
364
- </div> -->
365
- </div>
366
- </div>
367
- </div>
368
-
369
- <div v-if="showIndicator" :style="indicatorLayout">
370
- <indicator
371
- :number="totalFrame"
372
- :current="currentDataIndex"
373
- :itemSize="indicatorDotSize"
374
- :vertical="vertical"
375
- >
376
- <template #current>
377
- <slot name="indicatorCur">
378
- <div
379
- :style="{
380
- width: 10,
381
- height: 10,
382
- backgroundColor: 'rgba(50, 50, 50, 1.0)',
383
- borderRadius: '5px',
384
- }"
385
- ></div>
386
- </slot>
387
- </template>
388
- <template #normal>
389
- <slot name="indicatorNor">
390
- <div
391
- :style="{
392
- width: 10,
393
- height: 10,
394
- backgroundColor: 'rgba(100, 100, 100, 0.7)',
395
- borderRadius: '5px',
396
- }"
397
- ></div>
398
- </slot>
399
- </template>
400
- </indicator>
401
- </div>
402
- </div>
403
- </jsv-focus-block>
1
+ <!--
2
+ * @Author: ChenChanghua
3
+ * @Date: 2021-11-23 09:42:26
4
+ * @LastEditors: ChenChanghua
5
+ * @LastEditTime: 2021-11-29 11:04:37
6
+ * @Description: file content
7
+ -->
8
+ <script>
9
+ import Indicator from "./Indicator.vue";
10
+ import { ref } from "vue";
11
+
12
+ const VIEW_NUM = 4;
13
+
14
+ function modToRange(value, mod, start = 0) {
15
+ let m = value % mod;
16
+ if (m < start) {
17
+ m += mod;
18
+ } else if (m >= start + mod) {
19
+ m -= mod;
20
+ }
21
+ return m;
22
+ }
23
+
24
+ window.modToRange = modToRange;
25
+
26
+ export default {
27
+ components: { Indicator },
28
+ props: {
29
+ showIndicator: {
30
+ type: Boolean,
31
+ default: true,
32
+ },
33
+ dotSize: {
34
+ type: Number,
35
+ default: 10,
36
+ },
37
+ dotGap: {
38
+ type: Number,
39
+ default: 10,
40
+ },
41
+ indicatorPos: {
42
+ type: Number,
43
+ default: -1,
44
+ },
45
+ indicatorAlign: {
46
+ type: String,
47
+ default: "middle",
48
+ },
49
+ totalFrame: {
50
+ type: Number,
51
+ require: true,
52
+ },
53
+ firstFrame: {
54
+ type: Number,
55
+ default: 0,
56
+ },
57
+ layoutInfo: {
58
+ type: Object,
59
+ require: true,
60
+ },
61
+ onClick: {
62
+ type: Function,
63
+ },
64
+ onChange: {
65
+ type: Function,
66
+ },
67
+ scale: {
68
+ type: Number,
69
+ default: 1.0,
70
+ },
71
+ autoplayInterval: {
72
+ type: Number,
73
+ default: 5000,
74
+ },
75
+ animation: {
76
+ type: Object,
77
+ default() {
78
+ return {
79
+ duration: 200,
80
+ easing: "linear",
81
+ };
82
+ },
83
+ },
84
+ vertical: {
85
+ type: Boolean,
86
+ default: false,
87
+ },
88
+ name: {
89
+ type: String,
90
+ },
91
+ onFocus: {
92
+ type: Function,
93
+ },
94
+ onBlur: {
95
+ type: Function,
96
+ },
97
+ backgroundImage: {
98
+ type: String,
99
+ },
100
+ backgroundColor: {
101
+ type: String,
102
+ },
103
+ },
104
+ computed: {
105
+ indicatorLayout() {
106
+ let indicatorSize =
107
+ this.totalFrame * (this.dotSize + this.dotGap) - this.dotGap;
108
+ if (this.vertical) {
109
+ let top;
110
+ if (this.indicatorAlign === "start") {
111
+ top = this.dotGap;
112
+ } else if (this.indicatorAlign === "end") {
113
+ top = this.layoutInfo.widgetHeight - indicatorSize - this.dotGap;
114
+ } else {
115
+ top = (this.layoutInfo.widgetHeight - indicatorSize) / 2;
116
+ }
117
+ return {
118
+ left:
119
+ this.indicatorPos < 0
120
+ ? this.layoutInfo.widgetWidth * 0.8
121
+ : this.indicatorPos,
122
+ top,
123
+ zIndex: 1,
124
+ };
125
+ } else {
126
+ let left;
127
+ if (this.indicatorAlign === "start") {
128
+ left = this.dotGap;
129
+ } else if (this.indicatorAlign === "end") {
130
+ left = this.layoutInfo.widgetWidth - indicatorSize - this.dotGap;
131
+ } else {
132
+ left = (this.layoutInfo.widgetWidth - indicatorSize) / 2;
133
+ }
134
+ return {
135
+ left,
136
+ top:
137
+ this.indicatorPos < 0
138
+ ? this.layoutInfo.widgetHeight * 0.8
139
+ : this.indicatorPos,
140
+ zIndex: 1,
141
+ };
142
+ }
143
+ },
144
+ indicatorDotSize() {
145
+ return this.dotSize + this.dotGap;
146
+ },
147
+ currentDataIndex() {
148
+ return modToRange(this.firstFrame + this.offset, this.totalFrame);
149
+ },
150
+ currentViewIndex() {
151
+ return modToRange(this.offset + (VIEW_NUM / 2 - 1), VIEW_NUM);
152
+ },
153
+ viewInfoList() {
154
+ let layoutInfo = this.layoutInfo;
155
+ let currentLeft =
156
+ (this.layoutInfo.widgetWidth - this.layoutInfo.frameWidth) / 2;
157
+ let currentTop =
158
+ (this.layoutInfo.widgetHeight - this.layoutInfo.frameHeight) / 2;
159
+ let duration = this.animation.duration / 1000;
160
+ let easing = this.animation.easing ? this.animation.easing : "linear";
161
+ let styleList = [
162
+ {
163
+ layout: {
164
+ top: currentTop + (this.vertical ? -layoutInfo.deltaPos : 0),
165
+ left: currentLeft + (this.vertical ? 0 : -layoutInfo.deltaPos),
166
+ zIndex: this.offset - this.preOffset > 0 ? 3 : 1,
167
+ transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
168
+ },
169
+ transform: {
170
+ transform: `scale3d(${this.scale}, ${this.scale}, 1.0)`,
171
+ width: this.layoutInfo.frameWidth,
172
+ height: this.layoutInfo.frameHeight,
173
+ transition: `transform ${duration}s ${easing}`,
174
+ },
175
+ } /*左副位*/,
176
+ {
177
+ layout: {
178
+ top: currentTop,
179
+ left: currentLeft,
180
+ zIndex: 4,
181
+ transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
182
+ },
183
+ transform: {
184
+ transform: "scale3d(1.0, 1.0, 1.0)",
185
+ width: this.layoutInfo.frameWidth,
186
+ height: this.layoutInfo.frameHeight,
187
+ transition: `transform ${duration}s ${easing}`,
188
+ },
189
+ } /*主位*/,
190
+ {
191
+ layout: {
192
+ top: currentTop + (this.vertical ? layoutInfo.deltaPos : 0),
193
+ left: currentLeft + (this.vertical ? 0 : layoutInfo.deltaPos),
194
+ zIndex: this.offset - this.preOffset > 0 ? 1 : 3,
195
+ transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
196
+ },
197
+ transform: {
198
+ transform: `scale3d(${this.scale}, ${this.scale}, 1.0)`,
199
+ width: this.layoutInfo.frameWidth,
200
+ height: this.layoutInfo.frameHeight,
201
+ transition: `transform ${duration}s ${easing}`,
202
+ },
203
+ } /*右副位*/,
204
+ {
205
+ layout: {
206
+ top: currentTop,
207
+ left: currentLeft,
208
+ zIndex: 0,
209
+ transition: `left ${duration}s ${easing}, top ${duration}s ${easing}`,
210
+ },
211
+ transform: {
212
+ transform: `scale3d(${this.scale}, ${this.scale}, 1.0)`,
213
+ width: this.layoutInfo.frameWidth,
214
+ height: this.layoutInfo.frameHeight,
215
+ transition: `transform ${duration}s ${easing}`,
216
+ },
217
+ } /*隐藏位*/,
218
+ ];
219
+ let viewList = [];
220
+ for (let i = 0; i < VIEW_NUM; i++) {
221
+ viewList.push({
222
+ dataIndex: modToRange(
223
+ this.currentDataIndex +
224
+ modToRange(i - this.currentViewIndex, VIEW_NUM, -1),
225
+ this.totalFrame
226
+ ),
227
+ style: styleList[modToRange(i - this.offset, VIEW_NUM)],
228
+ });
229
+ }
230
+ return viewList;
231
+ },
232
+ },
233
+ setup() {
234
+ let preOffset = -1;
235
+ let offset = ref(0);
236
+ let focused = ref(false);
237
+ let intervalHandler = -1;
238
+ return {
239
+ preOffset,
240
+ offset,
241
+ focused,
242
+ intervalHandler,
243
+ };
244
+ },
245
+ watch: {
246
+ offset(newValue) {
247
+ this.onChange?.(modToRange(this.firstFrame + newValue, this.totalFrame));
248
+ },
249
+ },
250
+ methods: {
251
+ _onKeyDown(ev) {
252
+ switch (ev.keyCode) {
253
+ case 37:
254
+ if (!this.vertical) {
255
+ this.preOffset = this.offset;
256
+ this.offset = this.offset - 1;
257
+ return true;
258
+ }
259
+ break;
260
+ case 38:
261
+ if (this.vertical) {
262
+ this.preOffset = this.offset;
263
+ this.offset = this.offset - 1;
264
+ return true;
265
+ }
266
+ break;
267
+ case 39:
268
+ if (!this.vertical) {
269
+ this.preOffset = this.offset;
270
+ this.offset = this.offset + 1;
271
+ return true;
272
+ }
273
+ break;
274
+ case 40:
275
+ if (this.vertical) {
276
+ this.preOffset = this.offset;
277
+ this.offset = this.offset + 1;
278
+ return true;
279
+ }
280
+ break;
281
+ case 13:
282
+ this.onClick?.();
283
+ return true;
284
+ default:
285
+ break;
286
+ }
287
+
288
+ return false;
289
+ },
290
+ _enableAutoplay() {
291
+ if (this.autoplayInterval > 0) {
292
+ this.intervalHandler = setInterval(() => {
293
+ this.preOffset = this.offset;
294
+ this.offset = this.offset + 1;
295
+ }, this.autoplayInterval);
296
+ }
297
+ },
298
+ _onFocus() {
299
+ this.focused = true;
300
+ clearInterval(this.intervalHandler);
301
+ this.onFocus?.();
302
+ },
303
+ _onBlur() {
304
+ this.focused = false;
305
+ this._enableAutoplay();
306
+ this.onBlur?.();
307
+ },
308
+ },
309
+ created() {
310
+ this._enableAutoplay();
311
+ },
312
+ };
313
+ </script>
314
+
315
+ <template>
316
+ <jsv-focus-block
317
+ :name="name"
318
+ :onAction="{
319
+ onFocus: _onFocus,
320
+ onBlur: _onBlur,
321
+ onKeyDown: _onKeyDown,
322
+ }"
323
+ >
324
+ <div
325
+ :style="{
326
+ width: layoutInfo.widgetWidth,
327
+ height: layoutInfo.widgetHeight,
328
+ overflow: 'hidden',
329
+ }"
330
+ >
331
+ <div :style="{ zIndex: 0 }">
332
+ <div
333
+ v-if="backgroundImage || backgroundColor"
334
+ :style="{
335
+ width: layoutInfo.widgetWidth,
336
+ height: layoutInfo.widgetHeight,
337
+ zIndex: 2,
338
+ backgroundImage,
339
+ backgroundColor,
340
+ }"
341
+ />
342
+ <div
343
+ v-for="(item, index) in viewInfoList"
344
+ :key="index"
345
+ :style="item.style.layout"
346
+ >
347
+ <div :style="item.style.transform">
348
+ <slot
349
+ name="itemView"
350
+ :currentIndex="currentDataIndex"
351
+ :dataIndex="item.dataIndex"
352
+ :focused="focused"
353
+ ></slot>
354
+ <!-- <div
355
+ :style="{
356
+ width: 50,
357
+ height: 50,
358
+ top: 50,
359
+ fontSize: '30px',
360
+ color: '#FF0000'
361
+ }"
362
+ >
363
+ {{ index }}
364
+ </div> -->
365
+ </div>
366
+ </div>
367
+ </div>
368
+
369
+ <div v-if="showIndicator" :style="indicatorLayout">
370
+ <indicator
371
+ :number="totalFrame"
372
+ :current="currentDataIndex"
373
+ :itemSize="indicatorDotSize"
374
+ :vertical="vertical"
375
+ >
376
+ <template #current>
377
+ <slot name="indicatorCur">
378
+ <div
379
+ :style="{
380
+ width: 10,
381
+ height: 10,
382
+ backgroundColor: 'rgba(50, 50, 50, 1.0)',
383
+ borderRadius: '5px',
384
+ }"
385
+ ></div>
386
+ </slot>
387
+ </template>
388
+ <template #normal>
389
+ <slot name="indicatorNor">
390
+ <div
391
+ :style="{
392
+ width: 10,
393
+ height: 10,
394
+ backgroundColor: 'rgba(100, 100, 100, 0.7)',
395
+ borderRadius: '5px',
396
+ }"
397
+ ></div>
398
+ </slot>
399
+ </template>
400
+ </indicator>
401
+ </div>
402
+ </div>
403
+ </jsv-focus-block>
404
404
  </template>