progress-bar.vue 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <template>
  2. <div class="template-view">
  3. <div class="progressbar-card">
  4. <div class="progressbar" :style="{ width: cardwidth + '%', height: cardheight + 'px' }">
  5. <div class="before"></div>
  6. <div
  7. :class="bartusecolor[colorIndex]"
  8. :style="{ width: width + '%', transition: 'width' + ' ' + time + 's' }"
  9. >
  10. <span></span>
  11. </div>
  12. <div class="label-flex">
  13. <div class="label la-top">
  14. <span v-for="(zt, index) in progressData" :key="index" class="traffic-info"
  15. ><div
  16. class="indexys"
  17. :class="{
  18. indexywc: index + 1 < progressJd,
  19. indexjxz: index + 1 === progressJd,
  20. indexwwc: index + 1 > progressJd,
  21. }"
  22. >{{ index + 1 }}</div
  23. >
  24. <div class="ztinfo">{{ zt.title }}</div></span
  25. >
  26. </div>
  27. </div>
  28. </div>
  29. </div>
  30. </div>
  31. </template>
  32. <script>
  33. import components from './_import-components/progress-bar-import'
  34. export default {
  35. name: 'ProgressBar',
  36. metaInfo: {
  37. title: 'ProgressBar',
  38. },
  39. components,
  40. props: {
  41. width: {
  42. type: null,
  43. default: '',
  44. },
  45. cardheight: {
  46. type: Number,
  47. default: 400,
  48. },
  49. cardwidth: {
  50. type: Number,
  51. default: 20,
  52. },
  53. colorIndex: {
  54. type: Number,
  55. default: 0,
  56. },
  57. time: {
  58. type: Number,
  59. default: 5,
  60. },
  61. progressData: {
  62. type: Array,
  63. default: () => [],
  64. },
  65. progressJd: {
  66. type: Number,
  67. defalut: 1,
  68. },
  69. },
  70. data() {
  71. return {
  72. bartusecolor: ['bar tuse color', 'bar tuse color2', 'bar tuse color3', 'bar tuse color4'],
  73. barardcolor: ['bar ard color', 'bar ard color2', 'bar ard color3', 'bar ard color4'],
  74. }
  75. },
  76. methods: {},
  77. }
  78. </script>
  79. <style scoped>
  80. .progressbar .bar span {
  81. position: absolute;
  82. display: block;
  83. width: 150%;
  84. height: 150%;
  85. -webkit-border-radius: 16px;
  86. border-radius: 16px;
  87. top: -5px;
  88. left: -100px;
  89. background: url(jd.png) 0 0; /*进度条不透明背景 */
  90. animation: mymove 5s infinite; /*控制进度条滚动 */
  91. background-size: 30% 100%;
  92. opacity: 0.4;
  93. }
  94. .progressbar {
  95. position: relative;
  96. display: block;
  97. border-bottom: 1px solid rgba(255, 255, 255, 0.25);
  98. border-radius: 16px;
  99. margin: 0px auto;
  100. }
  101. .progressbar:first-of-type {
  102. margin-top: 40px;
  103. }
  104. .progressbar .before {
  105. position: absolute;
  106. display: block;
  107. content: '';
  108. width: calc(100% + 4px);
  109. height: 20px;
  110. left: -2px;
  111. right: 1px;
  112. border-radius: 20px;
  113. background: #fff;
  114. box-shadow: 0 0 2px 0 rgba(180, 180, 180, 0.85);
  115. border: 1px solid rgba(222, 222, 222, 0.8);
  116. }
  117. .progressbar .bar {
  118. position: absolute;
  119. display: block;
  120. width: 0;
  121. height: 16px;
  122. top: 2px;
  123. left: 0;
  124. background: #7eea19;
  125. border-radius: 16px;
  126. box-shadow: 0 0 12px 0 #7eea19, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  127. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  128. overflow: hidden;
  129. }
  130. .progressbar .label .bar {
  131. position: relative;
  132. display: inline-block;
  133. top: 12%;
  134. left: 0;
  135. margin-right: 5px;
  136. width: 16px;
  137. }
  138. .progressbar .label .bar.color {
  139. box-shadow: 0 0 5px 0 #7eea19, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  140. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  141. }
  142. .progressbar .label .bar.color2 {
  143. box-shadow: 0 0 5px 0 #e5c319, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  144. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  145. }
  146. .progressbar .label .bar.color3 {
  147. box-shadow: 0 0 5px 0 #44b6af, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  148. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  149. }
  150. .progressbar .label .bar.color4 {
  151. box-shadow: 0 0 5px 0 #186de2, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  152. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  153. }
  154. .progressbar .bar.color2 {
  155. background: #e5c319;
  156. box-shadow: 0 0 12px 0 #e5c319, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  157. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  158. }
  159. .progressbar .bar.color3 {
  160. background: #61c1bb;
  161. box-shadow: 0 0 7px 0 #44b6af, 0 1px 0 0 rgba(255, 255, 255, 0.45),
  162. 1px 0 0 0 rgba(255, 255, 255, 0.25), -1px 0 0 0 rgba(255, 255, 255, 0.25);
  163. }
  164. .progressbar .bar.color4 {
  165. background: #186de2;
  166. box-shadow: 0 0 12px 0 #186de2, inset 0 1px 0 0 rgba(255, 255, 255, 0.45),
  167. inset 1px 0 0 0 rgba(255, 255, 255, 0.25), inset -1px 0 0 0 rgba(255, 255, 255, 0.25);
  168. }
  169. .progressbar .bar:before {
  170. position: absolute;
  171. display: block;
  172. content: '';
  173. width: 606px;
  174. height: 150%;
  175. top: -25%;
  176. left: -25px;
  177. }
  178. .progressbar .bar:after {
  179. position: absolute;
  180. display: block;
  181. content: '';
  182. width: 64px;
  183. height: 16px;
  184. right: 0;
  185. top: 0;
  186. border-radius: 0 16px 16px 0;
  187. }
  188. .label.la-top code,
  189. .progressbar .label {
  190. display: flex;
  191. align-items: center;
  192. }
  193. .progressbar .label {
  194. font-family: aldrich, sans-serif;
  195. position: relative;
  196. width: 100%;
  197. height: 30px;
  198. line-height: 30px;
  199. bottom: 40px;
  200. left: 0;
  201. background: #fff;
  202. font-weight: 700;
  203. font-size: 12px;
  204. color: #515a6e;
  205. }
  206. .label.la-top code {
  207. position: absolute;
  208. right: 0;
  209. top: 6px;
  210. }
  211. .traffic-info {
  212. margin-top: 6px;
  213. margin-right: 10px;
  214. }
  215. .progressbar-card {
  216. background: #fff;
  217. display: flex;
  218. align-items: center;
  219. }
  220. @keyframes mymove {
  221. 0% {
  222. transform: translateX(0px);
  223. opacity: 0.5;
  224. }
  225. 10% {
  226. transform: translateX(5px);
  227. opacity: 1;
  228. }
  229. 20% {
  230. transform: translateX(20px);
  231. opacity: 0.5;
  232. }
  233. 30% {
  234. transform: translateX(30px);
  235. opacity: 1;
  236. }
  237. 40% {
  238. transform: translateX(40px);
  239. opacity: 0.5;
  240. }
  241. 50% {
  242. transform: translateX(50px);
  243. opacity: 1;
  244. }
  245. 60% {
  246. transform: translateX(60px);
  247. opacity: 0.6;
  248. }
  249. 70% {
  250. transform: translateX(70px);
  251. opacity: 1;
  252. }
  253. 80% {
  254. transform: translateX(80px);
  255. opacity: 0.4;
  256. }
  257. 90% {
  258. transform: translateX(90px);
  259. opacity: 1;
  260. }
  261. 100% {
  262. transform: translateX(100px);
  263. opacity: 0.52;
  264. }
  265. }
  266. @-webkit-keyframes mymove /*Safari and Chrome*/ {
  267. 0% {
  268. transform: translateX(0px);
  269. opacity: 0.5;
  270. }
  271. 10% {
  272. transform: translateX(5px);
  273. opacity: 1;
  274. }
  275. 20% {
  276. transform: translateX(20px);
  277. opacity: 0.5;
  278. }
  279. 30% {
  280. transform: translateX(30px);
  281. opacity: 1;
  282. }
  283. 40% {
  284. transform: translateX(40px);
  285. opacity: 0.5;
  286. }
  287. 50% {
  288. transform: translateX(50px);
  289. opacity: 1;
  290. }
  291. 60% {
  292. transform: translateX(60px);
  293. opacity: 0.6;
  294. }
  295. 70% {
  296. transform: translateX(70px);
  297. opacity: 1;
  298. }
  299. 80% {
  300. transform: translateX(80px);
  301. opacity: 0.4;
  302. }
  303. 90% {
  304. transform: translateX(90px);
  305. opacity: 1;
  306. }
  307. 100% {
  308. transform: translateX(100px);
  309. opacity: 0.52;
  310. }
  311. }
  312. .indexys {
  313. width: 30px;
  314. height: 30px;
  315. border-radius: 50%;
  316. position: absolute;
  317. color: #fff;
  318. padding-left: 10px;
  319. }
  320. .indexywc {
  321. background-color: #e5c319;
  322. }
  323. .indexjxz {
  324. background-color: #45b6af;
  325. }
  326. .indexwwc {
  327. background-color: #515a6e;
  328. }
  329. .ztinfo {
  330. margin-left: 35px;
  331. }
  332. </style>