JavaScript实现微信聊天烟花效果

微信8.0烟花效果实现


<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>demo</title>
</head>
<style>
  html,
  body {
    width: 100%;
    height: 100vh; 
	overflow:hidden;
	margin:0;
	padding:0
  }
  #start{
	  position:fixed;
	  bottom:0;
	  left:0;
	  right:0;
	  margin:auto;
  }
  
</style>

<body>
	
  <button id="start">点击开始</button>
  <script>
    var raf = (function () {
      var TIME = Math.floor(1000 / 60);
      var frame, cancel;
      var frames = {};
      var lastFrameTime = 0;

      if (typeof requestAnimationFrame === 'function' && typeof cancelAnimationFrame === 'function') {
        frame = function (cb) {
          var id = Math.random();

          frames[id] = requestAnimationFrame(function onFrame(time) {
            if (lastFrameTime === time || lastFrameTime + TIME - 1 < time) {
              lastFrameTime = time;
              delete frames[id];

              cb();
            } else {
              frames[id] = requestAnimationFrame(onFrame);
            }
          });

          return id;
        };
        cancel = function (id) {
          if (frames[id]) {
            cancelAnimationFrame(frames[id]);
          }
        };
      } else {
        frame = function (cb) {
          return setTimeout(cb, TIME);
        };
        cancel = function (timer) {
          return clearTimeout(timer);
        };
      }

      return { frame: frame, cancel: cancel };
    }());
    function toDecimal(str) {
      return parseInt(str, 16);
    }
    function hexToRgb(str) {
      var val = String(str).replace(/[^0-9a-f]/gi, '');

      if (val.length < 6) {
        val = val[0] + val[0] + val[1] + val[1] + val[2] + val[2];
      }

      return {
        r: toDecimal(val.substring(0, 2)),
        g: toDecimal(val.substring(2, 4)),
        b: toDecimal(val.substring(4, 6))
      };
    }

    function updateFetti(context, fetti) {
      var progress = (fetti.tick++) / fetti.totalTicks;
      if (progress > 1) {
        return;
      }
      fetti.x += Math.cos(fetti.angle2D) * fetti.velocity; // 左下角
      fetti.y += Math.sin(fetti.angle2D) * fetti.velocity + fetti.gravity; // 左下角

      fetti.velocity *= fetti.decay;
      fetti.tiltAngle += 0.1;
      fetti.tiltSin = Math.sin(fetti.tiltAngle);
      fetti.tiltCos = Math.cos(fetti.tiltAngle);
      fetti.random = Math.random() + 7;

      var x1 = fetti.x;
      var y1 = fetti.y;

      var x2 = fetti.x + (fetti.random * fetti.tiltCos); // 左上角
      var y2 = fetti.y + (fetti.random * fetti.tiltSin); // 左上角

      var x3 = x2 + fetti.random;
      var y3 = y2;

      var x4 = fetti.x + fetti.random;
      var y4 = fetti.y;


      context.fillStyle = 'rgba(' + fetti.color.r + ', ' + fetti.color.g + ', ' + fetti.color.b + ', ' + (1 - progress) + ')';
      context.beginPath();

      context.moveTo(Math.floor(x1), Math.floor(y1));
      context.lineTo(Math.floor(x2), Math.floor(y2));
      context.lineTo(Math.floor(x3), Math.floor(y3));
      context.lineTo(Math.floor(x4), Math.floor(y4));

      context.closePath();
      context.fill();

      return fetti.tick < fetti.totalTicks;
    }

    function getCanvas(zIndex) {
      var canvas = document.createElement('canvas');

      canvas.style.position = 'fixed';
      canvas.style.top = '0px';
      canvas.style.left = '0px';
      canvas.style.pointerEvents = 'none';
      canvas.style.zIndex = zIndex;

      return canvas;
    }
    function setCanvasWindowSize(canvas) {
      canvas.width = document.documentElement.clientWidth;
      canvas.height = document.documentElement.clientHeight;
	 
    }
    const canvas = getCanvas(200);
	
    setCanvasWindowSize(canvas);
    document.body.appendChild(canvas);
    var context = canvas.getContext('2d');
    const colors = [
      '#26ccff',
      '#a25afd',
      '#ff5e7e',
      '#88ff5a',
      '#fcff42',
      '#ffa62d',
      '#ff36ff',
	  '#7f7522',
	  '#2e3a1f',
	  '#181d4b',
	  '#0c212b',
	  '#d71345'
    ];
    var arr = []
    for (let i = 0; i < 20; i++) {
      arr.push({
        "x":  0,
        "y": document.documentElement.clientHeight/3,
        "velocity": (45 * 0.5) + (Math.random() * 20),
        "angle2D": 3 / 2 * Math.PI + Math.random() * 1 / 4 * Math.PI,
        "tiltAngle":  Math.random() * Math.PI,
        "color": hexToRgb(colors[Math.floor(Math.random() * 12)]),
        "tick": 0,
        "totalTicks": 200,
        "decay": 0.9,
        "random": 0,
        "tiltSin": 0,
        "tiltCos": 0,
        "gravity": 3,
        "scalar": 1
      })
    }
    var animationFrame = null;
    function update() {
      context.clearRect(0, 0, canvas.width, canvas.height);
      arr = arr.filter(item => {
        return updateFetti(context, item);
      });

      if (arr.length) {
        animationFrame = raf.frame(update);
      }
    }

    start.onclick = () => {
      if(!animationFrame) {
        animationFrame = raf.frame(update);
      } else {
        for (let i = 0; i < 20; i++) {
          arr.push({
            "x": 0,
            "y":document.documentElement.clientHeight/3,
            "velocity": (45 * 0.5) + (Math.random() * 20),
            "angle2D": 3 / 2 * Math.PI + Math.random() * 1 / 4 * Math.PI,
            "tiltAngle":  Math.random() * Math.PI,
            "color": hexToRgb(colors[Math.floor(Math.random() * 12)]),
            "tick": 0,
            "totalTicks": 200,
            "decay": 0.9,
            "random": 0,
            "tiltSin": 0,
            "tiltCos": 0,
            "gravity": 3,
            "scalar": 1
          })
        }
      }
    }
  </script>
</body>

</html>

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: 可以使用微信的第三方登录功能来实现微信登录。首先,需要在微信公众平台上注册网站应用,然后在应用中配置网站的域名。 接下来,在你的网站上添加一个 "微信登录" 按钮。点击按钮时,会跳转到微信的登录界面,用户在微信上登录后,会跳转回你的网站。 在用户跳转回网站时,可以通过 URL 中的参数(例如,code 参数)来获取用户的信息,并使用这些信息来完成登录。下面是一个简单的示例: ``` // 在网站的 JavaScript 中 const loginButton = document.getElementById('login-button'); loginButton.addEventListener('click', () => { // 跳转到微信的登录界面 window.location.href = 'https://open.weixin.qq.com/connect/qrconnect?appid=YOUR_APP_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code'; }); // 在网站的服务器端(例如,Node.js) app.get('/callback', (req, res) => { // 使用 code 参数获取用户信息 const code = req.query.code; const url = `https://api.weixin.qq.com/sns/oauth2/access_token?appid=YOUR_APP_ID&secret=YOUR_APP_SECRET&code=${code}&grant_type=authorization_code`; request(url, (error, response, body) => { if (!error && response.statusCode === 200) { const data = JSON.parse(body); // 使用 access_token 和 openid 获取用户信息 const userUrl = `https://api.weixin.qq.com/sns/userinfo?access ### 回答2: JavaScript可以通过使用微信的开放接口实现微信登录功能。下面是一个简单的步骤: 1. 获取授权码:用户在微信登录页中授权登录后,微信会返回一个授权码。 2. 通过授权码获取访问令牌:使用授权码向微信服务器发送请求,获取访问令牌。访问令牌是访问微信开放接口的必要凭证。 3. 使用访问令牌获取用户信息:使用访问令牌向微信服务器发送请求,获取用户的微信ID和其他相关信息。 4. 验证用户信息:根据获取到的用户ID和其他信息,可以进行进一步的用户验证和处理,例如绑定用户账号或保存用户信息。 具体实现方式: - 在网页中引入微信提供的JavaScript SDK (例如微信公众平台提供的JSSDK) - 调用微信SDK提供的接口进行授权登录,获取授权码。 - 使用授权码向指定接口发送请求,获取访问令牌。 - 使用访问令牌向指定接口发送请求,获取用户信息。 - 根据获取到的用户信息,进行相应的处理和验证。 需要注意的是,微信登录功能需要在微信网页内生效,即只能在微信内部打开实现。为了提供良好的用户体验,还可以实现自动登录功能,使用户再次访问时无需重复登录。 总结,通过JavaScript结合微信开放接口,可以实现微信登录功能,使用户能够用微信账号快速登录网页,并获取用户的微信ID及其他相关信息,以便后续的用户处理。 ### 回答3: JavaScript可以通过微信开放的API来实现微信登录功能。具体步骤如下: 1. 首先,在微信开放平台注册一个开发者账号,并创建一个应用。 2. 在应用设置中获取到开放平台分配给应用的AppID。 3. 在页面中引入微信开放平台提供的JavaScript SDK,可以通过在页面头部添加如下代码来引入: ``` <script src="https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script> ``` 4. 在登录页面中创建一个DOM元素,用于渲染微信登录按钮。例如: ``` <div id="wx-login-btn"></div> ``` 5. 在页面加载完成后,调用微信登录API,传入AppID和回调函数等参数来创建一个微信登录实例,例如: ``` var obj = new WxLogin({ id: "wx-login-btn", appid: "YOUR_APPID", redirect_uri: "YOUR_REDIRECT_URI", scope: "snsapi_login" }); ``` 其中,`id`为指定的DOM元素id,`appid`为应用的AppID,`redirect_uri`为回调地址,`scope`为授权作用域。 6. 用户点击微信登录按钮后,弹出微信登录窗口,用户在弹出的窗口中输入微信账号密码进行登录。 7. 用户登录成功后,微信开放平台会将回调地址重定向到之前指定的回调地址,并携带一个临时授权票据code。 8. 在回调的页面中,通过获取URL参数或其他方式获取到微信传递的临时授权票据code。 9. 调用后端接口,将临时授权票据code等参数传递给后端,后端通过调用微信开放平台提供的API来获取用户的唯一标识openid等信息。 10. 前端可以根据后端返回的用户信息进行相应的处理,例如显示用户头像、昵称等。 以此完成微信登录功能的实现
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值