如何实现在线查看jt图_如何使用css3实现一个类在线直播的队列动画

之前在群里有个朋友问了这样一个问题, 就是如何在小程序中实现类似直播平台的用户上线时的队列动画? 作为一名前端工程师, 解决方案无非以下2种:

  1. 使用javascript根据条件来控制元素的样式实现队列动画
  2. 用纯css3配合数据驱动模型来实现.
大家都知道在现代的Web开发中, 我们能使用Css实现的效果尽量不要用Js, 所以我们应该优先考虑用Css3来实现,但是我们要结合数据流才能实现真正的队列动画, 所以我们可以利用MVVM框架便捷的数据驱动模型来控制动画的走向.

又由于动画的核心在于Css3, 所以在小程序或者是Vue/React中实现其实原理都是相似的, 大家不必担心技术栈的问题. 以下是实现后的效果图:

c0a5b95324ed2720a780f1d4c3fb7cb6.gif 如果以上gif无法访问, 可以查看下面的静态图: 5b1067934ed8518bb50353c774a9d03a.png

其实这种效果在很多地方都用到, 比如B站的弹幕, 某音乐平台直播的粉丝上线动画, 某音的直播等等, 而在Web端, 我们又能怎么实现它呢? 接下来笔者将带大家一步步实现这样的动画效果.

正文

要想实现上面的动画效果, 我们需要先分析一下动画, 上图的动画结构如下:

b1394bd3076f2924346a402c7c50de9f.png

动画一共分为以下两个过程:

  • 用户进入动画
  • 用户淡出动画
还有一个细节就是不管进入多少个用户, 都是从同一个位置进入的, 此时上一个用户位置会上移,如下图所示: 016519524e2e917d16c3927c4710887f.png 所以要想实现这样的效果最好的方式就是使用定位,比如绝对定位(absolute)或者固定定位(fixed). 并设置其bottom值, 如下代码所示:
.animateWrap {    position: absolute;    bottom: 40%;    left: 12px;}

以上位置信息仅供参考,具体数值可根据自身需求来更改.设置bottom的好处是容器的子元素一旦增加, 会自动将上一个元素顶上去, 所以不需要我们手动去设置其偏移值.

实现进入动画

我们要想实现上图的用户进入动画, 可以使用Css3的过渡动画transition,也可以使用animation动画, 由于使用场景的便捷性这里我们采用animation动画, 首先我们先写一下dom结构:

 <div className={styles.animateWrap}>    <div className={styles.animate} key={item}><div className={styles.tx}><img src={tx} alt=""/>div><span>李老师上线span>div>    <div className={styles.animate} key={item}><div className={styles.tx}><img src={tx} alt=""/>div><span>李老师上线span>div>    <div className={styles.animate} key={item}><div className={styles.tx}><img src={tx} alt=""/>div><span>李老师上线span>div>  div>

以上代码表示创建了一个动画容器, 并且添加了2个用户, 这里我们定义一下关键动画如下:

.animate {      margin-bottom: 10px;      border-radius: 20px;      background-color: rgba(0,0,0, .3);      animation: moveIn 1.2s;    }@keyframes moveIn {  0% {    transform: translateX(calc(-100% - 12px));  }  100% {    transform: translateX(0);  }}

以上即实现了元素向右移入的动画, 但是此时我们看到的动画是同时出现的, 我们要应用到真实场景中, 一定是通过socket或者通过轮循拿到的异步数据, 因此我们可以使用setInterval来模拟这一过程. 还有一个细节是我们动画里最多只完整展示2条用户数据, 多余的数据会渐出隐藏, 因此我们需要对数据进行截流, 代码如下:

const [user, setUser] = useState<Array<string>>([])  useEffect(() => {    let MAX_USER_COUNT = 2;    let timer = setInterval(() => {      setUser(prev => {        prev.push(Date.now() + '')        if(prev.length > MAX_USER_COUNT + 1){          prev.shift()          return [...prev]        }else {          return [...prev]        }      })    }, 2000)  }, [])

变量MAX_USER_COUNT用来控制最大展示的用户数,可以根据实际需求更改, setUser里面的逻辑即为截流逻辑, 当用户数超过指定的最大值时, 会将头部元素删除.

以上即完成了数据流转的过程, 我们还需要处理的是用户渐出逻辑和动画.我们先看看渐出的animation:

@keyframes moveOut {    0% {      opacity: 1;    }    100% {        opacity: 0;    } }

其实动画并不难, 我们需要控制的是如何给头部元素动态的添加这个动画, 此时我们最好的方案是通过类名, 即当满足渐出的条件时, 我们需要给渐出的元素动态设置渐出类名, 条件如下:

user.length > MAX_USER_COUNT && i === 0

以上条件指的是当用户数超过最大展示用户数并且当且元素为头部元素时, 那么我们只需要根据这个条件来动态设置类名即可:

{  user.map((item, i) => {   return  <div              className={               classnames(styles.animate,                  user.length > 2 && i === 0 ? styles.hidden : '')               }                key={item}            >               <div className={styles.tx}>                 <img src={tx} alt=""/>               div>               <span>李老师{item}上线span>            div>            })}
css代码如下:
.hidden {  opacity: 0;  animation: moveOut 1.2s;}

通过以上步骤我们就实现了一个完整的类在线直播的队列动画, 动画完整css代码如下, 感兴趣的盆友可以学习参考一下:

.animateWrap {    position: absolute;    bottom: 40%;    left: 12px;    .animate {      margin-bottom: 10px;      border-radius: 20px;      background-color: rgba(0,0,0, .3);      animation: moveIn 1.2s;      .tx {        display: inline-block;        width: 36px;        height: 36px;        border-radius: 50%;        overflow: hidden;        vertical-align: middle;        margin-right: 10px;        img {          width: 100%;          height: 100%;          object-fit: cover;        }      }      span {        margin-right: 12px;        line-height: 36px;        font-size: 14px;        color: #fff;      }    }    .hidden {      opacity: 0;      animation: moveOut 1.2s;    }    @keyframes moveIn {      0% {        transform: translateX(calc(-100% - 12px));      }      100% {        transform: translateX(0);      }    }    @keyframes moveOut {      0% {        opacity: 1;      }      100% {        opacity: 0;      }    }  }

最后

如果想学习更多 前端技能, 实战学习路线, 欢迎在公众号《趣谈前端》加入我们的技术群一起学习讨论,共同探索前端的边界。

如果想对文章做评价或者补充, 或者想发布程序员的日常动态, 可以点击原文链接发布哦~

8fe33cd1310dd2ce2c3e5e4a01162e72.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JT_905链路管理流程是指在无线通信系统中,对移动台与基站之间的物理链路进行管理和控制的一系列流程。具体流程如下: 1. 链路建立:当移动台与基站需要进行通信时,首先进行链路建立。移动台向基站发送链路请求,基站收到请求后检查信道质量等条件,如果符合要求,基站向移动台发送链路确认信号,建立链路。 2. 数据传输:链路建立后,移动台与基站之间可以进行双向的数据传输。移动台可以发送数据包给基站,基站也可以发送数据包给移动台。 3. 链路维持:在链路建立之后,为了保持链路的稳定性和可靠性,需要进行链路维持操作。这包括定期发送链路保持信号、监测链路质量等。 4. 链路重建:如果链路质量下降或中断,移动台与基站之间的链路会中断。在链路重建流程中,移动台会发送链路重建请求给基站,基站收到请求后重新评估链路质量,并决定是否重新建立链路。 5. 链路释放:当通信结束或其他原因导致链路不再需要时,可以进行链路释放操作。移动台或基站可以发送链路释放请求,对链路进行释放。 总之,JT_905链路管理流程是在移动通信系统中,用来管理和控制移动台与基站之间物理链路的一系列流程,包括链路建立、数据传输、链路维持、链路重建和链路释放等操作。这些流程的顺序和操作方式在不同的通信系统中可能会有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值