js实现炫酷数字效果

/**
 * 产生一个随机整数,范围是min~max之间
 * @param {*} min 最小值
 * @param {*} max 最大值,取不到最大值
 */
function getRandom(min, max) {
  // Math.random()   0~1   包含小数
  // Math.random() * (max - min)   0 ~ (max-min)  包含小数
  // Math.random() * (max - min) + min   min ~ max  包含小数
  // Math.floor(Math.random() * (max - min) + min)  min~max 只有整数
  return Math.floor(Math.random() * (max - min) + min);
}

/**
 * 得到一个随机的颜色
 */
function getRandomColor() {
  // 颜色数组
  var colors = [
    "#f26395",
    "#62efab",
    "#ef7658",
    "#ffe868",
    "#80e3f7",
    "#d781f9"
  ];
  //产生一个随机的下标
  var index = getRandom(0, colors.length);
  return colors[index];
}

/**
 * 得到一个随机字符串
 * @param {*} n 
 */
function getRandomString(){

  var strContent = ["love","u"];
  //产生一个随机小标
  var index = getRandom(0,strContent.length);
  return strContent[index];
}

/**
 * 判断一个数n,是不是一个素数(质数)
 * 素数:大于1的数字,只能被1和自身整除
 * @param {*} n
 */
function isPrime(n) {
  if (n <= 1) {
    return false;
  }
  // 2~n-1
  for (var i = 2; i < n; i++) {
    if (n % i === 0) {
      // i能整除n
      return false;
    }
  }
  // 找不到
  return true;
}

var number = 1; //下一个要添加的数字
var divNumbers = document.getElementById("divNumbers"); //小数字的容器
var divNum = document.getElementById("num"); //中间的数字的div
var divCenter = document.getElementById("divCenter");
/**
 * 添加一个数字
 */
function addNumber() {
  //添加小数字
  var span = document.createElement("span");
  // span.innerText = number;
  span.innerText = '宁老师';
  divNumbers.appendChild(span);
  //设置中间的数字
  // divNum.innerText = number;
  divNum.innerText = "love";

  if (isPrime(number)) {
    //产生一个随机颜色
    var color = getRandomColor();
    var strContent = getRandomString();
    //变化颜色
    span.style.color = color;
    //中间有东西飘出去了
    var div = document.createElement("div");
    div.className = "overlap"; //重叠的div
    div.innerText = strContent;
    div.style.color = color;
    //设置过渡
    div.style.transition = "1s ease-in";
    divCenter.appendChild(div); //此时,该元素根本就不在页面上(浏览器还没有对页面进行绘制)
    //必须在这个位置,强行的让浏览器绘制一遍(reflow)
    getComputedStyle(div).top; //该代码没有实际意义,只是强行读取该元素最终的某个位置,逼迫浏览器绘制该元素
    //让它飘
    div.style.transform =
      "translate(" +
      getRandom(-300, 300) +
      "px, " +
      getRandom(-300, 300) +
      "px)";
    //让它透明
    div.style.opacity = 0;
    //过渡完成后,需要删除该元素
    div.addEventListener(
      "transitionend",
      function() {
        //过渡完成后触发的事件
        div.remove(); //自杀
      },
      {
        once: true //该事件只触发一次
      }
    );
  }
  //让滚动条滚动到span元素的位置
  span.scrollIntoView();
  number++;
}
var timer = null; //用于保存计时器的id
/**
 * 开始不断的产生数字
 */
function start() {
  if (timer) {
    //正在产生数字
    return;
  }
  // 每N毫秒运行一次addNumber函数
  timer = setInterval(addNumber, 100);
}

/**
 * 停止产生数字
 */
function stop() {
  clearInterval(timer);
  timer = null;
}

window.onclick = function() {
  if (timer) {
    //正在产生数字
    stop();
  } else {
    start();
  }
};

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <style>
      html {
        background: #172f38;
        color: #d7dbdd;
        padding: 20px;
        cursor: pointer;
      }

      .numbers span {
        margin-right: 10px;
        /* 浮动之后变成块盒 */
        float: left;
        min-width: 2em;
      }

      .center {
        position: fixed;
        font-size: 8em;
        color: rgba(255, 255, 255, 0.7);
        /* 实现自动宽高的绝对定位居中 */
        left: 50%;
        top: 50%;
        transform: translate(-50%, -50%);
      }

      .center .overlap {
        /* 目的是让这些div重叠 */
        position: absolute;
        left: 0;
        top: 0;
      }
    </style>
  </head>
  
  <body>
    <!-- 装小的数字 -->
    <div id="divNumbers" class="numbers"></div>

    <div id="divCenter" class="center">
      <div id="num"></div>
    </div>

    <script src="./index.js"></script>
  </body>
</html>

["#f26395", "#62efab", "#ef7658", "#ffe868", "#80e3f7", "#d781f9"]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章