偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

前端實(shí)戰(zhàn):使用CSS3實(shí)現(xiàn)類在線直播的隊(duì)列動(dòng)畫

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

[[422736]]

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

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

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

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

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

其實(shí)這種效果在很多地方都用到, 比如B站的彈幕, 某音樂平臺(tái)直播的粉絲上線動(dòng)畫, 某音的直播等等, 而在Web端, 我們又能怎么實(shí)現(xiàn)它呢? 接下來(lái)筆者將帶大家一步步實(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)這樣的效果最好的方式就是使用定位,比如絕對(duì)定位(absolute)或者固定定位(fixed). 并設(shè)置其bottom值, 如下代碼所示:

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

以上位置信息僅供參考,具體數(shù)值可根據(jù)自身需求來(lái)更改.設(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)畫, 由于使用場(chǎng)景的便捷性這里我們采用animation動(dòng)畫, 首先我們先寫一下dom結(jié)構(gòu):

  1. <div className={styles.animateWrap}> 
  2.     <div className={styles.animate} key={item}><div className={styles.tx}><img src={tx} alt=""/></div><span>李老師上線</span></div> 
  3.     <div className={styles.animate} key={item}><div className={styles.tx}><img src={tx} alt=""/></div><span>李老師上線</span></div> 
  4.     <div className={styles.animate} key={item}><div className={styles.tx}><img src={tx} alt=""/></div><span>李老師上線</span></div> 
  5.   </div> 

以上代碼表示創(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í)場(chǎng)景中, 一定是通過socket或者通過輪循拿到的異步數(shù)據(jù), 因此我們可以使用setInterval來(lái)模擬這一過程. 還有一個(gè)細(xì)節(jié)是我們動(dòng)畫里最多只完整展示2條用戶數(shù)據(jù), 多余的數(shù)據(jù)會(huì)漸出隱藏, 因此我們需要對(duì)數(shù)據(jù)進(jìn)行截流, 代碼如下:

  1. const [user, setUser] = useState<Array<string>>([]) 
  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用來(lái)控制最大展示的用戶數(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è)條件來(lái)動(dòng)態(tài)設(shè)置類名即可:

  1. {  user.map((item, i) => { 
  2.    return  <div  
  3.              className={ 
  4.                classnames(styles.animate,  
  5.                  user.length > 2 && i === 0 ? styles.hidden : ''
  6.                }  
  7.                key={item} 
  8.             > 
  9.                <div className={styles.tx}> 
  10.                  <img src={tx} alt=""/> 
  11.                </div> 
  12.                <span>李老師{item}上線</span> 
  13.             </div>   
  14.           }) 

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)載本文請(qǐng)聯(lián)系趣談前端公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: 趣談前端
相關(guān)推薦

2022-02-20 14:45:33

3D動(dòng)畫CSS3前端

2021-01-05 08:10:00

Css前端3D旋轉(zhuǎn)透視

2012-09-13 09:24:31

CSSJSjQ

2015-10-14 09:50:11

css3動(dòng)畫模擬

2017-05-11 15:20:52

CSS3動(dòng)畫前端

2021-06-09 08:30:52

CSS33D旋轉(zhuǎn)視圖3D動(dòng)畫

2011-06-29 13:22:58

CSS3

2012-09-28 09:37:10

CSSJavaScriptJS

2017-05-03 11:30:20

CSS3小黃人動(dòng)畫

2013-01-30 15:59:29

adobeCSS3HTML5

2014-04-29 10:39:27

CSS3JavaScript

2022-03-28 08:44:15

css3水波動(dòng)畫

2012-05-27 18:28:46

jQuery Mobi

2021-02-09 07:26:38

前端css技術(shù)熱點(diǎn)

2021-03-30 05:58:01

JavascriptCss3轉(zhuǎn)盤小游戲

2012-02-24 09:11:45

jQuery

2023-04-14 16:45:21

CSS前端CSS3

2022-10-11 23:26:54

css3attr函數(shù)

2012-12-26 10:34:56

CSSWeb前端

2024-03-28 09:11:24

CSS3TransitionCSS屬性
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)