返回顶部
首页 > 资讯 > 前端开发 > JavaScript >vue实现气泡运动撞击效果
  • 563
分享到

vue实现气泡运动撞击效果

2024-04-02 19:04:59 563人浏览 泡泡鱼
摘要

本文实例为大家分享了Vue实现气泡运动撞击效果的具体代码,供大家参考,具体内容如下 封装组件 <template>   <ul id="main">    

本文实例为大家分享了Vue实现气泡运动撞击效果的具体代码,供大家参考,具体内容如下

封装组件

<template>
  <ul id="main">
    <li v-for="(item, index) in circleData" :key="index" :class="{'active': item.is_latest_sign_user}">
      <div>
        <span>{{ item.nick_name }}</span>
        <span>签到</span>
      </div>
    </li>
  </ul>
</template>

<script>

export default {
  data() {
    return {
      circleData: [],
      circleDom: [],
      circleArr: [],
      //初始化运动的最大宽和高,初始定义0
      maxW: 0,
      maxH: 0,
      timer: null,
      timerArr: [],
      count: 0,
    };
  },
  mounted() {
    this.getLatest_sign_users('init')
    this.timer = setInterval((i) => {
      this.count++
      this.getLatest_sign_users()
    }, 5000)
  },
  methods: {
    getLatest_sign_users(type = '') {
      let data = []
      // nick_name: 用户名
      // is_latest_sign_user: 是否是新签到用户
      // gender: 0-女 1-男
      if (this.count === 0) {
        data = [
          {
            id: '1',
            nick_name: '萧一',
            is_latest_sign_user: true,
            gender: 0
          },
          {
            nick_name: '杨二',
            is_latest_sign_user: true,
            gender: 0
          },
          {
            nick_name: '张三',
            is_latest_sign_user: true,
            gender: 0
          }
        ]
      } else if (this.count === 1) {
        data = [
          {
            nick_name: '萧一',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '杨二',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '张三',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '李四',
            is_latest_sign_user: true,
            gender: 1
          },
          {
            nick_name: '王五',
            is_latest_sign_user: true,
            gender: 0
          },
          {
            nick_name: '徐六',
            is_latest_sign_user: true,
            gender: 1
          },
          {
            nick_name: '刘七',
            is_latest_sign_user: true,
            gender: 1
          }
        ]
      } else if (this.count === 2) {
        data = [
          {
            nick_name: '萧一',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '杨二',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '张三',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '李四',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '王五',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '徐六',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '刘七',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '何八',
            is_latest_sign_user: true,
            gender: 0
          },
          {
            nick_name: '柳九',
            is_latest_sign_user: true,
            gender: 0
          },
          {
            nick_name: '甄十',
            is_latest_sign_user: true,
            gender: 1
          },
          {
            nick_name: '十一',
            is_latest_sign_user: true,
            gender: 1
          },
          {
            nick_name: '十二',
            is_latest_sign_user: true,
            gender: 1
          }
        ]
      } else {
        data = [
          {
            nick_name: '萧一',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '杨二',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '张三',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '李四',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '王五',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '徐六',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '刘七',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '何八',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '柳九',
            is_latest_sign_user: false,
            gender: 0
          },
          {
            nick_name: '甄十',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '十一',
            is_latest_sign_user: false,
            gender: 1
          },
          {
            nick_name: '十二',
            is_latest_sign_user: false,
            gender: 1
          }
        ]
      }
      this.circleData = [...data]
      if (type === 'init') {//初次加载时默认全是新增签到用户
        data.forEach(item => item.is_latest_sign_user = true)
      }
      this.$nextTick(() => {
        if (data.length) {
          this.initBubble()
        }
      })
    },
    initBubble() {
      let main = document.getElementById("main");
      let divDom = main.getElementsByClassName("active"); //获取新增加的dom
      if (!divDom.length) return;

      //清理每个球得定时器
      this.timerArr.forEach(item => {
        clearInterval(item)
      })
      this.timerArr = []

      //给新增加的dom设置宽高
      for (let i = 0; i < divDom.length; i++) {
        let colors = [
          "#EF250A",
          "#830AF6"
        ];
        divDom[i].style.boxShadow = "0 0 20px" + " " + colors[this.circleData[i].gender] + " " + "inset";
        // 10个以上尺寸变小
        divDom[i].style.width = "46px";
        divDom[i].style.height = "46px";
        divDom[i].style.fontSize = "12px";
        divDom[i].style.lineHeight = "16px";
        this.circleDom.push(divDom[i])
      }

      //根据浏览器窗口的大小自动调节小球的运动空间
      window.onresize = () => {
        this.maxW = main.clientWidth - divDom[0].clientWidth; //为了让小球不卡在浏览器边缘
        this.maxH = main.clientHeight - divDom[0].clientHeight; // 所以要减去自身的宽高
      };
      onresize();

      //数组对象的初始化
      for (let i = 0; i < this.circleDom.length; i++) {
        let obj = {};
        console.log(this.circleDom[i]);
        if (this.circleDom[i].getAttribute("class") === 'active') {
          obj.x = Math.floor(Math.random() * (this.maxW + 1)); //初始x坐标
          obj.y = Math.floor(Math.random() * (this.maxH + 1)); //初始y坐标
          obj.cx = obj.x + this.circleDom[0].offsetWidth / 2;//圆心x坐标
          obj.cy = obj.y + this.circleDom[0].offsetHeight / 2;//圆心y坐标
          obj.movex = Math.floor(Math.random() * 2); //x轴移动方向
          obj.movey = Math.floor(Math.random() * 2); //y轴移动方向
          obj.speed = 0.2; //随机速度
          obj.timer = null; //计时器
          obj.index = i; //索引值
          this.circleArr.push(obj)
          //小球位置初始化
          this.circleDom[i].style.left = obj.x + 'px';
          this.circleDom[i].style.top = obj.y + 'px';
        } else {
          //保留之前数据得位置信息,不刷新位置
          obj = this.circleArr[i]
        }
        this.move(obj);
      }
    },

    //移动函数
    move(balls) {
      //每个球单独有定时器
      balls.timer = setInterval(() => {
        if (balls.movex === 1) {
          //如果往右跑,则一直加速度,碰到边界,改为反方向运动
          balls.x += balls.speed;
          if (balls.x + balls.speed >= this.maxW) {
            //防止小球出界
            balls.x = this.maxW;
            balls.movex = 0; //小球运动方向发生改变
          }
        } else {
          balls.x -= balls.speed; // 1和0表示正反方向
          if (balls.x - balls.speed <= 0) {
            balls.x = 0;
            balls.movex = 1;
          }
        }
        if (balls.movey === 1) {
          balls.y += balls.speed;
          if (balls.y + balls.speed >= this.maxH) {
            balls.y = this.maxH;
            balls.movey = 0;
          }
        } else {
          balls.y -= balls.speed;
          if (balls.y - balls.speed <= 0) {
            balls.y = 0;
            balls.movey = 1;
          }
        }
        if (this.circleDom[balls.index]) {
          balls.cx = balls.x + this.circleDom[0].offsetWidth / 2;//小球圆心等于:运动中x的值加上自身的半径
          balls.cy = balls.y + this.circleDom[0].offsetHeight / 2;
          this.circleDom[balls.index].style.left = balls.x + "px"; //小球相对于屏幕的位置
          this.circleDom[balls.index].style.top = balls.y + "px";
          this.crash(balls.index); //每个小球进行碰撞检测
        }
      }, 25);
      this.timerArr.push(balls.timer)
    },
    //碰撞函数
    crash(a) {
      let container = [...this.circleArr]
      let ball1x = container[a].cx; //在数组中任意球的圆心坐标
      let ball1y = container[a].cy;//思路:先随便拿一个球,然后遍历所有球,拿这个球和所有球的圆心距离比较
      for (let i = 0; i < container.length; i++) {
        if (i !== a) { //判断取出来的球不是本身,才能和其他球进行距离判断
          let ball2x = container[i].cx; //将其他球的圆心坐标赋值给球2
          let ball2y = container[i].cy;
          //圆心距 求两个点之间的距离,开平方
          let distence = Math.sqrt((ball1x - ball2x) * (ball1x - ball2x) + (ball1y - ball2y) * (ball1y - ball2y));
          if (distence <= this.circleDom[0].offsetWidth) { //球心距离和求直径比较
            if (ball1x > ball2x) { //当前位于未知求的右方
              if (ball1y > ball2y) {//预设未知球撞当前球,然后当前球改变运动
                container[a].movex = 1; //1表示为正值,对应的右和下
                container[a].movey = 1;//0表示为负值,对应的左和上
              } else if (ball1y < ball2y) {
                container[a].movex = 1;
                container[a].movey = 0;
              } else {
                container[a].movex = 1;
              }
            } else if (ball1x < ball2x) {
              if (ball1y > ball2y) {
                container[a].movex = 0;
                container[a].movey = 0;
              } else if (ball1y < ball2y) {
                container[a].movex = 0;
                container[a].movey = 1;
              } else {
                container[a].movex = 0;
              }
            } else {
              if (ball1y > ball2y) {
                container[a].movey = 1;
              } else if (ball1y < ball2y) {
                container[a].movey = 0;
              }
            }
          }
        }
      }
    }
  },
  beforeDestroy() {
    //清理每个球得定时器
    this.timerArr.forEach(item => {
      clearInterval(item)
    })
    //清理签到数据
    clearInterval(this.timer)
  }
};
</script>
<style lang='less' scoped>
#main {
  position: relative;
  width: 100%;
  height: 100%;
  overflow: hidden;
  padding: 0;

  li {
    position: absolute;
    overflow: hidden;
    -moz-border-radius: 50%;
    -WEBkit-border-radius: 50%;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    flex-wrap: wrap;

    &.active {
      animation: scaleBox 1s 1;
    }

    @keyframes scaleBox {
      0% {
        transfORM: scale(1);
      }
      50% {
        transform: scale(1.2);
      }
      100% {
        transform: scale(1);
      }
    }

    div {
      span {
        display: block;
        width: 100%;
        color: #fff;
        text-align: center;
      }
    }
  }
}
</style>

实现效果

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: vue实现气泡运动撞击效果

本文链接: https://lsjlt.com/news/166307.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue实现气泡运动撞击效果
    本文实例为大家分享了vue实现气泡运动撞击效果的具体代码,供大家参考,具体内容如下 封装组件 <template>   <ul id="main">     ...
    99+
    2024-04-02
  • Android气泡效果实现方法
    本文实例讲述了Android气泡效果实现方法。分享给大家供大家参考,具体如下: 最近在看以前在eoe上收藏的一些源代码,准备将这些代码加上一些自己的注释,然后贴出来,方便自己日...
    99+
    2022-06-06
    方法 Android
  • CSS实现聊天气泡效果
    这篇文章给大家分享的是有关CSS实现聊天气泡效果的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 一、效果图 京东效果模拟的效果 二、原理准备一个高度和宽度为0的盒子将这个盒子设置一个边框将边框...
    99+
    2023-06-08
  • 如何利用CSS3实现气泡效果
    这篇文章主要讲解了“如何利用CSS3实现气泡效果”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何利用CSS3实现气泡效果”吧!首先定义一个CSS Code...
    99+
    2024-04-02
  • CSS聊天气泡效果怎么实现
    本篇内容介绍了“CSS聊天气泡效果怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!   HTML结...
    99+
    2024-04-02
  • css实现气泡的小尖角效果
    小编给大家分享一下css实现气泡的小尖角效果,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!效果图(边框颜色太淡,放在{}里面):{  }参考链接 纯CSS气泡效果需要用到的知识点:当div的宽度和高度都是0时,整...
    99+
    2023-06-08
  • HTML5如何实现QQ聊天气泡效果
    小编给大家分享一下HTML5如何实现QQ聊天气泡效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!今天自己用 HTML/CSS ...
    99+
    2024-04-02
  • 怎么用CSS3实现聊天气泡效果
    小编给大家分享一下怎么用CSS3实现聊天气泡效果,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!   <pclass=&q...
    99+
    2024-04-02
  • Java实现带GUI的气泡诗词效果
    之前已经为大家介绍过利用Java实现带GUI的气泡诗词特效,本文将为大家介绍另一种方法同样也可以实现气泡诗词的效果。下面是示例代码 import java.awt.*; import...
    99+
    2022-12-21
    Java气泡诗词特效 Java气泡特效
  • Android实现气泡动画
    本文实例为大家分享了Android实现气泡动画的具体代码,供大家参考,具体内容如下 一、前言 本来想做一个类似window气泡屏保的动画效果。 奈何小球间的非对心碰撞公式没研究出来,...
    99+
    2024-04-02
  • android 仿微信聊天气泡效果实现思路
    微信聊天窗口的信息效果类似iphone上的短信效果,以气泡的形式展现,在Android上,实现这种效果主要用到ListView和BaseAdapter,配合布局以及相关素材,就...
    99+
    2022-06-06
    仿微信 天气 Android
  • Android 实现仿QQ拖拽气泡效果的示例
    目录效果图:一、实现思路二、功能实现三、全屏拖拽效果实现源码地址:效果图: 一、实现思路 在列表中默认使用自定义的TextView控件来展示消息气泡,在自定义的TextView控件...
    99+
    2024-04-02
  • Android实现好看的微信聊天气泡效果
    目录前言代码实现踩坑记录总结前言 在聊天类应用中,通常用气泡作为聊天内容的背景色,比如微信的聊天背景,别人发过来的是白色的气泡,自己发的是绿色的气泡。 上面这种是比较普通的,这篇我...
    99+
    2024-04-02
  • Android实现气泡布局/弹窗效果 气泡尖角方向及偏移量可控
    Android 自定义布局实现气泡弹窗,可控制气泡尖角方向及偏移量。 效果图 实现 首先自定义一个气泡布局。 public class BubbleRelativeLay...
    99+
    2022-06-06
    弹窗 布局 偏移量 Android
  • vue实现左右点击滚动效果
    本文实例为大家分享了vue实现左右点击滚动,效果如图 涉及功能点 1、在created中使用r e f s 结 合 refs结合refs结合nextTick仍然无法获取到元素的问题...
    99+
    2024-04-02
  • CSS3怎么实现超酷炫的粘性气泡效果
    今天小编给大家分享一下CSS3怎么实现超酷炫的粘性气泡效果的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起...
    99+
    2024-04-02
  • css中如何实现鼠标经过出现气泡框效果
    这篇文章主要为大家展示了“css中如何实现鼠标经过出现气泡框效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“css中如何实现鼠标经过出现气泡框效果”这篇文章吧...
    99+
    2024-04-02
  • CSS怎么实现聊天框小尖角和气泡效果
    本篇内容主要讲解“CSS怎么实现聊天框小尖角和气泡效果”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“CSS怎么实现聊天框小尖角和气泡效果”吧!那么,用CSS怎么...
    99+
    2024-04-02
  • 怎么用纯CSS实现语音聊天气泡框效果
    这篇文章主要为大家展示了“怎么用纯CSS实现语音聊天气泡框效果”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“怎么用纯CSS实现语音聊天气泡框效果”这篇文章吧。 ...
    99+
    2024-04-02
  • vue实现点击翻转效果
    用vue简单实现一个点击翻转的效果,供大家参考,具体内容如下 1、 2、 3、 //html代码 测试 demo命名随便复制来的 <div class="Demo...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作