@travel-screen/l-module-components 1.0.0
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.
- package/README.md +86 -0
- package/package.json +34 -0
- package/src/index.js +60 -0
- package/src/l-bar-chart/README.md +302 -0
- package/src/l-bar-chart/index.vue +405 -0
- package/src/l-bar-chart/interface/index.js +210 -0
- package/src/l-data-panel/README.md +331 -0
- package/src/l-data-panel/img/images.js +47 -0
- package/src/l-data-panel/img/l-data-panel_bg_1.png +0 -0
- package/src/l-data-panel/img/l-data-panel_bg_2.png +0 -0
- package/src/l-data-panel/img/l-data-panel_bg_3.png +0 -0
- package/src/l-data-panel/index.vue +150 -0
- package/src/l-data-panel/interface/index.js +249 -0
- package/src/l-data-ring/README.md +292 -0
- package/src/l-data-ring/img/images.js +21 -0
- package/src/l-data-ring/img/l-data-ring_bg.png +0 -0
- package/src/l-data-ring/index.vue +93 -0
- package/src/l-data-ring/interface/index.js +116 -0
- package/src/l-date-picker/README.md +276 -0
- package/src/l-date-picker/index.vue +185 -0
- package/src/l-date-picker/interface/index.js +128 -0
- package/src/l-icon-label/README.md +356 -0
- package/src/l-icon-label/img/images.js +28 -0
- package/src/l-icon-label/img/l-icon-label_bg.png +0 -0
- package/src/l-icon-label/img/l-icon-label_icon.png +0 -0
- package/src/l-icon-label/index.vue +162 -0
- package/src/l-icon-label/interface/index.js +234 -0
- package/src/l-label-value/README.md +358 -0
- package/src/l-label-value/img/images.js +19 -0
- package/src/l-label-value/img/l-label-value_line.png +0 -0
- package/src/l-label-value/index.vue +132 -0
- package/src/l-label-value/interface/index.js +116 -0
- package/src/l-metric-tile/README.md +391 -0
- package/src/l-metric-tile/img/images.js +19 -0
- package/src/l-metric-tile/img/l-metric-tile_bg_1.png +0 -0
- package/src/l-metric-tile/index.vue +138 -0
- package/src/l-metric-tile/interface/index.js +241 -0
- package/src/l-module-box/README.md +289 -0
- package/src/l-module-box/img/images.js +28 -0
- package/src/l-module-box/img/l-module-box_bg.png +0 -0
- package/src/l-module-box/img/l-module-box_icon.png +0 -0
- package/src/l-module-box/index.vue +125 -0
- package/src/l-module-box/interface/index.js +93 -0
- package/src/l-module-tag/README.md +243 -0
- package/src/l-module-tag/index.vue +137 -0
- package/src/l-module-tag/interface/index.js +91 -0
- package/src/l-rank-list/README.md +553 -0
- package/src/l-rank-list/img/images.js +34 -0
- package/src/l-rank-list/img/l-rank-list_icon_line.png +0 -0
- package/src/l-rank-list/img/l-rank-list_icon_rank_1.png +0 -0
- package/src/l-rank-list/img/l-rank-list_icon_rank_2.png +0 -0
- package/src/l-rank-list/img/l-rank-list_icon_rank_other.png +0 -0
- package/src/l-rank-list/index.vue +610 -0
- package/src/l-rank-list/interface/index.js +343 -0
- package/src/l-stat-card/README.md +309 -0
- package/src/l-stat-card/img/images.js +36 -0
- package/src/l-stat-card/img/img-bg.png +0 -0
- package/src/l-stat-card/img/l-stat-card_img_1.png +0 -0
- package/src/l-stat-card/index.vue +136 -0
- package/src/l-stat-card/interface/index.js +159 -0
- package/src/l-tabs/README.md +285 -0
- package/src/l-tabs/img/images.js +19 -0
- package/src/l-tabs/img/l-tabs_bg.png +0 -0
- package/src/l-tabs/index.vue +97 -0
- package/src/l-tabs/interface/index.js +115 -0
- package/src/l-trend-card/README.md +415 -0
- package/src/l-trend-card/img/images.js +41 -0
- package/src/l-trend-card/img/l-trend-card_bg.png +0 -0
- package/src/l-trend-card/img/l-trend-card_icon_1.png +0 -0
- package/src/l-trend-card/img/l-trend-card_icon_down.png +0 -0
- package/src/l-trend-card/img/l-trend-card_icon_up.png +0 -0
- package/src/l-trend-card/index.vue +181 -0
- package/src/l-trend-card/interface/index.js +243 -0
- package/src/utils/tooltip.js +30 -0
- package/src/utils/util.js +27 -0
|
@@ -0,0 +1,553 @@
|
|
|
1
|
+
---
|
|
2
|
+
AIGC:
|
|
3
|
+
ContentProducer: '001191110102MAD55U9H0F10002'
|
|
4
|
+
ContentPropagator: '001191110102MAD55U9H0F10002'
|
|
5
|
+
Label: '1'
|
|
6
|
+
ProduceID: '4b940a67-44d9-46d5-a6d6-097356844c79'
|
|
7
|
+
PropagateID: '4b940a67-44d9-46d5-a6d6-097356844c79'
|
|
8
|
+
ReservedCode1: '3fa76c32-0ec7-46b2-a97e-a2f3f1783b33'
|
|
9
|
+
ReservedCode2: '3fa76c32-0ec7-46b2-a97e-a2f3f1783b33'
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# LRankList 组件说明
|
|
13
|
+
|
|
14
|
+
## 概述
|
|
15
|
+
|
|
16
|
+
`LRankList` 是一个参数化驱动的排行榜列表组件,采用类似 Element UI 的封装方式。所有样式(排名图标、进度条、文字大小、颜色等)均通过 props 参数动态控制,不再依赖 CSS 样式文件。
|
|
17
|
+
|
|
18
|
+
## 核心特性
|
|
19
|
+
|
|
20
|
+
- ✅ **Props 驱动**:所有样式通过 props 参数控制,类似 Element UI
|
|
21
|
+
- ✅ **内联样式**:使用 computed 属性动态生成内联样式
|
|
22
|
+
- ✅ **高度灵活**:支持自定义排名图标、进度条颜色、字体、颜色等
|
|
23
|
+
- ✅ **默认图标**:未传入图标时自动使用组件内置默认图标
|
|
24
|
+
- ✅ **类型安全**:支持 String 和 Number 类型的尺寸参数
|
|
25
|
+
- ✅ **渐变文字**:数值支持渐变背景效果
|
|
26
|
+
|
|
27
|
+
## 设计原则
|
|
28
|
+
|
|
29
|
+
### Element UI 风格封装
|
|
30
|
+
|
|
31
|
+
```vue
|
|
32
|
+
<!-- 类似 Element UI 的使用方式 -->
|
|
33
|
+
<l-rank-list
|
|
34
|
+
:dataList="list"
|
|
35
|
+
unit="%"
|
|
36
|
+
:rank1-color="'#40FF8F'"
|
|
37
|
+
:rank2-color="'#FFD073'"
|
|
38
|
+
:progress-bar-active-bg="'rgba(85,219,209,1)'"
|
|
39
|
+
/>
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 文件结构
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
l-rank-list/
|
|
46
|
+
├── img/ # 默认图标资源
|
|
47
|
+
│ ├── images.js # 图标映射文件
|
|
48
|
+
│ ├── l-rank-list_icon_line.png # 进度条滑块图标
|
|
49
|
+
│ ├── l-rank-list_icon_rank_1.png # 第1名排名图标
|
|
50
|
+
│ ├── l-rank-list_icon_rank_2.png # 第2名排名图标
|
|
51
|
+
│ └── l-rank-list_icon_rank_other.png # 其他排名图标
|
|
52
|
+
├── interface/
|
|
53
|
+
│ └── index.js # Props 定义(30+ 个参数)
|
|
54
|
+
├── index.vue # 主组件(内联样式驱动)
|
|
55
|
+
└── README.md # 组件说明文档
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Props 参数
|
|
59
|
+
|
|
60
|
+
### 基础参数
|
|
61
|
+
|
|
62
|
+
| 参数名 | 类型 | 默认值 | 必填 | 说明 |
|
|
63
|
+
|--------|------|--------|------|------|
|
|
64
|
+
| `layoutType` | String | `'value-bottom'` | 否 | 布局类型:`'value-bottom'`(数值在进度条右侧)、`'value-top'`(数值在标题右侧) |
|
|
65
|
+
| `unit` | String | `'人'` | 否 | 数值单位 |
|
|
66
|
+
| `dataList` | Array | `[]` | 否 | 排行榜数据列表(每项包含 name 和 value) |
|
|
67
|
+
| `displayLimit` | Number | `20` | 否 | 列表最大显示条数 |
|
|
68
|
+
| `autoScroll` | Boolean | `false` | 否 | 是否自动滚动(数据超过显示限制时) |
|
|
69
|
+
| `scrollSpeed` | Number | `30` | 否 | 滚动速度(像素/秒) |
|
|
70
|
+
|
|
71
|
+
### 容器参数
|
|
72
|
+
|
|
73
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
74
|
+
|--------|------|--------|------|
|
|
75
|
+
| `containerWidth` | String | `'100%'` | 容器宽度 |
|
|
76
|
+
| `containerHeight` | String | `'100%'` | 容器高度 |
|
|
77
|
+
| `containerLeft` | String/Number | `'-5px'` | 容器左边距 |
|
|
78
|
+
| `listItemWidth` | String | `'98%'` | 列表项宽度 |
|
|
79
|
+
| `listItemGap` | String/Number | `8` | 列表项间距 |
|
|
80
|
+
|
|
81
|
+
### 排名图标参数
|
|
82
|
+
|
|
83
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
84
|
+
|--------|------|--------|------|
|
|
85
|
+
| `rankIconWidth` | String/Number | `'39px'` | 排名图标宽度 |
|
|
86
|
+
| `rankIconHeight` | String/Number | `'37px'` | 排名图标高度 |
|
|
87
|
+
| `rankIconFontSize` | String/Number | `'12px'` | 排名图标字号 |
|
|
88
|
+
| `rankIconFontFamily` | String | `'REEJI-PinboGB, REEJI-PinboGB'` | 排名图标字体 |
|
|
89
|
+
| `rankIconFontWeight` | String/Number | `'normal'` | 排名图标字重 |
|
|
90
|
+
| `rankIconColor` | String | `'#FFFFFF'` | 排名图标颜色 |
|
|
91
|
+
| `rankIcon1` | String | `''` | 第1名排名图标URL(可选) |
|
|
92
|
+
| `rankIcon2` | String | `''` | 第2名排名图标URL(可选) |
|
|
93
|
+
| `rankIconOther` | String | `''` | 其他排名图标URL(可选) |
|
|
94
|
+
|
|
95
|
+
### 标题参数
|
|
96
|
+
|
|
97
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
98
|
+
|--------|------|--------|------|
|
|
99
|
+
| `titleFontFamily` | String | `'PingFangSC, PingFang SC'` | 标题字体 |
|
|
100
|
+
| `titleFontWeight` | String/Number | `500` | 标题字重 |
|
|
101
|
+
| `titleFontSize` | String/Number | `'14px'` | 标题字号 |
|
|
102
|
+
| `titleColor` | String | `'#E8EEF4'` | 标题颜色 |
|
|
103
|
+
| `titleMarginBottom` | String/Number | `'4px'` | 标题下边距(value-top 布局时生效) |
|
|
104
|
+
|
|
105
|
+
### 进度条参数
|
|
106
|
+
|
|
107
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
108
|
+
|--------|------|--------|------|
|
|
109
|
+
| `progressBarHeight` | String/Number | `'6px'` | 进度条高度 |
|
|
110
|
+
| `progressBarBorderRadius` | String/Number | `'5px'` | 进度条圆角 |
|
|
111
|
+
| `progressBarBg` | String | `'rgba(85,219,209,0.3)'` | 进度条默认背景 |
|
|
112
|
+
| `progressBarBoxShadow` | String | `'inset 0px 0px 3px 1px rgba(255,255,255,0.15)'` | 进度条内阴影 |
|
|
113
|
+
| `progressBarActiveBg` | String | `'rgba(85,219,209,1)'` | 进度条第3名及以后激活背景 |
|
|
114
|
+
| `rank1Color` | String | `'#40FF8F'` | 进度条第1名颜色 |
|
|
115
|
+
| `rank2Color` | String | `'#FFD073'` | 进度条第2名颜色 |
|
|
116
|
+
|
|
117
|
+
### 滑块图标参数
|
|
118
|
+
|
|
119
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
120
|
+
|--------|------|--------|------|
|
|
121
|
+
| `sliderIconWidth` | String/Number | `'15px'` | 滑块图标宽度 |
|
|
122
|
+
| `sliderIconHeight` | String/Number | `'15px'` | 滑块图标高度 |
|
|
123
|
+
| `sliderIconTop` | String/Number | `'-4px'` | 滑块图标上边距 |
|
|
124
|
+
| `sliderIcon` | String | `''` | 滑块图标URL(可选) |
|
|
125
|
+
|
|
126
|
+
### 数值参数
|
|
127
|
+
|
|
128
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
129
|
+
|--------|------|--------|------|
|
|
130
|
+
| `valueMinWidth` | String/Number | `'20px'` | 数值最小宽度 |
|
|
131
|
+
| `valueFontFamily` | String | `'DIN, DIN'` | 数值字体 |
|
|
132
|
+
| `valueFontWeight` | String/Number | `'normal'` | 数值字重 |
|
|
133
|
+
| `valueFontSize` | String/Number | `'14px'` | 数值字号 |
|
|
134
|
+
| `valueColor` | String | `'transparent'` | 数值颜色 |
|
|
135
|
+
| `valueBackground` | String | `'linear-gradient(270deg, #4CE27E 0%, #FFFFFF 100%)'` | 数值渐变背景 |
|
|
136
|
+
| `valueBackgroundClip` | String | `'text'` | 数值背景裁剪 |
|
|
137
|
+
| `valueLineHeight` | String/Number | `'12px'` | 数值行高 |
|
|
138
|
+
| `valueFontStyle` | String | `'italic'` | 数值字体样式 |
|
|
139
|
+
| `valueTextShadow` | String | `'0px 2px 3px rgba(22, 72, 56, 0.6)'` | 数值阴影 |
|
|
140
|
+
| `valueTextAlign` | String | `'left'` | 数值对齐 |
|
|
141
|
+
|
|
142
|
+
### 单位参数
|
|
143
|
+
|
|
144
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
145
|
+
|--------|------|--------|------|
|
|
146
|
+
| `unitFontFamily` | String | `'SourceHanSansCN, SourceHanSansCN'` | 单位字体 |
|
|
147
|
+
| `unitFontWeight` | String/Number | `400` | 单位字重 |
|
|
148
|
+
| `unitFontSize` | String/Number | `'12px'` | 单位字号 |
|
|
149
|
+
| `unitMarginLeft` | String/Number | `'2px'` | 单位左边距 |
|
|
150
|
+
|
|
151
|
+
### 顶部数值参数(value-top 布局专用)
|
|
152
|
+
|
|
153
|
+
| 参数名 | 类型 | 默认值 | 说明 |
|
|
154
|
+
|--------|------|--------|------|
|
|
155
|
+
| `topValueFontSize` | String/Number | `'16px'` | 顶部数值字号 |
|
|
156
|
+
| `topValueColor` | String | `'transparent'` | 顶部数值颜色 |
|
|
157
|
+
| `topValueBackground` | String | `'linear-gradient(0deg, #4CE27E 0%, #FFFFFF 100%)'` | 顶部数值渐变背景 |
|
|
158
|
+
| `topValueBackgroundClip` | String | `'text'` | 顶部数值背景裁剪 |
|
|
159
|
+
| `topValueLineHeight` | String/Number | `'1'` | 顶部数值行高 |
|
|
160
|
+
| `topValueFontStyle` | String | `'normal'` | 顶部数值字体样式 |
|
|
161
|
+
| `topValueTextShadow` | String | `'none'` | 顶部数值阴影 |
|
|
162
|
+
|
|
163
|
+
## 使用方式
|
|
164
|
+
|
|
165
|
+
### 基本使用(value-bottom 布局,数值在进度条右侧)
|
|
166
|
+
|
|
167
|
+
```vue
|
|
168
|
+
<template>
|
|
169
|
+
<l-rank-list
|
|
170
|
+
:dataList="sourceList"
|
|
171
|
+
unit="%"
|
|
172
|
+
/>
|
|
173
|
+
</template>
|
|
174
|
+
|
|
175
|
+
<script>
|
|
176
|
+
import LRankList from '@/components/moduleDataNew/l-rank-list/index.vue'
|
|
177
|
+
|
|
178
|
+
export default {
|
|
179
|
+
components: {
|
|
180
|
+
LRankList
|
|
181
|
+
},
|
|
182
|
+
data() {
|
|
183
|
+
return {
|
|
184
|
+
sourceList: [
|
|
185
|
+
{ name: '江苏省', value: 19.72 },
|
|
186
|
+
{ name: '上海市', value: 18.46 },
|
|
187
|
+
{ name: '广东省', value: 7.54 },
|
|
188
|
+
{ name: '安徽省', value: 6.76 },
|
|
189
|
+
{ name: '山东省', value: 6.05 }
|
|
190
|
+
]
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
</script>
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
### value-top 布局(数值在标题右侧)
|
|
198
|
+
|
|
199
|
+
```vue
|
|
200
|
+
<template>
|
|
201
|
+
<l-rank-list
|
|
202
|
+
:dataList="sourceList"
|
|
203
|
+
unit="%"
|
|
204
|
+
layoutType="value-top"
|
|
205
|
+
/>
|
|
206
|
+
</template>
|
|
207
|
+
|
|
208
|
+
<script>
|
|
209
|
+
import LRankList from '@/components/moduleDataNew/l-rank-list/index.vue'
|
|
210
|
+
|
|
211
|
+
export default {
|
|
212
|
+
components: {
|
|
213
|
+
LRankList
|
|
214
|
+
},
|
|
215
|
+
data() {
|
|
216
|
+
return {
|
|
217
|
+
sourceList: [
|
|
218
|
+
{ name: '江苏省', value: 19.72 },
|
|
219
|
+
{ name: '上海市', value: 18.46 },
|
|
220
|
+
{ name: '广东省', value: 7.54 }
|
|
221
|
+
]
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
</script>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### 自定义进度条颜色
|
|
229
|
+
|
|
230
|
+
```vue
|
|
231
|
+
<template>
|
|
232
|
+
<l-rank-list
|
|
233
|
+
:dataList="consumeList"
|
|
234
|
+
unit=""
|
|
235
|
+
:rank1-color="'#FF6B6B'"
|
|
236
|
+
:rank2-color="'#FFD93D'"
|
|
237
|
+
:progress-bar-active-bg="'#6BCB77'"
|
|
238
|
+
:progress-bar-bg="'rgba(107, 203, 119, 0.3)'"
|
|
239
|
+
/>
|
|
240
|
+
</template>
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
### 自定义滑块图标
|
|
244
|
+
|
|
245
|
+
```vue
|
|
246
|
+
<template>
|
|
247
|
+
<l-rank-list
|
|
248
|
+
:dataList="list"
|
|
249
|
+
unit="家"
|
|
250
|
+
:slider-icon="require('@/assets/custom-slider.png')"
|
|
251
|
+
:slider-icon-width="20"
|
|
252
|
+
:slider-icon-height="20"
|
|
253
|
+
/>
|
|
254
|
+
</template>
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 完整自定义
|
|
258
|
+
|
|
259
|
+
```vue
|
|
260
|
+
<template>
|
|
261
|
+
<l-rank-list
|
|
262
|
+
:dataList="list"
|
|
263
|
+
unit="人"
|
|
264
|
+
:display-limit="10"
|
|
265
|
+
:rank-icon-width="45"
|
|
266
|
+
:rank-icon-height="42"
|
|
267
|
+
:title-font-size="16"
|
|
268
|
+
title-color="#FFFFFF"
|
|
269
|
+
:progress-bar-height="8"
|
|
270
|
+
:value-font-size="16"
|
|
271
|
+
value-background="linear-gradient(270deg, #00F2FE 0%, #4FACFE 100%)"
|
|
272
|
+
:value-text-shadow="'0px 2px 6px rgba(0, 242, 254, 0.5)'"
|
|
273
|
+
/>
|
|
274
|
+
</template>
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
### 自定义排名图标
|
|
278
|
+
|
|
279
|
+
```vue
|
|
280
|
+
<template>
|
|
281
|
+
<l-rank-list
|
|
282
|
+
:dataList="list"
|
|
283
|
+
unit="%"
|
|
284
|
+
:rank-icon1="require('@/assets/gold-medal.png')"
|
|
285
|
+
:rank-icon2="require('@/assets/silver-medal.png')"
|
|
286
|
+
:rank-icon-other="require('@/assets/bronze-medal.png')"
|
|
287
|
+
/>
|
|
288
|
+
</template>
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
### 自动滚动
|
|
292
|
+
|
|
293
|
+
```vue
|
|
294
|
+
<template>
|
|
295
|
+
<l-rank-list
|
|
296
|
+
:dataList="longList"
|
|
297
|
+
unit="%"
|
|
298
|
+
:display-limit="10"
|
|
299
|
+
:auto-scroll="true"
|
|
300
|
+
:scroll-speed="40"
|
|
301
|
+
/>
|
|
302
|
+
</template>
|
|
303
|
+
|
|
304
|
+
<script>
|
|
305
|
+
export default {
|
|
306
|
+
data() {
|
|
307
|
+
return {
|
|
308
|
+
longList: [
|
|
309
|
+
{ name: '江苏省', value: 19.72 },
|
|
310
|
+
{ name: '上海市', value: 18.46 },
|
|
311
|
+
{ name: '广东省', value: 17.54 },
|
|
312
|
+
{ name: '安徽省', value: 16.76 },
|
|
313
|
+
{ name: '山东省', value: 15.05 },
|
|
314
|
+
{ name: '浙江省', value: 14.23 },
|
|
315
|
+
{ name: '福建省', value: 13.89 },
|
|
316
|
+
{ name: '河南省', value: 12.56 },
|
|
317
|
+
{ name: '四川省', value: 11.34 },
|
|
318
|
+
{ name: '湖北省', value: 10.78 },
|
|
319
|
+
{ name: '湖南省', value: 9.45 },
|
|
320
|
+
{ name: '河北省', value: 8.92 }
|
|
321
|
+
]
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
</script>
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
**说明**:
|
|
329
|
+
- 当数据量超过 `display-limit` 时,开启 `auto-scroll` 会自动滚动
|
|
330
|
+
- **滚动速度控制**:通过 `scroll-speed` 参数调整滚动速度(默认 30 像素/秒)
|
|
331
|
+
- **鼠标交互**:
|
|
332
|
+
- **鼠标移入容器**:停止自动滚动,支持鼠标滚轮手动滚动
|
|
333
|
+
- **鼠标滚轮向上滚动**:向上查看历史数据(支持循环滚动)
|
|
334
|
+
- **鼠标滚轮向下滚动**:向下查看后续数据(支持循环滚动)
|
|
335
|
+
- **鼠标离开容器**:重置手动滚动偏移,恢复自动滚动
|
|
336
|
+
- **无缝循环滚动**:支持向任意方向无限滚动,自动循环数据
|
|
337
|
+
- 使用 `requestAnimationFrame` 实现流畅的 60fps 动画
|
|
338
|
+
- 数据复制一份实现平滑过渡效果
|
|
339
|
+
|
|
340
|
+
## 图标使用方式
|
|
341
|
+
|
|
342
|
+
组件接受多个图标参数:
|
|
343
|
+
|
|
344
|
+
1. **rankIcon1**(可选):第1名排名图标 URL
|
|
345
|
+
2. **rankIcon2**(可选):第2名排名图标 URL
|
|
346
|
+
3. **rankIconOther**(可选):第3名及以后排名图标 URL
|
|
347
|
+
4. **sliderIcon**(可选):进度条滑块图标 URL
|
|
348
|
+
|
|
349
|
+
**说明**:
|
|
350
|
+
- 如果未传入图标,组件会自动使用内部的默认图标
|
|
351
|
+
- 如果传入了图标,则使用外部传入的图标
|
|
352
|
+
|
|
353
|
+
### 使用默认图标(不传参)
|
|
354
|
+
|
|
355
|
+
```vue
|
|
356
|
+
<l-rank-list
|
|
357
|
+
:dataList="sourceList"
|
|
358
|
+
unit="%"
|
|
359
|
+
/>
|
|
360
|
+
<!-- 自动使用组件内置的默认排名图标和滑块图标 -->
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
### 使用 require 引入
|
|
364
|
+
|
|
365
|
+
```vue
|
|
366
|
+
<l-rank-list
|
|
367
|
+
:dataList="list"
|
|
368
|
+
:rank-icon1="require('@/assets/icons/gold.png')"
|
|
369
|
+
:rank-icon2="require('@/assets/icons/silver.png')"
|
|
370
|
+
:slider-icon="require('@/assets/icons/slider.png')"
|
|
371
|
+
/>
|
|
372
|
+
```
|
|
373
|
+
|
|
374
|
+
### 使用外部 URL
|
|
375
|
+
|
|
376
|
+
```vue
|
|
377
|
+
<l-rank-list
|
|
378
|
+
:dataList="list"
|
|
379
|
+
rank-icon1="https://example.com/gold.png"
|
|
380
|
+
rank-icon2="https://example.com/silver.png"
|
|
381
|
+
/>
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### 从数据对象传入
|
|
385
|
+
|
|
386
|
+
```vue
|
|
387
|
+
<l-rank-list
|
|
388
|
+
:dataList="list"
|
|
389
|
+
:rank-icon1="item.rankIcon1"
|
|
390
|
+
:rank-icon2="item.rankIcon2"
|
|
391
|
+
/>
|
|
392
|
+
```
|
|
393
|
+
|
|
394
|
+
## 尺寸参数说明
|
|
395
|
+
|
|
396
|
+
所有尺寸参数均支持 String 和 Number 两种类型:
|
|
397
|
+
|
|
398
|
+
```vue
|
|
399
|
+
<!-- String 类型(带单位) -->
|
|
400
|
+
<l-rank-list :value-font-size="'14px'" />
|
|
401
|
+
|
|
402
|
+
<!-- Number 类型(自动添加 px) -->
|
|
403
|
+
<l-rank-list :value-font-size="14" />
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
## 数据结构
|
|
407
|
+
|
|
408
|
+
### dataList 格式
|
|
409
|
+
|
|
410
|
+
```javascript
|
|
411
|
+
[
|
|
412
|
+
{ name: '江苏省', value: 19.72 },
|
|
413
|
+
{ name: '上海市', value: 18.46 },
|
|
414
|
+
{ name: '广东省', value: 7.54 }
|
|
415
|
+
]
|
|
416
|
+
```
|
|
417
|
+
|
|
418
|
+
- `name`: 排行榜项的名称
|
|
419
|
+
- `value`: 排行榜项的数值(用于计算进度条宽度)
|
|
420
|
+
|
|
421
|
+
## 技术实现
|
|
422
|
+
|
|
423
|
+
### 内联样式生成
|
|
424
|
+
|
|
425
|
+
组件通过 computed 属性动态生成内联样式:
|
|
426
|
+
|
|
427
|
+
```javascript
|
|
428
|
+
computed: {
|
|
429
|
+
valueStyle() {
|
|
430
|
+
return {
|
|
431
|
+
fontFamily: this.valueFontFamily,
|
|
432
|
+
fontWeight: this.valueFontWeight,
|
|
433
|
+
fontSize: typeof this.valueFontSize === 'number'
|
|
434
|
+
? `${this.valueFontSize}px`
|
|
435
|
+
: this.valueFontSize,
|
|
436
|
+
color: this.valueColor,
|
|
437
|
+
background: this.valueBackground,
|
|
438
|
+
WebkitBackgroundClip: this.valueBackgroundClip,
|
|
439
|
+
backgroundClip: this.valueBackgroundClip
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
### 模板绑定
|
|
446
|
+
|
|
447
|
+
```vue
|
|
448
|
+
<div class="l-rank-list__value" :style="valueStyle">{{ item.value }}<span :style="unitStyle">{{ unit }}</span></div>
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
### 默认图标兜底
|
|
452
|
+
|
|
453
|
+
```javascript
|
|
454
|
+
computed: {
|
|
455
|
+
computedSliderIcon() {
|
|
456
|
+
if (this.sliderIcon) {
|
|
457
|
+
return this.sliderIcon
|
|
458
|
+
}
|
|
459
|
+
return getLineIconPath()
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
```
|
|
463
|
+
|
|
464
|
+
### 进度条计算
|
|
465
|
+
|
|
466
|
+
```javascript
|
|
467
|
+
// 自动计算最大值
|
|
468
|
+
this.maxValue = this.dataList.reduce((max, item) => Math.max(max, item.value), -Infinity)
|
|
469
|
+
|
|
470
|
+
// 进度条宽度百分比
|
|
471
|
+
:style="{ width: item.value / maxValue * 100 + '%' }"
|
|
472
|
+
```
|
|
473
|
+
|
|
474
|
+
## 注意事项
|
|
475
|
+
|
|
476
|
+
1. **布局类型**:
|
|
477
|
+
- `layoutType="value-bottom"`(默认):数值在进度条右侧(moduleData_3 风格)
|
|
478
|
+
- `layoutType="value-top"`:数值在标题右侧(moduleData_2 风格)
|
|
479
|
+
2. **图标可选**:所有图标参数都是可选的,未传入时使用默认图标
|
|
480
|
+
3. **渐变文字兼容**:使用了 `WebkitBackgroundClip` 和 `backgroundClip` 实现渐变文字效果
|
|
481
|
+
4. **尺寸单位**:Number 类型会自动添加 `px` 单位,String 类型需自行包含单位
|
|
482
|
+
5. **默认图标**:组件内置默认图标,位于 `img/` 目录下
|
|
483
|
+
6. **性能优化**:内联样式通过 computed 缓存,避免重复计算
|
|
484
|
+
7. **BEM 命名**:使用 `l-rank-list__item`、`l-rank-list__rank-icon` 等 BEM 命名规范
|
|
485
|
+
8. **数据监听**:自动监听 `dataList` 变化并重新计算最大值
|
|
486
|
+
9. **滑块定位**:
|
|
487
|
+
- 滑块位置自动计算:`left: calc(进度条百分比 - 滑块宽度/2)`
|
|
488
|
+
- 使用 CSS `calc()` 函数实现精确的居中定位
|
|
489
|
+
- 滑块宽度的一半自动从进度条末端偏移,确保滑块中心对齐进度条末端
|
|
490
|
+
|
|
491
|
+
## 适用场景
|
|
492
|
+
|
|
493
|
+
- ✅ 需要展示排名数据的排行榜列表
|
|
494
|
+
- ✅ 需要动态调整样式的排行榜组件
|
|
495
|
+
- ✅ 不同页面使用不同主题的排行榜
|
|
496
|
+
- ✅ 需要根据排名改变颜色/图标
|
|
497
|
+
- ✅ 类似 Element UI 的组件化开发方式
|
|
498
|
+
- ✅ 游客来源地、人均消费等排行榜展示
|
|
499
|
+
- ✅ 需要灵活控制数值显示位置(标题行或进度条行)
|
|
500
|
+
|
|
501
|
+
## 更新日志
|
|
502
|
+
|
|
503
|
+
- **v1.4.0** (2026-06-18)
|
|
504
|
+
- 优化自动滚动交互逻辑
|
|
505
|
+
- **鼠标移入停止自动滚动**:鼠标移入容器时停止自动滚动
|
|
506
|
+
- **鼠标滚轮支持**:鼠标移入后支持滚轮手动滚动
|
|
507
|
+
- **无缝循环滚动**:支持向任意方向无限滚动查看数据
|
|
508
|
+
- **鼠标离开恢复自动滚动**:鼠标离开容器时恢复自动滚动
|
|
509
|
+
- 新增 `isMouseInside` 状态管理鼠标位置
|
|
510
|
+
- 新增 `manualScrollOffset` 手动滚动偏移量
|
|
511
|
+
- 新增 `handleWheel` 方法处理鼠标滚轮事件
|
|
512
|
+
- 新增 `handleMouseEnter` / `handleMouseLeave` 方法管理鼠标状态
|
|
513
|
+
- 向上滚动超过顶部时自动循环到底部
|
|
514
|
+
- 向下滚动超过底部时自动循环到顶部
|
|
515
|
+
|
|
516
|
+
- **v1.3.0** (2026-06-10)
|
|
517
|
+
- 新增自动滚动功能
|
|
518
|
+
- 新增 `autoScroll` 参数控制是否开启自动滚动
|
|
519
|
+
- 新增 `scrollSpeed` 参数控制滚动速度(像素/秒)
|
|
520
|
+
- **滚动策略优化**:
|
|
521
|
+
- 开启自动滚动时:使用 transform 动画,不支持手动滚动
|
|
522
|
+
- 未开启自动滚动时:使用原生滚动(overflow-y: auto)
|
|
523
|
+
- 支持鼠标悬停暂停滚动,鼠标离开恢复滚动
|
|
524
|
+
- 使用 `requestAnimationFrame` 实现流畅动画
|
|
525
|
+
- 无缝循环滚动效果
|
|
526
|
+
|
|
527
|
+
- **v1.2.0** (2026-06-10)
|
|
528
|
+
- 删除 `sliderLeftOffsetBottom` 和 `sliderLeftOffsetTop` 参数
|
|
529
|
+
- 新增统一的 `sliderLeftOffset` 参数
|
|
530
|
+
- 优化滑块定位算法,使用 CSS `calc()` 函数实现精确居中
|
|
531
|
+
- 滑块位置自动计算:`left: calc(进度条百分比 - 滑块宽度/2)`
|
|
532
|
+
- 移除父组件中的滑块偏移量配置,简化 API
|
|
533
|
+
|
|
534
|
+
- **v1.1.0** (2026-06-10)
|
|
535
|
+
- 新增 `layoutType` 参数控制数值显示位置
|
|
536
|
+
- 支持 `value-top` 布局(数值在标题右侧,兼容 moduleData_2)
|
|
537
|
+
- 支持 `value-bottom` 布局(数值在进度条右侧,兼容 moduleData_3)
|
|
538
|
+
- 新增顶部数值样式参数(topValueFontSize、topValueColor 等)
|
|
539
|
+
- 新增 `titleMarginBottom` 参数控制标题下边距
|
|
540
|
+
- 优化滑块位置计算(两种布局使用不同的偏移量)
|
|
541
|
+
|
|
542
|
+
- **v1.0.0** (2026-06-10)
|
|
543
|
+
- 从 moduleData_3 重命名为 `l-rank-list`
|
|
544
|
+
- 移除 CSS 文件依赖,改为 props 驱动
|
|
545
|
+
- 新增默认图标支持(img/ 目录)
|
|
546
|
+
- 新增 30+ 个样式控制参数
|
|
547
|
+
- 使用内联样式实现(类似 Element UI)
|
|
548
|
+
- 支持 String/Number 类型的尺寸参数
|
|
549
|
+
- 排名图标和滑块图标通过参数外部传入
|
|
550
|
+
- 新增 computedSliderIcon、getRankIcon 兜底逻辑
|
|
551
|
+
- 图片命名规范:l-rank-list_icon_*.png
|
|
552
|
+
|
|
553
|
+
> AI生成
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* l-rank-list 组件图片资源映射
|
|
3
|
+
* 提供默认图标获取函数
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const images = {
|
|
7
|
+
// 进度条滑块图标
|
|
8
|
+
line: require('./l-rank-list_icon_line.png'),
|
|
9
|
+
// 排名图标
|
|
10
|
+
ranks: {
|
|
11
|
+
other: require('./l-rank-list_icon_rank_other.png'),
|
|
12
|
+
1: require('./l-rank-list_icon_rank_1.png'),
|
|
13
|
+
2: require('./l-rank-list_icon_rank_2.png')
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 获取进度条滑块图标路径
|
|
19
|
+
* @returns {String} 滑块图标路径
|
|
20
|
+
*/
|
|
21
|
+
export function getLineIconPath() {
|
|
22
|
+
return images.line
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* 获取排名图标路径
|
|
27
|
+
* @param {Number} rank - 排名(1、2 或其他)
|
|
28
|
+
* @returns {String} 排名图标路径
|
|
29
|
+
*/
|
|
30
|
+
export function getRankIconPath(rank) {
|
|
31
|
+
if (rank === 1) return images.ranks[1]
|
|
32
|
+
if (rank === 2) return images.ranks[2]
|
|
33
|
+
return images.ranks.other
|
|
34
|
+
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|