业务评价-点亮星星

315 阅读1分钟

效果: 实现点击星星显示评价的满意程度

  • 点击之前:

image.png

  • 点击:

image.png

灰色星星:

gray.png

亮起星星:

light.png

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.1/jquery.js"></script>
  <body>
    <div class="stars-wrapper">
      <!-- //评分项1 -->
      <div class="stars">
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <div class="lev"></div>
      </div>
      <!-- //评分项2 -->
      <div class="stars">
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <div class="lev"></div>

      </div>
      <!-- //评分项3 -->
      <div class="stars">
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <img src="./images/gray.png" alt="" />
        <div class="lev"></div>

      </div>
    </div>
  </body>
  <script>
    window.onload = function () {
      stars(5); //  满分 5 分 根据 html 自定义星星数
    };
    var leval = [
      "1分,很不满意",
      "2分,不满意",
      "3分,一般",
      "4分,满意",
      "5分,非常满意",
    ];
    function stars(size) {
      //获取总的星星数
      var stars = document.querySelectorAll(".stars> img");
      // 得分数组
      var scores = [];
      // 评分项数组
      var starArrs = [];
      //数组分割
      for (var i = 0; i < Math.ceil(stars.length / size); i++) {
        var start = i * size;
        var end = start + size;
        //初始评分为0
        scores.push(0);
        starArrs.push([].slice.call(stars, start, end));
      }
      console.log("starArrs", starArrs);
      // 事件委托父元素
      document.querySelector(".stars-wrapper").onclick = function (e) {
        //获取点击的星星 在 总数组中的index
        var index = [].indexOf.call(stars, e.target);
        // 如果点击的 不是星星
        if (index === -1) return;
        // 判断 该星星归属 评分项数组
        var i = parseInt(index / size);
        var starArr = starArrs[i];
        // 计算归属评分项 的评分
        index = index % size;
        // 评分未更改
        if (index === scores[i] - 1) {
          console.log(scores);
          return scores;
        }
        scores[i] = index + 1;

        // 此处为添加评价文字效果
        var lev = document.getElementsByClassName('lev')[i];
        lev.innerHTML= leval[scores[i]-1]

        //显示评分红色托马斯基柴夫波娃效果
        starArr.forEach(function (star, i) {
          if (i <= index) {

            star.src = "./images/light.png";
          } else {
            star.src = "./images/gray.png";
          }
        });

        console.log(scores);
        return scores;
      };
    }
    // 数组分割 可以自定义成一个函数
    function arrayChunck(arr, size) {
      if (!arr.length) return;
      var arrs = [];
      for (var i = 0; i < Math.ceil(arr.length / 7); i++) {
        var start = i * size;
        var end = start + size;
        arrs.push([].slice.call(arr, start, end));
      }
      return arrs;
    }
  </script>
  <style>
    img {
      width: 20px;
      height: 20px;
    }
    .stars {
      background: yellowgreen;
      padding: 5px;
      margin-bottom: 10px;
    }

    .stars span {
      display: inline-block;
      width: 20px;
      height: 20px;
      background: #ccc;
      margin-right: 10px;
    }

    /* 显示评分数 */
    span.active {
      background: red;
    }
  </style>
</html>