Spinner.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. <template lang="pug">
  2. .spinner
  3. .spinner-wave(v-if="type === 'wave'")
  4. .spinner-rect.spinner-rect-1
  5. .spinner-rect.spinner-rect-2
  6. .spinner-rect.spinner-rect-3
  7. .spinner-rect.spinner-rect-4
  8. .spinner-rect.spinner-rect-5
  9. .spinner-circle(v-if="type === 'circle'")
  10. .spinner-circle-1.spinner-child
  11. .spinner-circle-2.spinner-child
  12. .spinner-circle-3.spinner-child
  13. .spinner-circle-4.spinner-child
  14. .spinner-circle-5.spinner-child
  15. .spinner-circle-6.spinner-child
  16. .spinner-circle-7.spinner-child
  17. .spinner-circle-8.spinner-child
  18. .spinner-circle-9.spinner-child
  19. .spinner-circle-10.spinner-child
  20. .spinner-circle-11.spinner-child
  21. .spinner-circle-12.spinner-child
  22. </template>
  23. <script>
  24. export default {
  25. props: {
  26. type: String,
  27. default: 'wave'
  28. }
  29. }
  30. </script>
  31. <style lang="sass">
  32. @import '../../assets/variables'
  33. .spinner
  34. .spinner-wave
  35. $rect-count: 5
  36. $animation-duration: 1000ms
  37. $delay-range: 400ms
  38. width: 50px
  39. height: 40px
  40. text-align: center
  41. font-size: 10px
  42. margin: 40px auto
  43. .spinner-rect
  44. width: 5px
  45. height: 100%
  46. background: $app-main-color
  47. margin: 0 3px 0 0
  48. display: inline-block
  49. animation: spinner-rect-wave $animation-duration infinite ease-in-out
  50. @for $i from 1 through $rect-count
  51. .spinner-rect-#{$i}
  52. animation-delay: - $animation-duration + $delay-range / ($rect-count - 1) * ($i - 1)
  53. .spinner-circle
  54. $circle-count: 12
  55. $animation-duration: 1200ms
  56. margin: 40px auto
  57. width: 40px
  58. height: 40px
  59. position: relative
  60. .spinner-child
  61. width: 100%
  62. height: 100%
  63. position: absolute
  64. left: 0
  65. top: 0
  66. .spinner-child:before
  67. content: ''
  68. display: block
  69. margin: 0 auto
  70. width: 15%
  71. height: 15%
  72. background: $app-main-color
  73. border-radius: 100%
  74. animation: spinner-circle-bounce $animation-duration infinite ease-in-out both
  75. @for $i from 2 through $circle-count
  76. .spinner-circle#{$i}
  77. transform: rotate(360deg / $circle-count * ($i - 1))
  78. .spinner-circle#{$i}:before
  79. animation-delay: - $animation-duration + $animation-duration / $circle-count * ($i - 1)
  80. @keyframes spinner-rect-wave
  81. 0%, 40%, 100%
  82. transform: scaleY(0.4)
  83. 20%
  84. transform: scaleY(1.0)
  85. @keyframes spinner-circle-bounce
  86. 0%, 80%, 100%
  87. transform: scale(0)
  88. 40%
  89. transform: scale(1.0)
  90. </style>