Card.vue 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. <template>
  2. <div class="card" :class="{ 'reverse': isBack, 'captain': isSelect }" @click="onReverse">
  3. <div class="front">{{card.text}}</div>
  4. <div class="back" :style="backColor">{{card.text}}</div>
  5. </div>
  6. </template>
  7. <script>
  8. import http from '@/http'
  9. export default {
  10. name: 'card',
  11. props: {
  12. card: {
  13. type: Object,
  14. default: () => ({
  15. text: '',
  16. status: 0,
  17. group: 0
  18. })
  19. },
  20. index: {
  21. type: Number,
  22. default: 0
  23. },
  24. isCaptain: {
  25. type: Boolean,
  26. default: false
  27. },
  28. winner: {
  29. type: String,
  30. default: ''
  31. }
  32. },
  33. data() {
  34. return {
  35. // isBack: false
  36. }
  37. },
  38. computed: {
  39. backColor() {
  40. const group = this.card.group
  41. let color = ''
  42. switch (group) {
  43. case 0:
  44. color = '#888'
  45. break
  46. case 1:
  47. color = '#409EFF'
  48. break
  49. case 2:
  50. color = 'red'
  51. break
  52. default:
  53. color = '#000'
  54. }
  55. return {
  56. backgroundColor: color
  57. }
  58. },
  59. isBack() {
  60. if (this.isCaptain) {
  61. return 1
  62. }
  63. const status = this.card.status
  64. return status !== 0
  65. },
  66. isSelect() {
  67. if (!this.isCaptain) return false
  68. if (this.card.status !== 0) return true
  69. return false
  70. }
  71. },
  72. methods: {
  73. async onReverse() {
  74. const { index, isCaptain, winner } = this
  75. const code = this.$store.getters.code
  76. if (!code || isCaptain || winner) return
  77. const { success, data = {} } = await http.put(`/api/status/${code}`, { index })
  78. if (success) {
  79. this.$emit('statusChange', index, data.status)
  80. }
  81. }
  82. }
  83. }
  84. </script>
  85. <style lang="scss" scoped>
  86. .card {
  87. position: relative;
  88. color: #fff;
  89. width: 100%;
  90. height: 100%;
  91. &.reverse {
  92. .front {
  93. transform: rotateY(180deg);
  94. }
  95. .back {
  96. transform: rotateY(360deg);
  97. }
  98. }
  99. &.captain {
  100. .back {
  101. filter: brightness(0.5) blur(1px);
  102. }
  103. }
  104. .front, .back {
  105. position: absolute;
  106. top: 0;
  107. left: 0;
  108. width: 100%;
  109. height: 100%;
  110. backface-visibility: hidden;
  111. transition: 1s;
  112. background-position: center;
  113. background-repeat: no-repeat;
  114. background-size: cover;
  115. display: flex;
  116. justify-content: center;
  117. align-items: center;
  118. font-size: 40px;
  119. }
  120. @media screen and (max-width: 800px) {
  121. .front, .back {
  122. font-size: 20px;
  123. }
  124. }
  125. .front {
  126. z-index: 2;
  127. /* background-image: url('./scape.jpg'); */
  128. color: #333;
  129. background-color: #fff;
  130. border: 1px solid #ddd;
  131. /* box-shadow: 0 0 6px 3px #ddd; */
  132. }
  133. .back {
  134. transform: rotateY(180deg);
  135. z-index: 1;
  136. border: 1px solid #ddd;
  137. /* background-image: url('./scape1.jpg') */
  138. }
  139. }
  140. </style>