• css-实现卡牌的发牌和翻转动画


    场景描述:

    打开抽卡界面,卡牌出现并发牌至固定的位置,此时展示的是卡牌的背面;用户点击卡牌时,卡牌进行翻转,并展示卡牌内容,或者发牌后自动进行翻转和展示。

    本实例在页面挂载后自动播放动画,若需点击后再播放,只需将事件写入click事件当中即可

    卡牌样式可根据具体需求设置

    实现思路:

    html结构:

    动态设置class属性,即可实现动态的css样式及动画

     翻牌动画在挂载后自动执行,

     //数组中存入index值时,将写有动画的class属性赋给标签,即开始播放动画
        //自动播放翻牌动画,1500ms后播放第一张翻牌动画,然后每200ms播放一张
        for (let i = 0; i < 6; i++) {
          setTimeout(() => {
            this.selectArr.push(i);
          }, 1500 + (i - 1) * 200);
        }

     给每个卡牌进行定位,页面加载后执行相应的发牌和翻牌动画,

    若翻牌动画欲设置为点击后翻牌,在methods中定义方法,并给包含卡牌正面和反面的标签父元素设置@click事件:@click=rotateCard(index)

      methods: {

        rotateCard(index) {

        this.selectArr.push(index);

        },

      },

    完整代码如下:

    1. <script>
    2. export default {
    3. data() {
    4. return {
    5. drawList:5,
    6. selectArr: [],
    7. };
    8. },
    9. mounted() {
    10. //数组中存入index值时,将写有动画的class属性赋给标签,即开始播放动画
    11. //自动播放翻牌动画,1500ms后播放第一张翻牌动画,然后每200ms播放一张
    12. for (let i = 0; i < 6; i++) {
    13. setTimeout(() => {
    14. this.selectArr.push(i);
    15. }, 1500 + (i - 1) * 200);
    16. }
    17. },
    18. };
    19. script>
    20. <style>
    21. /* 每张卡牌属性 */
    22. .card-item {
    23. width: 212rpx;
    24. height: 252rpx;
    25. margin: 10rpx;
    26. border-radius: 10px;
    27. /* 文字居中 */
    28. line-height:252rpx;
    29. text-align: center;
    30. }
    31. /* 翻转前 */
    32. .card-item .card {
    33. width: 212rpx;
    34. height: 252rpx;
    35. border-radius: 10px;
    36. backface-visibility: hidden;
    37. background-color: aliceblue;
    38. }
    39. /* 翻转后 */
    40. .card-item .contxt {
    41. width: 212rpx;
    42. height: 252rpx;
    43. border-radius: 10px;
    44. backface-visibility: hidden;
    45. /* 定位于和翻转前相同的位置 */
    46. position: relative;
    47. top: -252rpx;
    48. left: 0;
    49. /* Y轴翻转180°,成卡牌效果*/
    50. transform: rotateY(180deg);
    51. opacity: 0;
    52. background-color: bisque;
    53. }
    54. /*将每个卡牌进行定位*/
    55. .card-item-1 {
    56. position: absolute;
    57. left: 20rpx;
    58. top: 200rpx;
    59. animation: issueCard1 1.5s;
    60. }
    61. .card-item-2 {
    62. position: absolute;
    63. left: 252rpx;
    64. top: 200rpx;
    65. animation: issueCard2 1.5s;
    66. }
    67. .card-item-3 {
    68. position: absolute;
    69. left: 484rpx;
    70. top: 200rpx;
    71. animation: issueCard3 1.5s;
    72. }
    73. .card-item-4 {
    74. position: absolute;
    75. left: 136rpx;
    76. top: 472rpx;
    77. animation: issueCard4 1.5s;
    78. }
    79. .card-item-5 {
    80. position: absolute;
    81. left: 368rpx;
    82. top: 472rpx;
    83. animation: issueCard5 1.5s;
    84. }
    85. /* 卡片翻牌 */
    86. /* 背面 */
    87. .cardAnimate {
    88. animation: rotetaCard 0.5s ease-in;
    89. animation-fill-mode: forwards;
    90. }
    91. /* 正面 */
    92. .contxtAnimate {
    93. animation: contxtRotate 0.5s ease-in;
    94. animation-fill-mode: forwards;
    95. }
    96. /* 正面卡牌翻牌动画 */
    97. @keyframes contxtRotate {
    98. from {
    99. transform: rotateY(180deg);
    100. opacity: 1;
    101. }
    102. to {
    103. transform: rotateY(0deg);
    104. opacity: 1;
    105. }
    106. }
    107. /* 背面卡牌翻牌动画 */
    108. @keyframes rotetaCard {
    109. from {
    110. transform: rotateY(0);
    111. }
    112. to {
    113. transform: rotateY(180deg);
    114. }
    115. }
    116. /* 每张卡牌发牌动画 */
    117. @keyframes issueCard1 {
    118. 0% {
    119. position: fixed;
    120. top: 750rpx;
    121. left: 269rpx;
    122. transform: scale(0);
    123. }
    124. 20% {
    125. transform: scale(1.2);
    126. }
    127. 40% {
    128. transform: scale(1);
    129. }
    130. 50% {
    131. position: fixed;
    132. top: 750rpx;
    133. left: 269rpx;
    134. transform: scale(1);
    135. }
    136. 60% {
    137. position: fixed;
    138. left: 20rpx;
    139. top: 200rpx;
    140. }
    141. 100% {
    142. }
    143. }
    144. @keyframes issueCard2 {
    145. 0% {
    146. position: fixed;
    147. top: 750rpx;
    148. left: 269rpx;
    149. transform: scale(0);
    150. }
    151. 20% {
    152. transform: scale(1.2);
    153. }
    154. 40% {
    155. transform: scale(1);
    156. }
    157. 50% {
    158. position: fixed;
    159. top: 750rpx;
    160. left: 269rpx;
    161. transform: scale(1);
    162. }
    163. 60% {
    164. position: fixed;
    165. top: 750rpx;
    166. left: 269rpx;
    167. transform: scale(1);
    168. }
    169. 70% {
    170. position: absolute;
    171. left: 252rpx;
    172. top: 200rpx;
    173. }
    174. 100% {
    175. }
    176. }
    177. @keyframes issueCard3 {
    178. 0% {
    179. position: fixed;
    180. top: 750rpx;
    181. left: 269rpx;
    182. transform: scale(0);
    183. }
    184. 20% {
    185. transform: scale(1.2);
    186. }
    187. 40% {
    188. transform: scale(1);
    189. }
    190. 50% {
    191. position: fixed;
    192. top: 750rpx;
    193. left: 269rpx;
    194. transform: scale(1);
    195. }
    196. 70% {
    197. position: fixed;
    198. top: 750rpx;
    199. left: 269rpx;
    200. transform: scale(1);
    201. }
    202. 80% {
    203. position: absolute;
    204. left: 484rpx;
    205. top: 200rpx;
    206. }
    207. 100% {
    208. }
    209. }
    210. @keyframes issueCard4 {
    211. 0% {
    212. position: fixed;
    213. top: 750rpx;
    214. left: 269rpx;
    215. transform: scale(0);
    216. }
    217. 20% {
    218. transform: scale(1.2);
    219. }
    220. 40% {
    221. transform: scale(1);
    222. }
    223. 50% {
    224. position: fixed;
    225. top: 750rpx;
    226. left: 269rpx;
    227. transform: scale(1);
    228. }
    229. 80% {
    230. position: fixed;
    231. top: 750rpx;
    232. left: 269rpx;
    233. transform: scale(1);
    234. }
    235. 90% {
    236. position: absolute;
    237. left: 136rpx;
    238. top: 472rpx;
    239. }
    240. 100% {
    241. }
    242. }
    243. @keyframes issueCard5 {
    244. 0% {
    245. position: fixed;
    246. top: 750rpx;
    247. left: 269rpx;
    248. transform: scale(0);
    249. }
    250. 20% {
    251. transform: scale(1.2);
    252. }
    253. 40% {
    254. transform: scale(1);
    255. }
    256. 50% {
    257. position: fixed;
    258. top: 750rpx;
    259. left: 269rpx;
    260. transform: scale(1);
    261. }
    262. 90% {
    263. position: fixed;
    264. top: 750rpx;
    265. left: 269rpx;
    266. transform: scale(1);
    267. }
    268. 100% {
    269. position: absolute;
    270. left: 368rpx;
    271. top: 472rpx;
    272. }
    273. }
    274. style>

  • 相关阅读:
    Java电子病历编辑器项目源码 采用B/S(Browser/Server)架构
    Python利用CMakeList.txt来编译C++程序
    1200*A. Flipping Game(前缀和)
    [HDLBits] Lfsr32
    TypeScript 中 type 和 interface 有什么区别?
    在一台电脑上安装多个python版本(小白教程)
    【JavaWeb】-- thymeleaf视图模板技术
    电影《万里归途》
    域登录缓存mscash
    Java转义工具类StringEscapeUtils的学习笔记
  • 原文地址:https://blog.csdn.net/m0_53206841/article/details/128019045