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"]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章