image.png

package.json:

  1. "scripts": {
  2. "dev": "webpack --mode=development --watch", //watch代表监听,代码有改动会自动打包,ctrl+c停止
  3. "build": "webpack --mode=production"
  4. },

dist目录:最终要运行的文件

index.html:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. html {
  10. min-height: 100%;
  11. background: #172f38;
  12. color: #d7dbdd;
  13. margin: 0;
  14. padding: 20px;
  15. cursor: pointer;
  16. box-sizing: border-box;
  17. }
  18. body {
  19. margin: 0;
  20. }
  21. .container span {
  22. float: left;
  23. min-width: 2em;
  24. margin-right: 10px;
  25. }
  26. .center {
  27. position: fixed;
  28. left: 50%;
  29. top: 50%;
  30. font-size: 8em;
  31. color: rgba(255, 255, 255, .7);
  32. transform: translate(-50%, -50%);
  33. /* 针对opactiy,变化函数使用ease-in,延迟0.3s变化,变化时在0.7s完成
  34. 针对其他css属性,变化函数使用ease-in,变化总时间1s
  35. */
  36. transition: all 1s ease-in, opacity 0.7s ease-in 0.3s;
  37. }
  38. </style>
  39. </head>
  40. <body>
  41. <div id="divContainer" class="container">
  42. </div>
  43. <div id="divCenter" class="center">
  44. </div>
  45. <script src="main.js"></script>
  46. </body>
  47. </html>

main.js:

src:webpack需要打包的代码

index.js:入口文件

  1. import "./page/event"

util:工具类

  • isPrime.js:判断是否为素数

    1. /**
    2. * 判断n是否是素数
    3. * 素数:仅能被1和自身整除
    4. * 6 2,5
    5. * @param {*} n
    6. */
    7. export default function (n) {
    8. if (n < 2) {
    9. return false;
    10. }
    11. for (let i = 2; i <= n - 1; i++) {
    12. if (n % i === 0) {
    13. //发现,2到n-1之间,有一个数能整除n
    14. return false;
    15. }
    16. }
    17. return true;
    18. }
  • radColor.js:随机颜色

    1. var colors = ["#f26395", "#62efab", "#ef7658", "#ffe868", "#80e3f7", "#d781f9"];
    2. export function getRandom(min, max) { //产生随机整数!!!
    3. return Math.floor(Math.random() * (max - min) + min);
    4. }
    5. /**
    6. * 返回一个随机的颜色:传递随机下标
    7. */
    8. export default function () {
    9. var index = getRandom(0, colors.length);
    10. return colors[index];
    11. }
  • number.js:产生数字(有点难) ```javascript import isPrime from “./isPrime”

export default class NumberTimer {

  1. constructor(duration = 500) { //构造函数constructor duration = 500:间隔时间500ms
  2. this.duration = duration;
  3. this.number = 1; //当前的数字
  4. this.onNumberCreated = null; //当一个数字产生的时候,要调用的回调函数
  5. this.timerId = null;
  6. }
  7. start() {
  8. if (this.timerId) {
  9. return;
  10. }
  11. this.timerId = setInterval(() => {
  12. this.onNumberCreated && this.onNumberCreated(this.number, isPrime(this.number)) //&&相当于if条件了
  13. this.number++;
  14. }, this.duration)
  15. }
  16. stop() {
  17. clearInterval(this.timerId);
  18. this.timerId = null;
  19. }

}

<a name="bzIqN"></a>
#### page:页面渲染

   - appendNumber.js:页面渲染数字
```javascript
import radColor from "../util/radColor"
import { getRandom } from "../util/radColor"
import $ from "jquery";

var divContainer = $("#divContainer");
var divCenter = $("#divCenter");

export default function (n, isPrime) {
    var span = $("<span>").text(n);
    if (isPrime) {
        var color = radColor();
        span.css("color", color);
        createCenterPrimeNumber(n, color)
    }
    divContainer.append(span);
    //产生中间的数字
    createCenterNumber(n);
}

function createCenterNumber(n) {
    divCenter.text(n)
}

/**
 * 在中间产生一个素数
 * @param {*} n 
 */
function createCenterPrimeNumber(n, color) {
    var div = $("<div>").addClass("center").css("color", color).text(n);
    $("body").append(div);
    //加入了div后,强行让页面重新渲染
    getComputedStyle(div[0]).left;  //这块的代码jquery没懂,为什么加[0] //只要读取某个元素的位置或尺寸信息,则会导致浏览器重新渲染 reflow
    div.css("transform", `translate(${getRandom(-200, 200)}px, ${getRandom(-200, 200)}px)`).css("opacity", 0)   //效果飘出去

}
  • event.js:用于注册事件 ```javascript import NumberTimer from “../util/number” //注意返回上一级number import appendNumber from “./appendNumber” var n = new NumberTimer(100);//管速度 n.onNumberCreated = function (n, isPrime) { appendNumber(n, isPrime); }

//该模块用于注册事件 var isStart = false; //默认没有开始

window.onclick = function () { if (isStart) { n.stop(); isStart = false; } else { n.start(); isStart = true; } } ```