当前位置:   article > 正文

用HTML、CSS和JS打造绚丽的雪花飘落效果_html雪花飘落效果代码

html雪花飘落效果代码

目录

一、程序代码

二、代码原理

三、运行效果


一、程序代码

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=GBK">
  5. <style>
  6. * {
  7. margin: 0;
  8. padding: 0;
  9. }
  10. #box {
  11. width: 100vw;
  12. height: 100vh;
  13. padding: 3px;
  14. position: absolute;
  15. background: black;
  16. }
  17. </style>
  18. </head>
  19. <body>
  20. <div id="box">
  21. </div>
  22. </body>
  23. <script>
  24. (function () {
  25. var screenWidth = screen.availWidth; // 获取屏幕宽度
  26. var screenHeight = screen.availHeight; // 获取屏幕高度
  27. var speed = 1; // 雪花下落的速度
  28. function Snow(size, downSize) {
  29. this.box = document.getElementById("box"); // 获取容器元素
  30. this.size = size; // 雪花数量
  31. this.downSize = downSize || 10; // 每次落下的雪花数量,默认为10个
  32. this.item = []; // 雪花元素数组
  33. this.init(); // 初始化
  34. this.start(); // 开始下雪
  35. }
  36. // 获取相关随机数据的方法
  37. Snow.prototype.getRandomThings = function (type) {
  38. var res;
  39. if (type == 'left') { // 初始的left
  40. res = Math.round(Math.random() * (screenWidth - 30 - 10)) + 10; // 随机生成left值
  41. Math.random() > 0.8 ? (res = -res) : null; // 80%的概率使左边的雪花出现在左侧(left为负值)
  42. } else if (type == 'top') { // 初始的top
  43. res = -(Math.round(Math.random() * (50 - 40)) + 40); // 随机生成top值,负值使雪花在屏幕上方
  44. } else if (type == 'incre') { // 向下的速度
  45. res = Math.random() * (4 - 1) + 1; // 随机生成向下的速度
  46. } else if (type == 'increLeft') { // 向右的速度
  47. res = Math.random() * (0.8 - 0.5) + 0.5; // 随机生成向右的速度
  48. } else { // 雪花的大小
  49. res = Math.round(Math.random() * (30 - 10)) + 10; // 随机生成雪花的大小
  50. }
  51. return res;
  52. }
  53. Snow.prototype.init = function () {
  54. this.box.style.width = screenWidth + 'px'; // 设置容器宽度为屏幕宽度
  55. this.box.style.height = screenHeight + 'px'; // 设置容器高度为屏幕高度
  56. var fragment = document.createDocumentFragment(); // 创建文档片段,用于性能优化
  57. for (var i = 0; i < this.size; i++) { // 创建雪花元素
  58. var left = this.getRandomThings('left'); // 获取随机的left值
  59. var top = this.getRandomThings('top'); // 获取随机的top值
  60. var snowSize = this.getRandomThings('size'); // 获取随机的雪花大小
  61. var snow = document.createElement("div"); // 创建雪花元素
  62. snow.style.cssText = 'position:absolute;color:#FFFFFF;'; // 设置元素样式
  63. snow.style['font-size'] = snowSize + 'px'; // 设置字体大小
  64. snow.style.left = left + 'px'; // 设置left值
  65. snow.style.top = top + 'px'; // 设置top值
  66. snow.innerHTML = '&#10052'; // 设置雪花图标(Unicode编码)
  67. this.item.push(snow); // 添加到雪花元素数组中
  68. fragment.appendChild(snow); // 添加到文档片段中
  69. }
  70. box.appendChild(fragment); // 将文档片段添加到容器中
  71. }
  72. Snow.prototype.start = function () {
  73. var that = this;
  74. var num = 0;
  75. for (var i = 0; i < this.size; i++) { // 遍历雪花元素数组
  76. var snow = this.item[i];
  77. if ((i + 1) % this.downSize == 0) { // 每downSize个雪花一组,控制下落速度
  78. num++;
  79. }
  80. (function (s, n) { // 使用闭包保存snow和num的值
  81. setTimeout(function () { // 定时器,实现雪花分批下落
  82. that.doStart(s); // 调用doStart方法使雪花开始下落
  83. }, 1000 * n) // 每隔n秒下落一组雪花
  84. })(snow, num)
  85. }
  86. }
  87. // 针对每个雪花的定时处理
  88. Snow.prototype.doStart = function (snow) {
  89. var that = this;
  90. (function (s) {
  91. var increTop = that.getRandomThings('incre'); // 获取向下的速度
  92. var increLeft = that.getRandomThings('increLeft'); // 获取向右的速度
  93. var x = parseInt(getStyle(s, 'left')), y = parseInt(getStyle(s, 'top')); // 获取当前的left和top值
  94. if (s.timmer) return; // 如果定时器已存在,则不执行后续代码
  95. s.timmer = setInterval(function () { // 设置定时器,使雪花动起来
  96. // 超过右边或者底部重新开始
  97. if (y > (screenHeight - 5) || x > (screenWidth - 30)) {
  98. // 重新回到天上开始往下
  99. increTop = that.getRandomThings('incre');
  100. increLeft = that.getRandomThings('increLeft');
  101. // 重新随机属性
  102. var left = that.getRandomThings('left');
  103. var top = that.getRandomThings('top');
  104. var snowSize = that.getRandomThings('size');
  105. s.style.left = left + 'px';
  106. s.style.top = top + 'px';
  107. s.style['font-size'] = snowSize + 'px';
  108. y = top;
  109. x = left;
  110. n = 0;
  111. return;
  112. }
  113. // 加上系数,当随机数大于0.5时速度加快,小于0.5时速度减慢,形成飘动效果
  114. x += Math.random() > 0.5 ? increLeft * 1.1 : increLeft * 0.9;
  115. y += Math.random() > 0.5 ? increTop * 1.1 : increTop * 0.9;
  116. // 设置left和top值使雪花动起来
  117. s.style.left = x + 'px';
  118. s.style.top = y + 'px';
  119. }, speed); // 每隔speed毫秒执行一次定时器中的代码
  120. })(snow)
  121. }
  122. // 获取元素的样式值
  123. function getStyle(obj, prop) {
  124. var prevComputedStyle = document.defaultView ? document.defaultView.getComputedStyle(obj, null) : obj.currentStyle;
  125. return prevComputedStyle[prop];
  126. }
  127. new Snow(300, 30); // 创建一个Snow对象,传入雪花数量和每批下落的雪花数量
  128. })()
  129. </script>
  130. </html>

二、代码原理

这段代码主要通过JavaScript来操作DOM元素,实现了一个下雪的效果。首先,通过CSS样式设置整个页面的背景为黑色,并且创建一个id为"box"的容器元素用于容纳雪花。

接着,使用JavaScript代码自执行函数来封装雪花的相关逻辑。在这个函数中,获取屏幕的宽度和高度,并定义了雪花下落的速度。

然后,定义了一个Snow对象构造函数,用于创建雪花。构造函数接受两个参数,分别是雪花的数量和每批下落的雪花数量。在构造函数中,首先通过getElementById方法获取到容器元素,并设置容器的宽度和高度与屏幕一致。然后,使用for循环创建指定数量的雪花元素,通过随机数设置雪花的初始位置、大小和样式,并将雪花元素添加到数组item和文档片段中。最后,将文档片段添加到容器中。

接着,在Snow对象的原型上定义了一系列方法。其中,getRandomThings方法用于根据type参数获取随机的left值、top值、向下的速度、向右的速度或雪花的大小。init方法用于初始化雪花,设置容器的宽度和高度,并创建指定数量的雪花元素,并将其添加到容器中。start方法用于控制雪花的下落,通过定时器和闭包实现分批下落的效果。doStart方法用于针对每个雪花设置定时处理,根据当前位置和速度计算新的位置,并更新雪花元素的样式值,使其动起来。getStyle方法用于获取元素的样式值。

最后,在全局作用域中创建了一个Snow对象,传入了300个雪花和每批下落的雪花数量为30,从而开始执行下雪效果。

三、运行效果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/396207
推荐阅读
相关标签
  

闽ICP备14008679号