当前位置:JS特效 » 瀑布流插件 » js实现随机中奖特效demo
js实现随机中奖特效demo
如果您觉得内容不错,请分享:

插件介绍

js实现随机中奖特效demo <script type="text/javascript">var bodyStyle = document.body.style;bodyStyle.mozUserSelect = "none";bodyStyle.webkitUserSelect = "none";var img = new Image();var canvas = documen

浏览器兼容性

浏览器兼容性
时间:2021-10-08 阅读:145
简要教程

【案例简介】

js实现随机中奖特效demo

【案例截图】

【核心代码】

 <script type="text/javascript">
      var bodyStyle = document.body.style;

      bodyStyle.mozUserSelect = "none";
      bodyStyle.webkitUserSelect = "none";

      var img = new Image();
      var canvas = document.querySelector("#canvas");

      canvas.style.position = "absolute";
      var imgs = ["p_0.jpg", "p_1.jpg"];
      var num = Math.floor(Math.random() * 2);
      img.src = imgs[num];

      img.addEventListener("load", function(e) {
        var ctx;
        var w = img.width,
          h = img.height;
        var offsetX = canvas.offsetLeft,
          offsetY = canvas.offsetTop;
        var mousedown = false;

        function eventDown(e) {
          e.preventDefault();
          mousedown = true;
        }

        function eventUp(e) {
          e.preventDefault();
          mousedown = false;
        }

        function eventMove(e) {
          e.preventDefault();
          if (mousedown) {
            if (e.changedTouches) {
              e = e.changedTouches[0];
            }
            var x =
                (e.clientX + document.body.scrollLeft || e.pageX) - offsetX ||
                0,
              y =
                (e.clientY + document.body.scrollTop || e.pageY) - offsetY || 0;
            with (ctx) {
              beginPath();
              arc(x, y, 10, 0, Math.PI * 2);
              fill();
            }
          }
          handleFilledPercentage(getFilledPercentage());
        }
        // 计算已经刮过的区域占整个区域的百分比
        function getFilledPercentage() {
          let imgData = ctx.getImageData(0, 0, w, h);
          // imgData.data是个数组,存储着指定区域每个像素点的信息,数组中4个元素表示一个像素点的rgba值
          let pixels = imgData.data;
          let transPixels = [];
          for (let i = 0; i < pixels.length; i += 4) {
            // 严格上来说,判断像素点是否透明需要判断该像素点的a值是否等于0,
            // 为了提高计算效率,这儿设置当a值小于128,也就是半透明状态时就可以了
            if (pixels[i + 3] < 128) {
              transPixels.push(pixels[i + 3]);
            }
          }
          return (
            ((transPixels.length / (pixels.length / 4)) * 100).toFixed(2) + "%"
          );
        }
        // 设置阈值,去除灰色涂层
        function handleFilledPercentage(percentage) {
          percentage = percentage || 0;
          if (parseInt(percentage) > 50) {
            // 当像素点的个数超过  50% 时,清空画布,显示底图
            ctx.clearRect(0, 0, w, h);
          }
        }

Top