自主产品,供应链食堂系统。将两个端拆开了。
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
2.6 KiB

  1. <template>
  2. <image
  3. :class="{'loading': loading}"
  4. :data-loading-text="loadingText"
  5. :src="img_src"
  6. :mode="mode"
  7. :lazy-load="true"
  8. @click="click"
  9. @load="load"
  10. @error="error">
  11. </image>
  12. </template>
  13. <script>
  14. export default {
  15. props: {
  16. src: {
  17. type: String,
  18. default: ''
  19. },
  20. mode: {
  21. type: String,
  22. default: 'scaleToFill'
  23. },
  24. errSrc: {
  25. type: String,
  26. default: '../../static/images/empty.png'
  27. },
  28. loadingText: {
  29. type: String,
  30. default: '正在加载中'
  31. }
  32. },
  33. data(){
  34. return {
  35. img_src: this.src,
  36. loading: true
  37. }
  38. },
  39. methods: {
  40. load(event){
  41. this.loading = false;
  42. },
  43. error(event){
  44. this.loading = false;
  45. this.img_src = this.$props.errSrc;
  46. },
  47. click(event){
  48. this.$emit('click', event);
  49. }
  50. }
  51. }
  52. </script>
  53. <style lang="scss" scoped="scoped">
  54. image{
  55. width: 100%;
  56. height: 100%;
  57. }
  58. .loading{
  59. position: relative;
  60. // background-color: #e5e5e5;
  61. background: linear-gradient(-45deg, #e5e5e5, #d9d9d9, #f1f3f5, #f0f0f0);
  62. animation: gradientBG 15s ease infinite;
  63. background-size: 400% 400%;
  64. transition: all 1s;
  65. &::after{
  66. content: attr(data-loading-text);
  67. position: absolute;
  68. top: 0;
  69. right: 0;
  70. bottom: 0;
  71. left: 0;
  72. color: #969696;
  73. font-size: 20rpx;
  74. display: flex;
  75. justify-content: center;
  76. align-items: center;
  77. flex-wrap: wrap;
  78. animation: flicker-in-1 2s linear both infinite;
  79. transition: all 2s;
  80. }
  81. }
  82. @keyframes gradientBG {
  83. 0% {
  84. background-position: 0% 50%;
  85. }
  86. 50% {
  87. background-position: 100% 50%;
  88. }
  89. 100% {
  90. background-position: 0% 50%;
  91. }
  92. }
  93. @keyframes flicker-in-1 {
  94. 0% {
  95. opacity: 0.5;
  96. }
  97. 10% {
  98. opacity: 0.5;
  99. }
  100. 10.1% {
  101. opacity: 1;
  102. }
  103. 10.2% {
  104. opacity: 0.5;
  105. }
  106. 20% {
  107. opacity: 0.5;
  108. }
  109. 20.1% {
  110. opacity: 1;
  111. }
  112. 20.6% {
  113. opacity: 0.5;
  114. }
  115. 30% {
  116. opacity: 0.5;
  117. }
  118. 30.1% {
  119. opacity: 1;
  120. }
  121. 30.5% {
  122. opacity: 1;
  123. }
  124. 30.6% {
  125. opacity: 0.5;
  126. }
  127. 45% {
  128. opacity: 0.5;
  129. }
  130. 45.1% {
  131. opacity: 1;
  132. }
  133. 50% {
  134. opacity: 1;
  135. }
  136. 55% {
  137. opacity: 1;
  138. }
  139. 55.1% {
  140. opacity: 0.5;
  141. }
  142. 57% {
  143. opacity: 0.5;
  144. }
  145. 57.1% {
  146. opacity: 1;
  147. }
  148. 60% {
  149. opacity: 1;
  150. }
  151. 60.1% {
  152. opacity: 0.5;
  153. }
  154. 65% {
  155. opacity: 0.5;
  156. }
  157. 65.1% {
  158. opacity: 1;
  159. }
  160. 75% {
  161. opacity: 1;
  162. }
  163. 75.1% {
  164. opacity: 0.5;
  165. }
  166. 77% {
  167. opacity: 0.5;
  168. }
  169. 77.1% {
  170. opacity: 1;
  171. }
  172. 85% {
  173. opacity: 1;
  174. }
  175. 85.1% {
  176. opacity: 0.5;
  177. }
  178. 86% {
  179. opacity: 0.5;
  180. }
  181. 86.1% {
  182. opacity: 1;
  183. }
  184. 100% {
  185. opacity: 1;
  186. }
  187. }
  188. </style>