经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » HTML/CSS » HTML5 » 查看文章
实现 3D 时间动画展示效果
来源:cnblogs  作者:python之恋  时间:2021/3/8 11:49:56  对本文有异议

搭建舞台

  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. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <title>Document</title>
  8. <style type="text/css">
  9. html,
  10. body {
  11. width: 100%;
  12. height: 100%;
  13. background-color: #000;
  14. overflow: hidden;
  15. }
  16. /* 设置视距1000px 子元素在3D中变换 */
  17. .preserve {
  18. transform-style: preserve-3d;
  19. perspective: 1000px;
  20. }
  21. /* 容器 */
  22. .container {
  23. position: relative;
  24. margin-top: 10vh;
  25. text-align: center;
  26. /* animation: rotateReverse 10s infinite linear; */
  27. }
  28. /* 舞台 */
  29. .stage {
  30. transform: rotateX(10deg) rotateZ(0);
  31. /* animation: rotate 10s infinite linear; */
  32. }
  33. /* 数字样式 */
  34. .number {
  35. position: relative;
  36. width: 3vw;
  37. height: 12vw;
  38. display: inline-block;
  39. margin: 3vw 3vw 0 0;
  40. }
  41. .line {
  42. position: absolute;
  43. top: 0;
  44. left: 0;
  45. width: 3vw;
  46. height: 2px;
  47. background: #181919;
  48. }
  49. .line::before,
  50. .line::after {
  51. content: "";
  52. position: absolute;
  53. top: 0;
  54. width: 50%;
  55. height: 100%;
  56. background-color: #34eabc;
  57. box-shadow: 0 0 1vw #0bfdfd, inset 0 0 0.125vmin #0bfdfd;
  58. }
  59. .line::before {
  60. left: 0;
  61. transition: all 0.5s ease-in;
  62. }
  63. .line::after {
  64. right: 0;
  65. transition: all 0.5s ease-out;
  66. }
  67. /* 计算每根线的位置 */
  68. .line:nth-child(1) {
  69. top: -0.2vw;
  70. }
  71. .line:nth-child(2) {
  72. top: 3.2vw;
  73. }
  74. .line:nth-child(3) {
  75. top: 6.6vw;
  76. }
  77. .line:nth-child(4) {
  78. transform: rotate(90deg) translateY(0.2vw);
  79. /* 设置 旋转中心为 最左边 元素中点 */
  80. transform-origin: 0 center;
  81. }
  82. .line:nth-child(5) {
  83. transform: rotate(-90deg) translateY(0.2vw);
  84. /* 设置 旋转中心为 最右边 元素中点 */
  85. transform-origin: 100% center;
  86. }
  87. .line:nth-child(6) {
  88. top: 3.4vw;
  89. transform: rotate(90deg) translateY(0.2vw);
  90. transform-origin: 0 center;
  91. }
  92. .line:nth-child(7) {
  93. top: 3.4vw;
  94. transform: rotate(-90deg) translateY(0.2vw);
  95. transform-origin: 100% center;
  96. }
  97. /* 减少我们的距离 实现阴影效果 */
  98. .translate::before,
  99. .translate::after {
  100. transform: translateZ(50px);
  101. }
  102. </style>
  103. </head>
  104. <body>
  105. <div class="container preserve">
  106. <div class="stage preserve">
  107. <div class="number preserve">
  108. <div class="line preserve translate"></div>
  109. <div class="line preserve translate"></div>
  110. <div class="line preserve translate"></div>
  111. <div class="line preserve translate"></div>
  112. <div class="line preserve translate"></div>
  113. <div class="line preserve translate"></div>
  114. <div class="line preserve translate"></div>
  115. </div>
  116. </div>
  117. </div>
  118. </body>
  119. </html>
  120. 复制代码
  • 确认组成数字需要多少个块元素
  • 使用伪元素和元素的颜色差,让伪元素向我们的方向移动,实现影子效果。
  • 使用transform属性,计算每一个块元素的位置组成一个数字。

添加数字变换动画

  1. ...
  2. .number[data-digit="1"] .line:nth-child(1)::before,
  3. .number[data-digit="1"] .line:nth-child(1)::after,
  4. .number[data-digit="1"] .line:nth-child(2)::before,
  5. .number[data-digit="1"] .line:nth-child(2)::after,
  6. .number[data-digit="1"] .line:nth-child(3)::before,
  7. .number[data-digit="1"] .line:nth-child(3)::after,
  8. .number[data-digit="1"] .line:nth-child(4)::before,
  9. .number[data-digit="1"] .line:nth-child(4)::after,
  10. .number[data-digit="1"] .line:nth-child(6)::before,
  11. .number[data-digit="1"] .line:nth-child(6)::after,
  12. .number[data-digit="2"] .line:nth-child(4)::before,
  13. .number[data-digit="2"] .line:nth-child(4)::after,
  14. .number[data-digit="2"] .line:nth-child(7)::before,
  15. .number[data-digit="2"] .line:nth-child(7)::after,
  16. .number[data-digit="3"] .line:nth-child(4)::before,
  17. .number[data-digit="3"] .line:nth-child(4)::after,
  18. .number[data-digit="3"] .line:nth-child(6)::before,
  19. .number[data-digit="3"] .line:nth-child(6)::after,
  20. .number[data-digit="4"] .line:nth-child(1)::before,
  21. .number[data-digit="4"] .line:nth-child(1)::after,
  22. .number[data-digit="4"] .line:nth-child(3)::before,
  23. .number[data-digit="4"] .line:nth-child(3)::after,
  24. .number[data-digit="4"] .line:nth-child(6)::before,
  25. .number[data-digit="4"] .line:nth-child(6)::after,
  26. .number[data-digit="5"] .line:nth-child(5)::before,
  27. .number[data-digit="5"] .line:nth-child(5)::after,
  28. .number[data-digit="5"] .line:nth-child(6)::before,
  29. .number[data-digit="5"] .line:nth-child(6)::after,
  30. .number[data-digit="6"] .line:nth-child(5)::before,
  31. .number[data-digit="6"] .line:nth-child(5)::after,
  32. .number[data-digit="7"] .line:nth-child(2)::before,
  33. .number[data-digit="7"] .line:nth-child(2)::after,
  34. .number[data-digit="7"] .line:nth-child(3)::before,
  35. .number[data-digit="7"] .line:nth-child(3)::after,
  36. .number[data-digit="7"] .line:nth-child(4)::before,
  37. .number[data-digit="7"] .line:nth-child(4)::after,
  38. .number[data-digit="7"] .line:nth-child(6)::before,
  39. .number[data-digit="7"] .line:nth-child(6)::after,
  40. .number[data-digit="9"] .line:nth-child(6)::before,
  41. .number[data-digit="9"] .line:nth-child(6)::after,
  42. .number[data-digit="0"] .line:nth-child(2)::before,
  43. .number[data-digit="0"] .line:nth-child(2)::after {
  44. transform: translateZ(25px);
  45. background: #3c4444;
  46. box-shadow: 0 0 1vw #425454;
  47. }
  48. ...
  49. <script type="text/javascript">
  50. (function () {
  51. let numbers = document.getElementsByClassName("number")
  52. setInterval(() => {
  53. Array.prototype.slice.call(numbers).forEach((key) => {
  54. key.setAttribute("data-digit",parseInt(Math.random() * 9));
  55. });
  56. }, 1000);
  57. })()
  58. </script>
  59. ...
  60. 复制代码
  • 使用transition属性line::before和line::after设置过度动画。
  • 通过css属性选择器,获取自定义属性的值。通过变换的值来设置在不同数字下,哪些块需要改变。
  • 使用js修改自定义属性的值。

加入时间

  1. ...
  2. .colon{
  3. position: relative;
  4. display: inline-block;
  5. width: 2vw;
  6. height: 12vw;
  7. margin: 1vw 2vw 0 0;
  8. animation:colonFra 1s linear infinite ;
  9. }
  10. .colon::before {
  11. content: "";
  12. position: absolute;
  13. top: 0;
  14. left: 0;
  15. width: 1vw;
  16. height: 1vw;
  17. background-color: #34eabc;
  18. border-radius: 50%;
  19. }
  20. .colon::after {
  21. content: "";
  22. position: absolute;
  23. top: 4vw;
  24. left: 0;
  25. width: 1vw;
  26. height: 1vw;
  27. background-color: #34eabc;
  28. border-radius: 50%;
  29. }
  30. .colonS{
  31. left: -1.3vw;
  32. }
  33. .colonF{
  34. left: 1vw;
  35. }
  36. @keyframes colonFra {
  37. 0% {
  38. opacity: 0;
  39. }
  40. 100% {
  41. opacity: 1;
  42. }
  43. }
  44. ...
  45. <div class="number preserve" data-digit="0">
  46. <div class="line preserve translate"></div>
  47. <div class="line preserve translate"></div>
  48. <div class="line preserve translate"></div>
  49. <div class="line preserve translate"></div>
  50. <div class="line preserve translate"></div>
  51. <div class="line preserve translate"></div>
  52. <div class="line preserve translate"></div>
  53. </div>
  54. <div class="colon preserve colonS"></div>
  55. <div class="number preserve" data-digit="0">
  56. <div class="line preserve translate"></div>
  57. <div class="line preserve translate"></div>
  58. <div class="line preserve translate"></div>
  59. <div class="line preserve translate"></div>
  60. <div class="line preserve translate"></div>
  61. <div class="line preserve translate"></div>
  62. <div class="line preserve translate"></div>
  63. </div>
  64. <div class="number preserve" data-digit="0">
  65. <div class="line preserve translate"></div>
  66. <div class="line preserve translate"></div>
  67. <div class="line preserve translate"></div>
  68. <div class="line preserve translate"></div>
  69. <div class="line preserve translate"></div>
  70. <div class="line preserve translate"></div>
  71. <div class="line preserve translate"></div>
  72. </div>
  73. <div class="colon preserve colonF"></div>
  74. <div class="number preserve" data-digit="0">
  75. <div class="line preserve translate"></div>
  76. <div class="line preserve translate"></div>
  77. <div class="line preserve translate"></div>
  78. <div class="line preserve translate"></div>
  79. <div class="line preserve translate"></div>
  80. <div class="line preserve translate"></div>
  81. <div class="line preserve translate"></div>
  82. </div>
  83. <div class="number preserve" data-digit="0">
  84. <div class="line preserve translate"></div>
  85. <div class="line preserve translate"></div>
  86. <div class="line preserve translate"></div>
  87. <div class="line preserve translate"></div>
  88. <div class="line preserve translate"></div>
  89. <div class="line preserve translate"></div>
  90. <div class="line preserve translate"></div>
  91. </div>
  92. ...
  93. <script type="text/javascript">
  94. function time(){
  95. let timeTem = new Date();
  96. let a = timeTem.getHours().toString().substring(0,1);
  97. let b = timeTem.getHours().length > 1 ? 0 : timeTem.getHours().toString().substring(1,2);
  98. let c = timeTem.getMinutes().toString().substring(0,1);
  99. let d = timeTem.getMinutes().length > 1 ? 0 : timeTem.getMinutes().toString().substring(1,2);
  100. let e = timeTem.getSeconds().toString().substring(0,1);
  101. let f = timeTem.getSeconds().length > 1 ? 0 : timeTem.getSeconds().toString().substring(1,2);
  102. return [a,b,c,d,e,f]
  103. }
  104. (function () {
  105. let numbers = document.getElementsByClassName("number")
  106. setInterval(() => {
  107. let arr = time();
  108. Array.prototype.slice.call(numbers).forEach((key,index) => {
  109. key.setAttribute("data-digit",arr[index]);
  110. });
  111. }, 1000);
  112. })()
  113. </script>
  114. 复制代码
  • 先定义时分秒钟的,间隔。
  • 使用js获取当前时间,依次修改自定义变量的值。

 

本文首发于前端黑洞网,博客园同步跟新

原文链接:http://www.cnblogs.com/pythonzhilian/p/14496909.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号