国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務器之家 - 編程語言 - JavaScript - Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

2021-08-30 23:38趣談前端徐小夕 JavaScript

這里有一個很常見的例子,平時喜歡看短視頻的朋友可能會注意到,我們在瀏覽某視頻頭條時,滾動視頻列表,當某一個視頻滾動到手機的一定位置時(一般可以看成是屏幕中心),該視頻會自動播放,當移出指定區域后視頻會自動關

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

前言

去年利用空余時間研究了一下javascript的Intersection Observer API,發現其有很大的應用場景,比如圖片或者內容的懶加載,視差動畫等。我也在之前的文章中詳細介紹了3種Observer(觀察者)的用法,包括位置監聽,dom變化監聽以及窗口變化監聽,它們有非常多的應用場景,所以很有必要研究明白, 感興趣的可以讀完本片文章之后學習一下(幾個非常有意思的javascript知識點總結).

這里有一個很常見的例子,平時喜歡看短視頻的朋友可能會注意到,我們在瀏覽某視頻頭條時,滾動視頻列表,當某一個視頻滾動到手機的一定位置時(一般可以看成是屏幕中心),該視頻會自動播放,當移出指定區域后視頻會自動關閉并播放移入指定區域的下一個視頻,如下:

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

作為一名好奇心極強的前端工程師,有必要好好研究一下其內部實現。

我的第一思路就是監聽滾動位置來判斷某個視頻元素是否到達指定區域內,但是這種方式需要處理的條件很多,比如邊界條件判斷,滾動方向判斷等,而且頻繁觸發還會出現性能問題。

好在之前深入研究過Intersection Observer API,發現可以使用它提供的API,很方便的監聽到元素在指定根元素下的位置變化,并做一些自定義操作:

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

接下來我將利用Intersection Observer提供的api來實現視頻在滾動的過程中自動播放的功能,如果對該api不太熟悉的朋友可以移步

幾個非常有意思的javascript知識點總結

視頻播放插件筆者將使用比較流行的Dplayer,它可以很方便的操作視頻的展現并實現很好的排他性播放控制,并且支持彈幕。

正文

根據以上的介紹我們大致了解了具體的需求,接下來我們就來基于Intersection Observer API實現一下它。思路大致如下圖所示:

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

具體思路就是我們可以把Intersection Observer的根元素的rootMargin(即根元素的外邊距)設置為如上圖藍色所示區域,然后當視頻完全進入該區域內后(也就是thresholds閾值為1時),觸發當前視頻的播放即可。因為我們使用的是Dplayer,所以我們只要將其配置屬性中的mutex屬性設置為true(為true時會阻止多個播放器同時播放,當前播放器播放時暫停其他播放器)。有關設置rootMargin的知識,可以參考下圖介紹:

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

rootMargin接收格式如下:"10px 0px 10px 0px",從左到右數字依次代表top(上) right(右) bottom(下) left(左)邊距,當然我們單位也可以使用百分比(%),為正值時代表擴大更元素的邊距范圍,負值代表縮小根元素的邊距范圍,這里我們應該縮小范圍,所以rootMargin我們可以這么設置"-180px 0px -180px 0px",這樣上下的邊距就會縮小,當然大家也可以根據需求設置不同的值。

有了以上思路之后我們就可以實現上文動圖所展示的效果了。筆者將采用react來實現,在實現之前我們先準備幾個視頻素材,然后實現列表基本框架:

  1. import React, { useEffect, useState } from 'react' 
  2. import VideoItem from 'components/VideoItem' 
  3. import styles from './videoList.less' 
  4.  
  5. const data = [ 
  6.     // 視頻列表 
  7.  
  8. function VideoList(props) { 
  9.   useEffect(() => { 
  10.     let observerVideo = new IntersectionObserver( 
  11.         (entries, observer) => { 
  12.             entries.forEach(entry => { 
  13.                 // 當移入指定區域內后,播放視頻 
  14.                 if(entry.intersectionRatio === 1) { 
  15.                     // 一些操作 
  16.                     return 
  17.                 } 
  18.                 // 停止監聽 
  19.                 // observer.unobserve(entry.target); 
  20.               }); 
  21.             }, 
  22.             { 
  23.               root: document.getElementById('scrollView'), 
  24.               rootMargin: '-180px 0px -180px 0px'
  25.               threshold: 1 
  26.             } 
  27.         ); 
  28.         document.querySelectorAll('.video-item').forEach(video => { observerVideo.observe(video) }); 
  29.   }, []) 
  30.   return <div className={styles.videoWrap}> 
  31.     <div className={styles.list} id="scrollView"
  32.         { 
  33.             data.map(item => { 
  34.                 return <VideoItem src={item} groupName="video-item" key={item} /> 
  35.             }) 
  36.         } 
  37.     </div> 
  38.   </div> 
  39.  
  40. export default VideoList 

以上代碼中VideoItem組件我們后面會介紹,現在有個問題是我們已經監聽到了需要自動播放的視頻元素,但是我們如何通知VideoItem組件讓其播放呢?這里筆者實現思路是給VideoItem添加一個自定義屬性,該屬性的值就是當前video的src,我們在監聽到某個視頻元素需要播放時,我們可以獲取到之前設置的自定義屬性,然后作為prop傳給VideoItem,當VideoItem組件監聽到該prop變化時,并且等于自身的src,此時則觸發視頻播放。代碼如下:

  1. // VideoItem.js 
  2. import React, { useRef, useEffect } from 'react'
  3. import DPlayer from 'dplayer'
  4.  
  5. export default (props) => { 
  6.     let videoRef = useRef(null
  7.     let dpRef = useRef(null
  8.     let { src, groupName, curPlaySrc } = props 
  9.     useEffect(() => { 
  10.         dpRef.current = new DPlayer({ 
  11.             container: videoRef.current
  12.             screenshot: true
  13.             video: { 
  14.                 url: src, 
  15.                 thumbnails: 'logo.png' 
  16.             }, 
  17.             logo: 'logo.png' 
  18.         }); 
  19.     }, []) 
  20.  
  21.     useEffect(() => { 
  22.         // 當當當前應該播放的視頻url等于當前視頻組件的src時,播放視頻 
  23.         if(curPlaySrc === src) { 
  24.             dpRef.current.play() 
  25.         } 
  26.     }, [curPlaySrc]) 
  27.     return <div data-src={src}> 
  28.         <div ref={videoRef}></div> 
  29.     </div> 

此時視頻列表頁代碼如下:

  1. // ... 
  2. function VideoList(props) { 
  3.   const [curPlaySrc, setCurPlaySrc] = useState(''
  4.   useEffect(() => { 
  5.     let observerVideo = new IntersectionObserver( 
  6.         (entries, observer) => { 
  7.             entries.forEach(entry => { 
  8.                 // 當移入指定區域內后,播放視頻 
  9.                 if(entry.intersectionRatio === 1) { 
  10.                     // 設置當前因該播放的視頻url 
  11.                     setCurPlaySrc(entry.target.dataset.src) 
  12.                     return 
  13.                 } 
  14.               }); 
  15.             }, 
  16.             { 
  17.               root: document.getElementById('scrollView'), 
  18.               rootMargin: '-180px 0px -180px 0px'
  19.               threshold: 1 
  20.             } 
  21.         ); 
  22.         document.querySelectorAll('.video-item').forEach(video => { observerVideo.observe(video) }); 
  23.   }, []) 
  24.   return <div className={styles.videoWrap}> 
  25.     <div className={styles.list} id="scrollView"
  26.         { 
  27.             data.map(item => { 
  28.                 return <VideoItem src={item} groupName="video-item" key={item} curPlaySrc={curPlaySrc} /> 
  29.             }) 
  30.         } 
  31.     </div> 
  32.   </div> 

以上步驟即完成了基于指定區域自動播放視頻的功能,效果如下:

Javascript如何實現類似西瓜視頻的視頻隊列自動播放?

體驗地址

視頻自動播放demo

仿微信朋友圈動態demo

最后

如果想學習更多H5游戲, webpack,node,gulp,css3,javascript,nodeJS,canvas數據可視化等前端知識和實戰,歡迎在公號《趣談前端》加入我們的技術群一起學習討論,共同探索前端的邊界。

原文鏈接:https://mp.weixin.qq.com/s/tRTjYlusWOcHEQqbOhQqXw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 成人欧美一区二区三区在线播放 | 中日韩av| 四房婷婷| 91精彩视频在线观看 | 亚洲精品一二三 | 日韩在线观看中文字幕 | 天堂久久爱资源站www | 一级片免费在线 | 欧美精品国产精品 | 久久99精品久久久久久久青青日本 | 国产乱码精品一区二区三区中文 | 亚洲天堂一区在线 | 国产视频久久久久久久 | 九九国产 | 久久99精品久久久久久园产越南 | 爱爱网av| 国产精品久久久亚洲 | 婷婷毛片| 国产日产精品一区二区三区四区 | 中文字幕在线观看不卡视频 | 国产日韩欧美在线 | 狠狠干夜夜| 狠狠的日 | 日韩一区二区福利 | 欧美电影网站 | 久久精品国产99国产精2020新增功能 | 国产精品永久免费视频 | 欧美成人a| 国产精品成人国产乱一区 | 欧美一区 | 狠狠搞狠狠操 | 亚洲精品二区 | 色天堂影院| 天天干天天看天天操 | 精品无人乱码一区二区三区 | 亚洲免费a | 精品国产乱码久久久久久闺蜜 | 黄色av免费在线 | 成人免费黄色毛片 | 久久九九国产精品 | 毛片免费观看视频 |