成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Intersection Observer API實現視頻隊列自動播放

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

前言

筆者利用空余時間研究了一下javascript的Intersection Observer API,發現其有很大的應用場景,比如圖片或者內容的懶加載,視差動畫等。

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

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

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

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

筆者接下來將直接利用Intersection Observer提供的api來實現視頻在滾動的過程中自動播放的功能,視頻播放插件筆者將使用比較流行的Dplayer,它可以很方便的操作視頻的展現并實現很好的排他性播放控制,并且支持彈幕。

正文

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

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

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

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

import React, { useEffect, useState } from 'react'
import VideoItem from 'components/VideoItem'
import styles from './videoList.less'

const data = [
// 視頻列表
]

function VideoList(props) {
useEffect(() => {
let observerVideo = new IntersectionObserver(
(entries, observer) => {
entries.forEach(entry => {
// 當移入指定區域內后,播放視頻
if(entry.intersectionRatio === 1) {
// 一些操作
return
}
// 停止監聽
// observer.unobserve(entry.target);
});
},
{
root: document.getElementById('scrollView'),
rootMargin: '-180px 0px -180px 0px',
threshold: 1
}
);
document.querySelectorAll('.video-item').forEach(video => { observerVideo.observe(video) });
}, [])
return <div className={styles.videoWrap}>
<div className={styles.list} id="scrollView">
{
data.map(item => {
return <VideoItem src={item} groupName="video-item" key={item} />
})
}
</div>
</div>
}

export default VideoList

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

// VideoItem.js
import React, { useRef, useEffect } from 'react';
import DPlayer from 'dplayer';

export default (props) => {
let videoRef = useRef(null)
let dpRef = useRef(null)
let { src, groupName, curPlaySrc } = props
useEffect(() => {
dpRef.current = new DPlayer({
container: videoRef.current,
screenshot: true,
video: {
url: src,
thumbnails: 'logo.png'
},
logo: 'logo.png'
});
}, [])

useEffect(() => {
// 當當當前應該播放的視頻url等于當前視頻組件的src時,播放視頻
if(curPlaySrc === src) {
dpRef.current.play()
}
}, [curPlaySrc])
return <div data-src={src}>
<div ref={videoRef}></div>
</div>
}

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

// ...
function VideoList(props) {
const [curPlaySrc, setCurPlaySrc] = useState('')
useEffect(() => {
let observerVideo = new IntersectionObserver(
(entries, observer) => {
entries.forEach(entry => {
// 當移入指定區域內后,播放視頻
if(entry.intersectionRatio === 1) {
// 設置當前因該播放的視頻url
setCurPlaySrc(entry.target.dataset.src)
return
}
});
},
{
root: document.getElementById('scrollView'),
rootMargin: '-180px 0px -180px 0px',
threshold: 1
}
);
document.querySelectorAll('.video-item').forEach(video => { observerVideo.observe(video) });
}, [])
return <div className={styles.videoWrap}>
<div className={styles.list} id="scrollView">
{
data.map(item => {
return <VideoItem src={item} groupName="video-item" key={item} curPlaySrc={curPlaySrc} />
})
}
</div>
</div>
}

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

體驗地址:

  • 視頻自動播放demo
  • 仿微信朋友圈動態demo

本文轉載自微信公眾號「趣談前端」,可以通過以下二維碼關注。轉載本文請聯系趣談前端公眾號。

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2022-08-26 12:13:08

APIjavascript視頻

2021-08-30 07:49:32

Javascript西瓜視頻

2022-02-17 14:34:10

viewport項目API

2022-09-22 09:44:39

技術元素

2009-06-02 08:55:43

2018-05-18 14:12:41

Chrome 66自動播放

2017-03-27 09:00:09

Windows 7Windows自動播放

2013-07-01 10:53:05

2024-03-14 08:24:25

MediaCodec解碼播放Android

2011-03-21 10:13:22

Ubuntu自動播放

2009-02-09 09:03:31

自動播放病毒木馬

2021-04-01 08:22:04

微軟Edge瀏覽器

2015-09-01 17:19:02

Chrome音頻

2011-08-03 13:30:08

組策略自動播放

2009-11-24 09:01:21

Windows 7自動播放

2009-10-20 10:05:22

Windows 7策略組關閉自動播放

2009-09-28 08:52:29

Windows 7自動加速自動播放

2015-12-15 10:24:33

facebooksdk開發

2010-01-13 08:46:21

Windows 7USB自動播放

2011-08-23 09:47:20

UbuntuU盤
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产乱码一二三区精品 | 亚洲精品久久久久久国产精华液 | 亚洲午夜精品 | 成人午夜影院 | 黄色香蕉视频在线观看 | 中文字幕av一区 | 国产精品久久久久久久久 | 欧美日韩1区2区 | 2018中文字幕第一页 | 永久看片 | 伊人一区 | 精品久久久网站 | 91性高湖久久久久久久久_久久99 | 久久久久久久国产精品影院 | 久久久久久综合 | 日本久久www成人免 成人久久久久 | av在线伊人| 久久综合欧美 | 九九免费视频 | 精品久久久久久久久久久久 | 亚洲成人精品在线 | 91亚洲国产成人精品一区二三 | 人人性人人性碰国产 | 国产精品久久二区 | 四虎影视1304t| av入口| 一本大道久久a久久精二百 国产成人免费在线 | 91人人澡人人爽 | 国产99视频精品免视看9 | 日韩第一夜 | 狠狠狠 | 日韩欧美一区二区三区四区 | 国产一在线观看 | 中文字幕一区二区三区不卡在线 | 欧美激情网站 | 日韩精品在线网站 | 91综合网 | 欧美激情a∨在线视频播放 成人免费共享视频 | 天堂中文资源在线 | 久久aⅴ乱码一区二区三区 亚洲欧美综合精品另类天天更新 | 亚洲欧美国产一区二区三区 |