stellar-ui-plus 1.25.1 → 1.25.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.
Files changed (253) hide show
  1. package/components/ste-animate/ATTRIBUTES.md +13 -5
  2. package/components/ste-animate/README.md +4 -28
  3. package/components/ste-animate/ste-animate.easycom.json +31 -9
  4. package/components/ste-app-update/ATTRIBUTES.md +11 -5
  5. package/components/ste-app-update/README.md +1 -3
  6. package/components/ste-app-update/method.ts +44 -1
  7. package/components/ste-app-update/props.ts +17 -2
  8. package/components/ste-app-update/ste-app-update.easycom.json +18 -8
  9. package/components/ste-app-update/ste-app-update.vue +93 -18
  10. package/components/ste-area-chart/ATTRIBUTES.md +3 -1
  11. package/components/ste-area-chart/README.md +21 -4
  12. package/components/ste-area-chart/ste-area-chart.vue +33 -1
  13. package/components/ste-badge/ATTRIBUTES.md +10 -1
  14. package/components/ste-badge/README.md +9 -18
  15. package/components/ste-badge/ste-badge.easycom.json +8 -0
  16. package/components/ste-bar-chart/ATTRIBUTES.md +3 -1
  17. package/components/ste-bar-chart/README.md +20 -5
  18. package/components/ste-bar-chart/ste-bar-chart.vue +34 -1
  19. package/components/ste-barcode/ATTRIBUTES.md +6 -2
  20. package/components/ste-barcode/README.md +3 -5
  21. package/components/ste-barcode/ste-barcode.easycom.json +1 -2
  22. package/components/ste-button/ATTRIBUTES.md +24 -14
  23. package/components/ste-button/README.md +11 -19
  24. package/components/ste-button/ste-button.easycom.json +76 -12
  25. package/components/ste-calendar/ATTRIBUTES.md +12 -2
  26. package/components/ste-calendar/README.md +16 -24
  27. package/components/ste-calendar/ste-calendar.easycom.json +4 -3
  28. package/components/ste-category/ATTRIBUTES.md +6 -2
  29. package/components/ste-category/README.md +2 -4
  30. package/components/ste-category/ste-category.easycom.json +1 -2
  31. package/components/ste-checkbox/ATTRIBUTES.md +6 -2
  32. package/components/ste-checkbox/README.md +18 -20
  33. package/components/ste-checkbox/ste-checkbox.easycom.json +1 -3
  34. package/components/ste-checkbox/ste-checkbox.vue +71 -80
  35. package/components/ste-code-input/ATTRIBUTES.md +8 -4
  36. package/components/ste-code-input/README.md +7 -9
  37. package/components/ste-code-input/ste-code-input.easycom.json +13 -4
  38. package/components/ste-column-chart/ATTRIBUTES.md +3 -1
  39. package/components/ste-column-chart/README.md +22 -7
  40. package/components/ste-column-chart/ste-column-chart.vue +34 -1
  41. package/components/ste-comment/ATTRIBUTES.md +3 -1
  42. package/components/ste-comment/README.md +2 -4
  43. package/components/ste-coupon-list/ATTRIBUTES.md +15 -5
  44. package/components/ste-coupon-list/README.md +6 -14
  45. package/components/ste-coupon-list/ste-coupon-list.easycom.json +22 -3
  46. package/components/ste-custom-keyboard/ATTRIBUTES.md +16 -7
  47. package/components/ste-custom-keyboard/README.md +10 -18
  48. package/components/ste-custom-keyboard/ste-custom-keyboard.easycom.json +28 -10
  49. package/components/ste-date-picker/ATTRIBUTES.md +9 -5
  50. package/components/ste-date-picker/README.md +9 -11
  51. package/components/ste-date-picker/ste-date-picker.easycom.json +19 -4
  52. package/components/ste-date-user/ATTRIBUTES.md +9 -1
  53. package/components/ste-date-user/README.md +3 -11
  54. package/components/ste-date-user/ste-date-user.easycom.json +4 -0
  55. package/components/ste-drag/ATTRIBUTES.md +13 -3
  56. package/components/ste-drag/README.md +5 -13
  57. package/components/ste-drag/ste-drag.easycom.json +10 -2
  58. package/components/ste-drag-sort/ATTRIBUTES.md +25 -0
  59. package/components/ste-drag-sort/README.md +116 -0
  60. package/components/ste-drag-sort/config.json +5 -0
  61. package/components/ste-drag-sort/props.ts +16 -0
  62. package/components/ste-drag-sort/ste-drag-sort.easycom.json +88 -0
  63. package/components/ste-drag-sort/ste-drag-sort.vue +589 -0
  64. package/components/ste-dropdown-menu/ATTRIBUTES.md +8 -4
  65. package/components/ste-dropdown-menu/README.md +14 -16
  66. package/components/ste-dropdown-menu/ste-dropdown-menu.easycom.json +13 -4
  67. package/components/ste-filter-tool/ATTRIBUTES.md +6 -2
  68. package/components/ste-filter-tool/README.md +4 -6
  69. package/components/ste-filter-tool/ste-filter-tool.easycom.json +1 -5
  70. package/components/ste-function-list/ATTRIBUTES.md +13 -2
  71. package/components/ste-function-list/README.md +3 -12
  72. package/components/ste-function-list/ste-function-list.easycom.json +8 -3
  73. package/components/ste-funnel-chart/ATTRIBUTES.md +3 -1
  74. package/components/ste-funnel-chart/README.md +21 -6
  75. package/components/ste-funnel-chart/ste-funnel-chart.vue +34 -1
  76. package/components/ste-goods-info/ATTRIBUTES.md +15 -4
  77. package/components/ste-goods-info/README.md +8 -17
  78. package/components/ste-goods-info/ste-goods-info.easycom.json +40 -13
  79. package/components/ste-goods-list/ATTRIBUTES.md +9 -1
  80. package/components/ste-goods-list/README.md +4 -12
  81. package/components/ste-goods-list/ste-goods-list.easycom.json +4 -0
  82. package/components/ste-guide-qa/ATTRIBUTES.md +15 -4
  83. package/components/ste-guide-qa/README.md +6 -15
  84. package/components/ste-guide-qa/ste-guide-qa.easycom.json +20 -2
  85. package/components/ste-icon/ATTRIBUTES.md +7 -3
  86. package/components/ste-icon/README.md +5 -7
  87. package/components/ste-icon/ste-icon.easycom.json +7 -2
  88. package/components/ste-image/ATTRIBUTES.md +13 -2
  89. package/components/ste-image/README.md +6 -15
  90. package/components/ste-image/ste-image.easycom.json +8 -3
  91. package/components/ste-index-list/ATTRIBUTES.md +8 -4
  92. package/components/ste-index-list/README.md +6 -8
  93. package/components/ste-index-list/ste-index-list.easycom.json +13 -3
  94. package/components/ste-input/ATTRIBUTES.md +14 -3
  95. package/components/ste-input/README.md +16 -25
  96. package/components/ste-input/ste-input.easycom.json +14 -5
  97. package/components/ste-line-chart/ATTRIBUTES.md +3 -1
  98. package/components/ste-line-chart/README.md +22 -7
  99. package/components/ste-line-chart/ste-line-chart.vue +34 -1
  100. package/components/ste-loading/ATTRIBUTES.md +3 -1
  101. package/components/ste-loading/README.md +6 -8
  102. package/components/ste-login/ATTRIBUTES.md +12 -2
  103. package/components/ste-login/README.md +7 -15
  104. package/components/ste-login/ste-login.easycom.json +4 -7
  105. package/components/ste-login-info/ATTRIBUTES.md +6 -2
  106. package/components/ste-login-info/README.md +2 -4
  107. package/components/ste-login-info/ste-login-info.easycom.json +1 -4
  108. package/components/ste-marquee/ATTRIBUTES.md +44 -0
  109. package/components/ste-marquee/README.md +123 -0
  110. package/components/ste-marquee/config.json +5 -0
  111. package/components/ste-marquee/props.ts +106 -0
  112. package/components/ste-marquee/ste-marquee.easycom.json +132 -0
  113. package/components/ste-marquee/ste-marquee.vue +249 -0
  114. package/components/ste-media-preview/ATTRIBUTES.md +14 -4
  115. package/components/ste-media-preview/README.md +23 -32
  116. package/components/ste-media-preview/ste-media-preview.easycom.json +16 -4
  117. package/components/ste-message-box/ATTRIBUTES.md +3 -1
  118. package/components/ste-message-box/README.md +11 -13
  119. package/components/ste-navbar/ATTRIBUTES.md +13 -3
  120. package/components/ste-navbar/README.md +5 -13
  121. package/components/ste-navbar/ste-navbar.easycom.json +10 -1
  122. package/components/ste-notice-bar/ATTRIBUTES.md +16 -5
  123. package/components/ste-notice-bar/README.md +11 -20
  124. package/components/ste-notice-bar/ste-notice-bar.easycom.json +26 -3
  125. package/components/ste-number-keyboard/ATTRIBUTES.md +17 -7
  126. package/components/ste-number-keyboard/README.md +9 -18
  127. package/components/ste-number-keyboard/ste-number-keyboard.easycom.json +32 -9
  128. package/components/ste-order-card/ATTRIBUTES.md +6 -2
  129. package/components/ste-order-card/README.md +4 -6
  130. package/components/ste-order-card/ste-order-card.easycom.json +1 -4
  131. package/components/ste-pie-chart/ATTRIBUTES.md +3 -1
  132. package/components/ste-pie-chart/README.md +21 -6
  133. package/components/ste-pie-chart/ste-pie-chart.vue +34 -1
  134. package/components/ste-popup/ATTRIBUTES.md +15 -5
  135. package/components/ste-popup/README.md +10 -18
  136. package/components/ste-popup/ste-popup.easycom.json +22 -4
  137. package/components/ste-price/ATTRIBUTES.md +7 -3
  138. package/components/ste-price/README.md +10 -12
  139. package/components/ste-price/ste-price.easycom.json +7 -2
  140. package/components/ste-progress/ATTRIBUTES.md +9 -1
  141. package/components/ste-progress/README.md +9 -17
  142. package/components/ste-progress/ste-progress.easycom.json +4 -0
  143. package/components/ste-qrcode/ATTRIBUTES.md +6 -2
  144. package/components/ste-qrcode/README.md +4 -6
  145. package/components/ste-qrcode/ste-qrcode.easycom.json +1 -2
  146. package/components/ste-radio/ATTRIBUTES.md +6 -2
  147. package/components/ste-radio/README.md +17 -19
  148. package/components/ste-radio/ste-radio.easycom.json +1 -3
  149. package/components/ste-radio/ste-radio.vue +109 -85
  150. package/components/ste-rate/ATTRIBUTES.md +7 -3
  151. package/components/ste-rate/README.md +8 -10
  152. package/components/ste-rate/ste-rate.easycom.json +7 -2
  153. package/components/ste-read-more/ATTRIBUTES.md +20 -4
  154. package/components/ste-read-more/README.md +5 -19
  155. package/components/ste-read-more/ste-read-more.easycom.json +20 -2
  156. package/components/ste-rich-text/ATTRIBUTES.md +3 -1
  157. package/components/ste-rich-text/README.md +2 -4
  158. package/components/ste-ring-chart/ATTRIBUTES.md +3 -1
  159. package/components/ste-ring-chart/README.md +22 -5
  160. package/components/ste-ring-chart/ste-ring-chart.vue +33 -1
  161. package/components/ste-scroll-to/ATTRIBUTES.md +7 -3
  162. package/components/ste-scroll-to/README.md +2 -4
  163. package/components/ste-scroll-to/ste-scroll-to.easycom.json +7 -2
  164. package/components/ste-search/ATTRIBUTES.md +14 -3
  165. package/components/ste-search/README.md +12 -21
  166. package/components/ste-search/ste-search.easycom.json +14 -7
  167. package/components/ste-search-box/ATTRIBUTES.md +6 -2
  168. package/components/ste-search-box/README.md +3 -5
  169. package/components/ste-search-box/ste-search-box.easycom.json +1 -3
  170. package/components/ste-select/ATTRIBUTES.md +9 -5
  171. package/components/ste-select/README.md +11 -11
  172. package/components/ste-select/ste-select.easycom.json +19 -6
  173. package/components/ste-select-seat/ATTRIBUTES.md +8 -4
  174. package/components/ste-select-seat/README.md +7 -21
  175. package/components/ste-select-seat/ste-select-seat.easycom.json +13 -3
  176. package/components/ste-signature/ATTRIBUTES.md +18 -5
  177. package/components/ste-signature/README.md +3 -14
  178. package/components/ste-signature/ste-signature.easycom.json +50 -3
  179. package/components/ste-simple-calendar/ATTRIBUTES.md +16 -4
  180. package/components/ste-simple-calendar/README.md +8 -18
  181. package/components/ste-simple-calendar/ste-simple-calendar.easycom.json +30 -2
  182. package/components/ste-skeleton/ATTRIBUTES.md +9 -1
  183. package/components/ste-skeleton/README.md +5 -13
  184. package/components/ste-skeleton/ste-skeleton.easycom.json +4 -0
  185. package/components/ste-slide-verify/ATTRIBUTES.md +16 -5
  186. package/components/ste-slide-verify/README.md +7 -16
  187. package/components/ste-slide-verify/ste-slide-verify.easycom.json +26 -3
  188. package/components/ste-slider/ATTRIBUTES.md +14 -2
  189. package/components/ste-slider/README.md +11 -21
  190. package/components/ste-slider/ste-slider.easycom.json +12 -4
  191. package/components/ste-stepper/ATTRIBUTES.md +9 -5
  192. package/components/ste-stepper/README.md +9 -13
  193. package/components/ste-stepper/ste-stepper.easycom.json +19 -6
  194. package/components/ste-steps/ATTRIBUTES.md +6 -2
  195. package/components/ste-steps/README.md +9 -11
  196. package/components/ste-steps/ste-steps.easycom.json +1 -2
  197. package/components/ste-sticky/ATTRIBUTES.md +8 -4
  198. package/components/ste-sticky/README.md +2 -4
  199. package/components/ste-sticky/ste-sticky.easycom.json +13 -3
  200. package/components/ste-swipe-action/ATTRIBUTES.md +14 -3
  201. package/components/ste-swipe-action/README.md +9 -18
  202. package/components/ste-swipe-action/ste-swipe-action.easycom.json +20 -2
  203. package/components/ste-swipe-action/useData.ts +15 -8
  204. package/components/ste-swipe-action-group/ATTRIBUTES.md +6 -2
  205. package/components/ste-swipe-action-group/ste-swipe-action-group.easycom.json +1 -3
  206. package/components/ste-swiper/ATTRIBUTES.md +6 -2
  207. package/components/ste-swiper/README.md +12 -14
  208. package/components/ste-swiper/ste-swiper.easycom.json +1 -3
  209. package/components/ste-switch/ATTRIBUTES.md +8 -4
  210. package/components/ste-switch/README.md +7 -9
  211. package/components/ste-switch/ste-switch.easycom.json +13 -3
  212. package/components/ste-tab/ATTRIBUTES.md +3 -1
  213. package/components/ste-table/ATTRIBUTES.md +12 -8
  214. package/components/ste-table/README.md +23 -23
  215. package/components/ste-table/ste-table.easycom.json +38 -9
  216. package/components/ste-tabs/ATTRIBUTES.md +9 -4
  217. package/components/ste-tabs/README.md +4 -6
  218. package/components/ste-tabs/props.ts +3 -0
  219. package/components/ste-tabs/ste-tabs.easycom.json +18 -2
  220. package/components/ste-tabs/useData.ts +1 -1
  221. package/components/ste-text/ATTRIBUTES.md +9 -1
  222. package/components/ste-text/README.md +4 -12
  223. package/components/ste-text/ste-text.easycom.json +4 -0
  224. package/components/ste-toast/ATTRIBUTES.md +10 -1
  225. package/components/ste-toast/README.md +9 -18
  226. package/components/ste-toast/ste-toast.easycom.json +14 -0
  227. package/components/ste-touch-swipe/ATTRIBUTES.md +6 -2
  228. package/components/ste-touch-swipe/README.md +4 -6
  229. package/components/ste-touch-swipe/ste-touch-swipe.easycom.json +1 -2
  230. package/components/ste-tour/ATTRIBUTES.md +7 -3
  231. package/components/ste-tour/README.md +5 -7
  232. package/components/ste-tour/ste-tour.easycom.json +11 -4
  233. package/components/ste-tree/ATTRIBUTES.md +15 -2
  234. package/components/ste-tree/README.md +6 -17
  235. package/components/ste-tree/ste-tree.easycom.json +16 -4
  236. package/components/ste-upload/ATTRIBUTES.md +17 -5
  237. package/components/ste-upload/README.md +9 -20
  238. package/components/ste-upload/ste-upload.easycom.json +36 -9
  239. package/components/ste-user-info/ATTRIBUTES.md +15 -5
  240. package/components/ste-user-info/README.md +5 -13
  241. package/components/ste-user-info/ste-user-info.easycom.json +22 -4
  242. package/components/ste-video/ATTRIBUTES.md +3 -1
  243. package/components/ste-video/README.md +4 -8
  244. package/components/ste-watermark/ATTRIBUTES.md +3 -1
  245. package/components/ste-watermark/README.md +5 -7
  246. package/config/font-size.ts +3 -0
  247. package/config/index.ts +5 -0
  248. package/index.ts +4 -0
  249. package/package.json +1 -1
  250. package/types/components.d.ts +4 -0
  251. package/types/refComponents.d.ts +4 -0
  252. package/utils/System.ts +50 -15
  253. package/utils/mixin.ts +4 -3
@@ -0,0 +1,123 @@
1
+ # ste-marquee 走马灯
2
+
3
+ 用于展示滚动公告、中奖名单等水平滚动信息。
4
+
5
+ ---$
6
+
7
+ ## 使用场景
8
+
9
+ - 抽奖活动中奖名单滚动展示
10
+ - 系统公告、通知滚动
11
+ - 实时交易动态
12
+ - 新闻头条滚动
13
+
14
+ ## 基础用法
15
+
16
+ ```vue
17
+ <template>
18
+ <ste-marquee :list="list" />
19
+ </template>
20
+
21
+ <script setup lang="ts">
22
+ import { ref } from 'vue';
23
+
24
+ const list = ref([
25
+ { id: 1, text: '恭喜用户138****1234获得一等奖' },
26
+ { id: 2, text: '恭喜用户139****5678获得二等奖' },
27
+ { id: 3, text: '恭喜用户137****9012获得三等奖' },
28
+ ]);
29
+ </script>
30
+ ```
31
+
32
+ ## 自定义样式
33
+
34
+ ```vue
35
+ <ste-marquee :list="list" containerBg="#f5f5f5" containerPadding="20rpx" containerRadius="16rpx" itemBg="#ffffff" itemPadding="16rpx 24rpx" itemRadius="8rpx" />
36
+ ```
37
+
38
+ ## 填满屏幕
39
+
40
+ 当数据较少时,使用 `fillScreen` 自动复制数据填满屏幕,实现流畅滚动:
41
+
42
+ ```vue
43
+ <ste-marquee :list="shortList" :fillScreen="true" />
44
+ ```
45
+
46
+ ## 调整滚动速度
47
+
48
+ ```vue
49
+ <ste-marquee :list="list" :speed="100" />
50
+ ```
51
+
52
+ ## 使用插槽自定义内容
53
+
54
+ ```vue
55
+ <ste-marquee :list="list">
56
+ <template #item="{ item, index }">
57
+ <view class="custom-item">
58
+ <image :src="item.avatar" class="avatar" />
59
+ <text>{{ item.text }}</text>
60
+ </view>
61
+ </template>
62
+ </ste-marquee>
63
+ ```
64
+
65
+ ## 播放控制
66
+
67
+ 通过 ref 可以控制走马灯的播放、暂停和停止:
68
+
69
+ ```vue
70
+ <template>
71
+ <ste-marquee ref="marqueeRef" :list="list" />
72
+ <button @click="play">播放</button>
73
+ <button @click="pause">暂停</button>
74
+ <button @click="stop">停止</button>
75
+ </template>
76
+
77
+ <script setup>
78
+ import { ref } from 'vue';
79
+
80
+ const marqueeRef = ref();
81
+
82
+ const play = () => marqueeRef.value?.play();
83
+ const pause = () => marqueeRef.value?.pause();
84
+ const stop = () => marqueeRef.value?.stop();
85
+ </script>
86
+ ```
87
+
88
+ ## 点击事件
89
+
90
+ ```vue
91
+ <ste-marquee :list="list" @click="onClick" />
92
+
93
+ <script setup>
94
+ const onClick = (item, index) => {
95
+ console.log('点击了:', item.text);
96
+ };
97
+ </script>
98
+ ```
99
+
100
+ ## 数据类型
101
+
102
+ ```typescript
103
+ interface MarqueeItem {
104
+ /** 唯一标识 */
105
+ id: string | number;
106
+ /** 显示文本 */
107
+ text: string;
108
+ /** 图标URL(可选) */
109
+ icon?: string;
110
+ /** 文本颜色(可选) */
111
+ color?: string;
112
+ /** 背景色(可选) */
113
+ background?: string;
114
+ }
115
+ ```
116
+
117
+ ---$
118
+
119
+ <!-- props -->
120
+
121
+ ---$
122
+
123
+ {{xuyajun}}
@@ -0,0 +1,5 @@
1
+ {
2
+ "group": "展示组件",
3
+ "title": "Marquee 走马灯",
4
+ "icon": "https://image.whzb.com/chain/StellarUI/%E7%BB%84%E4%BB%B6%E5%9B%BE%E6%A0%87/marquee.png"
5
+ }
@@ -0,0 +1,106 @@
1
+ // 走马灯组件 Props 类型定义
2
+
3
+ export interface MarqueeItem {
4
+ /** 唯一标识 */
5
+ id: string | number;
6
+ /** 显示文本 */
7
+ text: string;
8
+ /** 图标URL(可选) */
9
+ icon?: string;
10
+ /** 文本颜色(可选) */
11
+ color?: string;
12
+ /** 背景色(可选) */
13
+ background?: string;
14
+ /** 自定义数据(可选) */
15
+ data?: any;
16
+ }
17
+
18
+ export interface MarqueeProps {
19
+ /** 数据列表 */
20
+ list: MarqueeItem[];
21
+ /** 滚动速度(px/s) */
22
+ speed: number;
23
+ /** 悬停是否暂停 */
24
+ pauseOnHover: boolean;
25
+ /** 是否循环播放 */
26
+ loop: boolean;
27
+ /** 消息间隔(px) */
28
+ gap: number;
29
+ /** 容器高度 */
30
+ height: string;
31
+ /** 是否填满屏幕 */
32
+ fillScreen: boolean;
33
+ /** 是否可点击 */
34
+ clickable: boolean;
35
+ /** 容器背景色 */
36
+ containerBg: string;
37
+ /** 容器内边距 */
38
+ containerPadding: string;
39
+ /** 容器圆角 */
40
+ containerRadius: string;
41
+ /** 消息项背景色 */
42
+ itemBg: string;
43
+ /** 消息项内边距 */
44
+ itemPadding: string;
45
+ /** 消息项圆角 */
46
+ itemRadius: string;
47
+ }
48
+
49
+ export default {
50
+ list: {
51
+ type: Array as () => MarqueeItem[],
52
+ default: () => [],
53
+ },
54
+ speed: {
55
+ type: Number,
56
+ default: 50,
57
+ },
58
+ pauseOnHover: {
59
+ type: Boolean,
60
+ default: true,
61
+ },
62
+ loop: {
63
+ type: Boolean,
64
+ default: true,
65
+ },
66
+ gap: {
67
+ type: Number,
68
+ default: 20,
69
+ },
70
+ height: {
71
+ type: String,
72
+ default: 'auto',
73
+ },
74
+ fillScreen: {
75
+ type: Boolean,
76
+ default: false,
77
+ },
78
+ clickable: {
79
+ type: Boolean,
80
+ default: true,
81
+ },
82
+ containerBg: {
83
+ type: String,
84
+ default: 'transparent',
85
+ },
86
+ containerPadding: {
87
+ type: String,
88
+ default: '0rpx',
89
+ },
90
+ containerRadius: {
91
+ type: String,
92
+ default: '0rpx',
93
+ },
94
+ itemBg: {
95
+ type: String,
96
+ default: 'transparent',
97
+ },
98
+ itemPadding: {
99
+ type: String,
100
+ default: '0rpx 20rpx',
101
+ },
102
+ itemRadius: {
103
+ type: String,
104
+ default: '0rpx',
105
+ },
106
+ } satisfies Record<keyof MarqueeProps, any>;
@@ -0,0 +1,132 @@
1
+ {
2
+ "name": "ste-marquee",
3
+ "description": "走马灯组件,用于水平滚动展示公告、中奖名单等信息",
4
+ "example": "<ste-marquee :list=\"list\"></ste-marquee>",
5
+ "tutorial": "https://stellar-ui.intecloud.com.cn/?projectName=stellar-ui-plus&menu=%E7%BB%84%E4%BB%B6&active=ste-marquee",
6
+ "attributes": [
7
+ {
8
+ "name": "list",
9
+ "description": "数据列表",
10
+ "type": "MarqueeItem[]",
11
+ "default": "[]"
12
+ },
13
+ {
14
+ "name": "speed",
15
+ "description": "滚动速度(px/s)",
16
+ "type": "number",
17
+ "default": 50
18
+ },
19
+ {
20
+ "name": "pauseOnHover",
21
+ "description": "悬停时是否暂停",
22
+ "type": "boolean",
23
+ "default": true
24
+ },
25
+ {
26
+ "name": "loop",
27
+ "description": "是否循环播放",
28
+ "type": "boolean",
29
+ "default": true
30
+ },
31
+ {
32
+ "name": "gap",
33
+ "description": "消息之间的间距(rpx)",
34
+ "type": "number",
35
+ "default": 20
36
+ },
37
+ {
38
+ "name": "height",
39
+ "description": "容器高度",
40
+ "type": "string",
41
+ "default": "auto"
42
+ },
43
+ {
44
+ "name": "fillScreen",
45
+ "description": "是否填满屏幕宽度",
46
+ "type": "boolean",
47
+ "default": false
48
+ },
49
+ {
50
+ "name": "clickable",
51
+ "description": "是否可点击",
52
+ "type": "boolean",
53
+ "default": true
54
+ },
55
+ {
56
+ "name": "containerBg",
57
+ "description": "容器背景色",
58
+ "type": "string",
59
+ "default": "transparent"
60
+ },
61
+ {
62
+ "name": "containerPadding",
63
+ "description": "容器内边距",
64
+ "type": "string",
65
+ "default": "0rpx"
66
+ },
67
+ {
68
+ "name": "containerRadius",
69
+ "description": "容器圆角",
70
+ "type": "string",
71
+ "default": "0rpx"
72
+ },
73
+ {
74
+ "name": "itemBg",
75
+ "description": "消息项背景色",
76
+ "type": "string",
77
+ "default": "transparent"
78
+ },
79
+ {
80
+ "name": "itemPadding",
81
+ "description": "消息项内边距",
82
+ "type": "string",
83
+ "default": "0rpx 20rpx"
84
+ },
85
+ {
86
+ "name": "itemRadius",
87
+ "description": "消息项圆角",
88
+ "type": "string",
89
+ "default": "0rpx"
90
+ },
91
+ {
92
+ "name": "[event]click",
93
+ "description": "点击消息时触发",
94
+ "params": [
95
+ { "name": "item", "description": "点击的数据项" },
96
+ { "name": "index", "description": "数据项索引" }
97
+ ]
98
+ },
99
+ {
100
+ "name": "[event]complete",
101
+ "description": "一轮播放完成时触发"
102
+ },
103
+ {
104
+ "name": "[method]play",
105
+ "description": "开始播放"
106
+ },
107
+ {
108
+ "name": "[method]pause",
109
+ "description": "暂停播放"
110
+ },
111
+ {
112
+ "name": "[method]resume",
113
+ "description": "恢复播放"
114
+ },
115
+ {
116
+ "name": "[method]stop",
117
+ "description": "停止播放并回到初始位置"
118
+ },
119
+ {
120
+ "name": "[slot]default",
121
+ "description": "默认插槽,自定义整个内容区域"
122
+ },
123
+ {
124
+ "name": "[slot]item",
125
+ "description": "自定义单项内容",
126
+ "params": [
127
+ { "name": "item", "description": "数据项对象" },
128
+ { "name": "index", "description": "数据项索引" }
129
+ ]
130
+ }
131
+ ]
132
+ }
@@ -0,0 +1,249 @@
1
+ <script setup lang="ts">
2
+ import { ref, computed, onMounted, watch, nextTick, getCurrentInstance } from 'vue';
3
+ import propsData, { type MarqueeItem } from './props';
4
+
5
+ const props = defineProps(propsData);
6
+ const instance = getCurrentInstance();
7
+ const emits = defineEmits<{
8
+ (e: 'click', item: MarqueeItem, index: number): void;
9
+ }>();
10
+
11
+ // ─── 状态 ──────────────────────────────────────────────────────
12
+ const displayQueue = ref<(MarqueeItem & { _key: string })[]>([]);
13
+ const contentWidth = ref(0);
14
+ const isReady = ref(false);
15
+ let copyCount = 2;
16
+ let keySeed = 0;
17
+
18
+ // ─── 样式 ──────────────────────────────────────────────────────
19
+ const containerStyle = computed(() => ({
20
+ height: props.height === 'auto' ? undefined : props.height,
21
+ background: props.containerBg,
22
+ padding: props.containerPadding,
23
+ borderRadius: props.containerRadius,
24
+ }));
25
+
26
+ // 使用 CSS 变量控制动画
27
+ const cssVariables = computed(() => {
28
+ if (!isReady.value || contentWidth.value <= 0) {
29
+ return {};
30
+ }
31
+ const duration = contentWidth.value / props.speed;
32
+ return {
33
+ '--marquee-duration': `${duration}s`,
34
+ '--marquee-width': `${contentWidth.value}px`,
35
+ };
36
+ });
37
+
38
+ const animationClass = computed(() => {
39
+ if (!isReady.value || contentWidth.value <= 0) {
40
+ return '';
41
+ }
42
+ return 'is-animating';
43
+ });
44
+
45
+ const getItemStyle = (item: MarqueeItem) => ({
46
+ color: item.color || '',
47
+ background: item.background || props.itemBg,
48
+ padding: props.itemPadding,
49
+ borderRadius: props.itemRadius,
50
+ marginRight: `${props.gap}rpx`,
51
+ });
52
+
53
+ // ─── 测量 ──────────────────────────────────────────────────────
54
+ const queryWidth = (selector: string): Promise<number> =>
55
+ new Promise(resolve => {
56
+ uni.createSelectorQuery()
57
+ .in(instance)
58
+ .select(selector)
59
+ .boundingClientRect((rect: any) => resolve(rect ? rect.width : 0))
60
+ .exec();
61
+ });
62
+
63
+ // ─── 构建队列 ──────────────────────────────────────────────────
64
+ const mkKey = (id: string | number, copy: number, seed: number) => `${id}_c${copy}_s${seed}`;
65
+
66
+ const buildQueue = async (sourceList: MarqueeItem[]) => {
67
+ if (!sourceList.length) {
68
+ displayQueue.value = [];
69
+ isReady.value = false;
70
+ return;
71
+ }
72
+
73
+ isReady.value = false;
74
+ const currentSeed = keySeed++;
75
+
76
+ // 先渲染单份测量
77
+ displayQueue.value = sourceList.map(it => ({ ...it, _key: mkKey(it.id, 0, currentSeed) }));
78
+
79
+ await nextTick();
80
+ await new Promise(r => setTimeout(r, 50));
81
+
82
+ const containerWidth = await queryWidth('.ste-marquee');
83
+ const singleWidth = await queryWidth('.ste-mq-content');
84
+
85
+ if (singleWidth <= 0) {
86
+ await new Promise(r => setTimeout(r, 100));
87
+ const retryWidth = await queryWidth('.ste-mq-content');
88
+ if (retryWidth <= 0) {
89
+ contentWidth.value = 0;
90
+ return;
91
+ }
92
+ contentWidth.value = retryWidth;
93
+ } else {
94
+ contentWidth.value = singleWidth;
95
+ }
96
+
97
+ // 计算份数(防止除零)
98
+ if (contentWidth.value <= 0) {
99
+ copyCount = 2;
100
+ } else if (contentWidth.value >= containerWidth) {
101
+ copyCount = 2;
102
+ } else {
103
+ copyCount = Math.max(3, Math.ceil((containerWidth * 3) / contentWidth.value) + 1);
104
+ }
105
+
106
+ // 构建多份
107
+ const filled: (MarqueeItem & { _key: string })[] = [];
108
+ for (let c = 0; c < copyCount; c++) {
109
+ sourceList.forEach(it => filled.push({ ...it, _key: mkKey(it.id, c, currentSeed) }));
110
+ }
111
+ displayQueue.value = filled;
112
+
113
+ await nextTick();
114
+ isReady.value = true;
115
+
116
+ console.log('[ste-marquee] built queue, contentWidth:', contentWidth.value, 'copies:', copyCount);
117
+ };
118
+
119
+ // ─── 初始化 ────────────────────────────────────────────────────
120
+ const init = async (list: MarqueeItem[], { keepPaused = false } = {}) => {
121
+ if (!keepPaused) {
122
+ isPaused.value = false;
123
+ }
124
+ await buildQueue(list);
125
+ };
126
+
127
+ // ─── 控制 ──────────────────────────────────────────────────────
128
+ const isPaused = ref(false);
129
+
130
+ const play = () => {
131
+ isPaused.value = false;
132
+ };
133
+ const pause = () => {
134
+ isPaused.value = true;
135
+ };
136
+ const resume = () => {
137
+ isPaused.value = false;
138
+ };
139
+ const stop = async () => {
140
+ isPaused.value = true;
141
+ // 重新初始化回到起始位置,保持暂停状态
142
+ await init(props.list, { keepPaused: true });
143
+ };
144
+
145
+ // ─── 监听 ──────────────────────────────────────────────────────
146
+ let isInitialized = false;
147
+ watch(
148
+ () => props.list,
149
+ newList => {
150
+ if (!isInitialized) return;
151
+ init(newList);
152
+ },
153
+ { deep: true }
154
+ );
155
+
156
+ // ─── 生命周期 ──────────────────────────────────────────────────
157
+ onMounted(() => {
158
+ setTimeout(async () => {
159
+ await init(props.list);
160
+ isInitialized = true;
161
+ }, 100);
162
+ });
163
+
164
+ // ─── 交互 ──────────────────────────────────────────────────────
165
+ const handleClick = (item: MarqueeItem, index: number) => {
166
+ if (!props.clickable) return;
167
+ emits('click', item, index);
168
+ };
169
+ const handleMouseEnter = () => {
170
+ if (props.pauseOnHover) pause();
171
+ };
172
+ const handleMouseLeave = () => {
173
+ if (props.pauseOnHover) resume();
174
+ };
175
+
176
+ defineExpose({ play, pause, resume, stop });
177
+ </script>
178
+
179
+ <template>
180
+ <view class="ste-marquee" :style="[containerStyle, cssVariables]" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave" @touchstart="handleMouseEnter" @touchend="handleMouseLeave">
181
+ <view class="ste-mq-wrapper" :class="{ 'is-paused': isPaused }">
182
+ <view class="ste-mq-content" :class="animationClass">
183
+ <view v-for="(item, index) in displayQueue" :key="item._key" class="ste-mq-item" :style="getItemStyle(item)" @click="handleClick(item, index)">
184
+ <slot name="item" :item="item" :index="index">
185
+ <image v-if="item.icon" class="ste-mq-icon" :src="item.icon" mode="aspectFit" />
186
+ <text class="ste-mq-text">{{ item.text }}</text>
187
+ </slot>
188
+ </view>
189
+ </view>
190
+ </view>
191
+ </view>
192
+ </template>
193
+
194
+ <style lang="scss" scoped>
195
+ .ste-marquee {
196
+ width: 100%;
197
+ overflow: hidden;
198
+ position: relative;
199
+ }
200
+
201
+ .ste-mq-wrapper {
202
+ display: flex;
203
+ flex-direction: row;
204
+ align-items: center;
205
+ white-space: nowrap;
206
+
207
+ &.is-paused .ste-mq-content {
208
+ animation-play-state: paused !important;
209
+ }
210
+ }
211
+
212
+ .ste-mq-content {
213
+ display: flex;
214
+ flex-shrink: 0;
215
+ will-change: transform;
216
+
217
+ &.is-animating {
218
+ animation: marquee-scroll var(--marquee-duration, 10s) linear infinite;
219
+ }
220
+ }
221
+
222
+ @keyframes marquee-scroll {
223
+ 0% {
224
+ transform: translateX(0);
225
+ }
226
+ 100% {
227
+ transform: translateX(calc(var(--marquee-width, 0px) * -1));
228
+ }
229
+ }
230
+
231
+ .ste-mq-item {
232
+ display: inline-flex;
233
+ align-items: center;
234
+ flex-shrink: 0;
235
+ cursor: pointer;
236
+ }
237
+
238
+ .ste-mq-icon {
239
+ width: 40rpx;
240
+ height: 40rpx;
241
+ margin-right: 10rpx;
242
+ border-radius: 50%;
243
+ }
244
+
245
+ .ste-mq-text {
246
+ font-size: 28rpx;
247
+ line-height: 1.5;
248
+ }
249
+ </style>
@@ -1,4 +1,6 @@
1
- #### Props
1
+ ## API
2
+
3
+ ### Props
2
4
  | 属性名 | 说明 | 类型 | 默认值 | 可选值 | 支持版本 |
3
5
  | ----- | ----- | --- | ------- | ------ | -------- |
4
6
  | `show` | 是否显示 | `boolean` | `false` | - | - |
@@ -12,10 +14,18 @@
12
14
  | `zIndex` | 弹出层级 | `number` | `997` | - | - |
13
15
 
14
16
 
15
- #### Events
17
+ ### Events
16
18
  | 事件名 | 说明 | 事件参数 | 支持版本 |
17
19
  | ----- | ----- | ------- | -------- |
18
- | `beforeClose` | 关闭前触发 | - | - |
19
- | `close` | 关闭后触发 | - | - |
20
+ | `beforeClose` | 关闭前触发 | `data`:() => void | - |
21
+ | `close` | 关闭后触发 | `data`:() => void | - |
20
22
  | `change` | 切换时触发 | `index`:切换后的下标 | - |
21
23
  | `longpress` | 长按时触发 | `index`:当前下标 | - |
24
+
25
+
26
+ ### Slots
27
+ | 插槽名 | 说明 | 参数 | 支持版本 |
28
+ | ----- | ----- | --- | -------- |
29
+ | `default` | 默认插槽:图片底部居中展示 | - | - |
30
+
31
+