js和css3实现动态魔方的效果

我会带着你远行 2023-10-11 16:27 78阅读 0赞

js和css3实现动态魔方的效果

  • 实现效果
  • 实现代码

实现效果

  • 静态效果

在这里插入图片描述

  • 动态效果

在这里插入图片描述

实现代码

  • 思路

1.构建静态魔方

首先设置css属性transform-style为preserve-3d,让元素位于3d空间中。然后使用css3中的平移和旋转对每个面分别操作来构建出立体魔方,最后使用js来给每个面设置背景图(注意:魔方用到的6张图片都存放在img目录下,并且需要统一命名为a0,a1…a5,方便遍历)。
2.动态魔方
使用css3的animation设置动画。

  • 完整代码

    <!DOCTYPE html>

    1. <title>魔方</title>
    2. <meta charset="utf-8">
    3. <style type="text/css">
    4. *{
    5. margin: 0;
    6. padding: 0;
    7. }
    8. body{
    9. width: 100%;
    10. height: 100%;
    11. background: radial-gradient(#fff, red);
    12. }
    13. .container{
    14. width:300px;
    15. height:300px;
    16. margin:200px auto;
    17. perspective:20000px;
    18. }
    19. .box{
    20. width:300px;
    21. height:300px;
    22. border:1px solid transparent;
    23. box-sizing: border-box;
    24. position:relative;
    25. transform-style:preserve-3d;
    26. /*transform:rotateX(30deg) rotateY(30deg);*/
    27. animation: rotate 10s linear infinite;
    28. }
    29. @keyframes rotate{
    30. 100%{
    31. transform:rotatex(360deg) rotatey(360deg) rotatez(360deg);
    32. }
    33. }
    34. .box-page{
    35. width: 300px;
    36. height: 300px;
    37. position:absolute;
    38. box-sizing: border-box;
    39. transform-style:preserve-3d;
    40. }
  1. .top{
  2. transform: translateZ(150px);
  3. }
  4. .bottom{
  5. transform: translateZ(-150px) rotateX(180deg);
  6. }
  7. .right{
  8. transform: translateX(150px) rotateY(90deg);
  9. }
  10. .left{
  11. transform: translateX(-150px) rotateY(-90deg);
  12. }
  13. .after{
  14. transform: translateY(-150px) rotateX(90deg);
  15. }
  16. .before{
  17. transform: translateY(150px) rotateX(-90deg);
  18. }
  19. .box-page div:first-child,.box-page div:nth-child(3),.box-page div:nth-child(5),.box-page div:nth-child(7),.box-page div:nth-child(9){
  20. transform: rotateY(0deg);
  21. animation: rotatey 6s linear infinite;
  22. }
  23. @keyframes rotatey{
  24. 20%{
  25. transform: rotateY(0deg);
  26. background-size: 300px 300px;
  27. }
  28. 40%{
  29. /*background-image: url("img/img.jpg");*/
  30. transform: rotateY(540deg);
  31. background-size: 100px 100px;
  32. }
  33. 60%{
  34. /*background-image: url("img/img.jpg");*/
  35. transform: rotateY(540deg);
  36. background-size: 100px 100px;
  37. }
  38. 80%{
  39. transform: rotateY(0deg);
  40. background-size:300px 300px;
  41. }
  42. }
  43. .box-page div:nth-child(2),.box-page div:nth-child(4),.box-page div:nth-child(6),.box-page div:nth-child(8){
  44. transform:rotateX(0deg);
  45. animation: rotatex 6s linear infinite;
  46. }
  47. @keyframes rotatex{
  48. 20%{
  49. transform: rotateX(0deg);
  50. background-size: 300px 300px;
  51. }
  52. 40%{
  53. /*background-image: url("img/img.jpg");*/
  54. transform: rotateX(540deg);
  55. background-size: 100px 100px;
  56. }
  57. 60%{
  58. /*background-image: url("img/img.jpg");*/
  59. transform: rotateX(540deg);
  60. background-size: 100px 100px;
  61. }
  62. 80%{
  63. transform: rotateX(0deg);
  64. background-size: 300px 300px;
  65. }
  66. }
  67. </style>
  68. </head>
  69. <body>
  70. <div class="container">
  71. <div class="box">
  72. <div class="top box-page"></div>
  73. <div class="bottom box-page"></div>
  74. <div class="left box-page"></div>
  75. <div class="right box-page"></div>
  76. <div class="before box-page"></div>
  77. <div class="after box-page"></div>
  78. </div>
  79. </div>
  80. <script type="text/javascript">
  81. var arr = document.querySelectorAll(".box>div");
  82. for(var n = 0;n<arr.length;n++){
  83. for(var i=0;i<3;i++){
  84. for(var j=0;j<3;j++){
  85. var divs = document.createElement("div");
  86. divs.style.cssText = "width:100px;height:100px;border: 1px solid #fff;position:absolute;box-sizing:border-box;background-image:url(img/a"+n+".jpg);background-size: 300px 300px;";
  87. arr[n].appendChild(divs);
  88. // 改变每一个div的位置
  89. divs.style.left = 100*j+"px";
  90. divs.style.top = 100*i+"px";
  91. // 改变背景图相应的位置
  92. divs.style.backgroundPositionX = -j*100+"px";
  93. divs.style.backgroundPositionY = -i*100+"px";
  94. }
  95. }
  96. }
  97. </script>
  98. </body>
  99. </html>

发表评论

表情:
评论列表 (有 0 条评论,78人围观)

还没有评论,来说两句吧...

相关阅读