最小翻牌demo

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="ie=edge" />
  6. <title>Document</title>
  7. <style>
  8. /* 简单样式声明,可忽略 */
  9. * {
  10. margin: 0;
  11. padding: 0;
  12. }
  13. .card-style {
  14. margin: 0 auto;
  15. width: 100px;
  16. height: 200px;
  17. border-left: 3px solid salmon;
  18. border-bottom: 3px solid salmon;
  19. border-top: 3px solid yellow;
  20. border-right: 3px solid yellow;
  21. color: #fff;
  22. }
  23. /* 简单样式声明结束 */
  24. .card {
  25. position: relative;
  26. transition: transform 0.5s linear;
  27. transform-style: preserve-3d;
  28. }
  29. .transform {
  30. transform: rotateY(180deg);
  31. }
  32. .front {
  33. position: absolute;
  34. top: 0;
  35. right: 0;
  36. bottom: 0;
  37. left: 0;
  38. background: #888;
  39. backface-visibility: hidden;
  40. }
  41. .end {
  42. position: absolute;
  43. top: 0;
  44. right: 0;
  45. bottom: 0;
  46. left: 0;
  47. background: seagreen;
  48. transform: rotateY(-180deg);
  49. backface-visibility: hidden;
  50. }
  51. </style>
  52. </head>
  53. <body>
  54. <div class="card card-style">
  55. card
  56. <div class="front"></div>
  57. <div class="end"></div>
  58. </div>
  59. <script>
  60. // 最小化demo
  61. // 一张牌,翻牌+移动
  62. const card = document.querySelector('.card')
  63. card.addEventListener('click', function() {
  64. if (card.className.match('transform')) {
  65. card.classList.remove('transform')
  66. } else {
  67. card.classList.add('transform')
  68. }
  69. })
  70. </script>
  71. </body>
  72. </html>

点击查看【codepen】

原理分析

  • 主要翻转效果实现:
    • 点击时给父元素添加 transform: rotateY(180deg);
    • 父元素设置初始值 transform-style: preserve-3d; 设置元素的子元素是位于3d空间中,所以上面的元素会遮盖下面的元素。transform-style(MDN)
    • 背面的元素设置初始值 transform: rotate(-180deg);
    • 父元素设置 transition
    • 当父元素进行180度的翻转时,背面元素被置于正面位置,因为元素处于3d空间内,所以会遮盖掉当前翻转到背面的正面元素,从而形成翻牌效果。
  • 让翻转效果更自然:
    • backface-visibility: hidden; 设置当元素背向观察者时不可见。并且切换可见性的时机为 rotate(90deg) 的时候。backface-visibility(MDN)
    • 如果仅用主要翻转效果实现,那么切换翻牌卡面的时机会是翻转结束时,也就是 rotate(180deg) 并且 transition 完成时,变化滞后,体验不好。
    • 配合 backface-visibility ,切换时机会变为 rotate(90deg) 时