日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
前端實(shí)戰(zhàn):使用CSS3實(shí)現(xiàn)類在線直播的隊(duì)列動(dòng)畫

之前在群里有個(gè)朋友問了這樣一個(gè)問題, 就是如何在小程序中實(shí)現(xiàn)類似直播平臺(tái)的用戶上線時(shí)的隊(duì)列動(dòng)畫? 作為一名前端工程師, 解決方案無非以下2種:

  • 使用javascript根據(jù)條件來控制元素的樣式實(shí)現(xiàn)隊(duì)列動(dòng)畫
  • 用純css3配合數(shù)據(jù)驅(qū)動(dòng)模型來實(shí)現(xiàn).

大家都知道在現(xiàn)代的Web開發(fā)中, 我們能使用Css實(shí)現(xiàn)的效果盡量不要用Js, 所以我們應(yīng)該優(yōu)先考慮用Css3來實(shí)現(xiàn),但是我們要結(jié)合數(shù)據(jù)流才能實(shí)現(xiàn)真正的隊(duì)列動(dòng)畫, 所以我們可以利用MVVM框架便捷的數(shù)據(jù)驅(qū)動(dòng)模型來控制動(dòng)畫的走向。

又由于動(dòng)畫的核心在于Css3, 所以在小程序或者是Vue/React中實(shí)現(xiàn)其實(shí)原理都是相似的, 大家不必?fù)?dān)心技術(shù)棧的問題。以下是實(shí)現(xiàn)后的效果圖:

如果以上gif無法訪問, 可以查看下面的靜態(tài)圖:

其實(shí)這種效果在很多地方都用到, 比如B站的彈幕, 某音樂平臺(tái)直播的粉絲上線動(dòng)畫, 某音的直播等等, 而在Web端, 我們又能怎么實(shí)現(xiàn)它呢? 接下來筆者將帶大家一步步實(shí)現(xiàn)這樣的動(dòng)畫效果.

正文

要想實(shí)現(xiàn)上面的動(dòng)畫效果, 我們需要先分析一下動(dòng)畫, 上圖的動(dòng)畫結(jié)構(gòu)如下:

動(dòng)畫一共分為以下兩個(gè)過程:

  • 用戶進(jìn)入動(dòng)畫
  • 用戶淡出動(dòng)畫

還有一個(gè)細(xì)節(jié)就是不管進(jìn)入多少個(gè)用戶, 都是從同一個(gè)位置進(jìn)入的, 此時(shí)上一個(gè)用戶位置會(huì)上移,如下圖所示:

所以要想實(shí)現(xiàn)這樣的效果最好的方式就是使用定位,比如絕對定位(absolute)或者固定定位(fixed). 并設(shè)置其bottom值, 如下代碼所示:

 
 
 
 
  1. .animateWrap { 
  2.     position: absolute; 
  3.     bottom: 40%; 
  4.     left: 12px; 

以上位置信息僅供參考,具體數(shù)值可根據(jù)自身需求來更改.設(shè)置bottom的好處是容器的子元素一旦增加, 會(huì)自動(dòng)將上一個(gè)元素頂上去, 所以不需要我們手動(dòng)去設(shè)置其偏移值.

實(shí)現(xiàn)進(jìn)入動(dòng)畫

我們要想實(shí)現(xiàn)上圖的用戶進(jìn)入動(dòng)畫, 可以使用Css3的過渡動(dòng)畫transition,也可以使用animation動(dòng)畫, 由于使用場景的便捷性這里我們采用animation動(dòng)畫, 首先我們先寫一下dom結(jié)構(gòu):

 
 
 
 
  1.  
  2.     
李老師上線
 
  •     
  • 李老師上線
     
  •     
  • 李老師上線
     
  •   
  •  

    以上代碼表示創(chuàng)建了一個(gè)動(dòng)畫容器, 并且添加了2個(gè)用戶, 這里我們定義一下關(guān)鍵動(dòng)畫如下:

     
     
     
     
    1. .animate { 
    2.       margin-bottom: 10px; 
    3.       border-radius: 20px; 
    4.       background-color: rgba(0,0,0, .3); 
    5.       animation: moveIn 1.2s; 
    6.     } 
    7. @keyframes moveIn { 
    8.   0% { 
    9.     transform: translateX(calc(-100% - 12px)); 
    10.   } 
    11.   100% { 
    12.     transform: translateX(0); 
    13.   } 

    以上即實(shí)現(xiàn)了元素向右移入的動(dòng)畫, 但是此時(shí)我們看到的動(dòng)畫是同時(shí)出現(xiàn)的, 我們要應(yīng)用到真實(shí)場景中, 一定是通過socket或者通過輪循拿到的異步數(shù)據(jù), 因此我們可以使用setInterval來模擬這一過程. 還有一個(gè)細(xì)節(jié)是我們動(dòng)畫里最多只完整展示2條用戶數(shù)據(jù), 多余的數(shù)據(jù)會(huì)漸出隱藏, 因此我們需要對數(shù)據(jù)進(jìn)行截流, 代碼如下:

     
     
     
     
    1. const [user, setUser] = useState>([]) 
    2.   useEffect(() => { 
    3.     let MAX_USER_COUNT = 2; 
    4.     let timer = setInterval(() => { 
    5.       setUser(prev => { 
    6.         prev.push(Date.now() + '') 
    7.         if(prev.length > MAX_USER_COUNT + 1){ 
    8.           prev.shift() 
    9.           return [...prev] 
    10.         }else { 
    11.           return [...prev] 
    12.         } 
    13.       }) 
    14.     }, 2000) 
    15.   }, []) 

    變量MAX_USER_COUNT用來控制最大展示的用戶數(shù),可以根據(jù)實(shí)際需求更改, setUser里面的邏輯即為截流邏輯, 當(dāng)用戶數(shù)超過指定的最大值時(shí), 會(huì)將頭部元素刪除。

    以上即完成了數(shù)據(jù)流轉(zhuǎn)的過程, 我們還需要處理的是用戶漸出邏輯和動(dòng)畫.我們先看看漸出的animation:

     
     
     
     
    1. @keyframes moveOut {   
    2.   0% {    
    3.    opacity: 1;   
    4.   }   
    5.   100% {     
    6.     opacity: 0;   
    7.   } 
    8.  } 

    其實(shí)動(dòng)畫并不難, 我們需要控制的是如何給頭部元素動(dòng)態(tài)的添加這個(gè)動(dòng)畫, 此時(shí)我們最好的方案是通過類名, 即當(dāng)滿足漸出的條件時(shí), 我們需要給漸出的元素動(dòng)態(tài)設(shè)置漸出類名, 條件如下:

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

    以上條件指的是當(dāng)用戶數(shù)超過最大展示用戶數(shù)并且當(dāng)且元素為頭部元素時(shí), 那么我們只需要根據(jù)這個(gè)條件來動(dòng)態(tài)設(shè)置類名即可:

     
     
     
     
    1. {  user.map((item, i) => { 
    2.    return  
    3.              className={ 
    4.                classnames(styles.animate,  
    5.                  user.length > 2 && i === 0 ? styles.hidden : '') 
    6.                }  
    7.                key={item} 
    8.             > 
    9.                 
    10.                   
    11.                
     
  •                李老師{item}上線 
  •             
  •    
  •           }) 
  • css代碼如下:

     
     
     
     
    1. hidden {  opacity: 0;  animation: moveOut 1.2s;} 

    通過以上步驟我們就實(shí)現(xiàn)了一個(gè)完整的類在線直播的隊(duì)列動(dòng)畫, 動(dòng)畫完整css代碼如下, 感興趣的盆友可以學(xué)習(xí)參考一下:

     
     
     
     
    1. animateWrap { 
    2.     position: absolute; 
    3.     bottom: 40%; 
    4.     left: 12px; 
    5.     .animate { 
    6.       margin-bottom: 10px; 
    7.       border-radius: 20px; 
    8.       background-color: rgba(0,0,0, .3); 
    9.       animation: moveIn 1.2s; 
    10.       .tx { 
    11.         display: inline-block; 
    12.         width: 36px; 
    13.         height: 36px; 
    14.         border-radius: 50%; 
    15.         overflow: hidden; 
    16.         vertical-align: middle; 
    17.         margin-right: 10px; 
    18.         img { 
    19.           width: 100%; 
    20.           height: 100%; 
    21.           object-fit: cover; 
    22.         } 
    23.       } 
    24.       span { 
    25.         margin-right: 12px; 
    26.         line-height: 36px; 
    27.         font-size: 14px; 
    28.         color: #fff; 
    29.       } 
    30.     } 
    31.     .hidden { 
    32.       opacity: 0; 
    33.       animation: moveOut 1.2s; 
    34.     } 
    35.     @keyframes moveIn { 
    36.       0% { 
    37.         transform: translateX(calc(-100% - 12px)); 
    38.       } 
    39.       100% { 
    40.         transform: translateX(0); 
    41.       } 
    42.     } 
    43.     @keyframes moveOut { 
    44.       0% { 
    45.         opacity: 1; 
    46.       } 
    47.       100% { 
    48.         opacity: 0; 
    49.       } 
    50.     } 
    51.   } 

    本文轉(zhuǎn)載自微信公眾號(hào)「趣談前端」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系趣談前端公眾號(hào)。


    名稱欄目:前端實(shí)戰(zhàn):使用CSS3實(shí)現(xiàn)類在線直播的隊(duì)列動(dòng)畫
    文章位置:http://www.dlmjj.cn/article/cdeppdc.html