亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

react實現(xiàn)可播放的進(jìn)度條

 更新時間:2022年03月28日 07:41:56   作者:何良語  
這篇文章主要為大家詳細(xì)介紹了react實現(xiàn)可播放的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了react實現(xiàn)可播放進(jìn)度條的具體代碼,供大家參考,具體內(nèi)容如下

實現(xiàn)的效果圖如下:

如果所示,點擊播放按鈕可以播放,進(jìn)度條表示進(jìn)度

功能描述:

1. 點擊播放按鈕可以播放,進(jìn)度條表示進(jìn)度

2. 點擊暫停,進(jìn)度條停止變化

3. 可點擊圓點,進(jìn)行進(jìn)度拖拽

4. 點擊進(jìn)度條可調(diào)節(jié)進(jìn)度

以下是render部分代碼:

<div className="play" ref={play => { this.play = play; }}>
? ? ? ? ? <span className="palyButton" onClick={this.handlePlay}><Icon type="caret-right" style={{ display: this.state.autoPlay ? 'none' : 'inline-block' }} /><Icon type="pause" style={{ display: this.state.autoPlay ? 'inline-block' : 'none' }} /></span>
? ? ? ? ? <span className="lineWrap" onMouseMove={this.handleMouseMove} onMouseUp={this.handleMouseUp} onMouseLeave={this.handleMouseUp} onClick={this.clcikLine} ref={line => { this.line = line; }}>
? ? ? ? ? ? <span className="lineInner" ref={inner => { this.inner = inner; }}>
? ? ? ? ? ? ? <span className="lineDot" onMouseDown={this.handleMouseDown} ref={dot => { this.dot = dot; }} />
? ? ? ? ? ? </span>
? ? ? ? ? </span>
</div>

定義一個最大的div來包裹播放按鈕和進(jìn)度條:

播放按鈕是兩個antd的icon,通過state中的autoPlay來控制顯示哪一個icon

進(jìn)度條的中定義一個外span,是進(jìn)度條的總長度,在這個span里定義一個span,是中間的滑塊,再定義一個span是可拖拽的圓點

以下是這部分的css樣式代碼,只要小圓點使用的絕對定位:

.play{
? ? width: 100%;
? ? height: 30%;
? ? padding: 0 40px;
? ? margin-top: 15px;
? ? .palyButton{
? ? ? margin-right: 22px;
? ? ? cursor: pointer;
? ? ? color: #1DDD92;
? ? ? font-size: 20px;
? ? ? i:last-child{
? ? ? ? font-weight: bold;
? ? ? }
? ? }
? ? .lineWrap{
? ? ? width: 95%;
? ? ? height: 14px;
? ? ? background-color: #2A2F4D;
? ? ? display: inline-block;
? ? ? cursor: pointer;
? ? ? .lineInner{
? ? ? ? width: 10%;
? ? ? ? height: 100%;
? ? ? ? display: inline-block;
? ? ? ? background-color: #1DDD92;
? ? ? ? position: relative;
? ? ? ? .lineDot{
? ? ? ? ? position: absolute;
? ? ? ? ? top: -3px;
? ? ? ? ? right: -10px;
? ? ? ? ? width: 20px;
? ? ? ? ? height: 20px;
? ? ? ? ? display: inline-block;
? ? ? ? ? background-color: #1DDD92;
? ? ? ? ? border: 1px solid #fff;
? ? ? ? ? border-radius: 50%;
? ? ? ? }
? ? ? }
? ? }
? }

功能實現(xiàn)的思想:

1. 點擊進(jìn)度條可以實現(xiàn)進(jìn)度調(diào)整

原理:點擊進(jìn)度條獲取點擊事件的pageX屬性,然后通過減去進(jìn)度條左邊的margin來計算點擊的進(jìn)度條的位置,因為整個頁面的左邊有一個tab切換,這個tab切換可以被隱藏,所以整個進(jìn)度條的寬度是不定的,所以進(jìn)度條的滑塊要使用百分比來實現(xiàn),保證在進(jìn)度條總寬度變化時滑塊的寬度按比例變化:

clcikLine = e => {
? ? const len = this.line.clientWidth / 24;
? ? // 將整個進(jìn)度條分為24份
? ? const windowWidth = window.innerWidth - this.line.clientWidth - this.line.offsetLeft - 20;
? ? let lineWidth;
? ? if (windowWidth > 240) {
? ? ? // 當(dāng)導(dǎo)航顯示時,計算整個滑塊的寬度要減去導(dǎo)航的寬度240px
? ? ? lineWidth = e.pageX - this.line.offsetLeft - 240;
? ? } else {
? ? ? lineWidth = e.pageX - this.line.offsetLeft;
? ? }
? ? // 將最終的滑塊寬度按百分比進(jìn)行轉(zhuǎn)換
? ? const innerWidth = Math.round(lineWidth / len);
? ? this.inner.style.width = 100 / 24 * innerWidth + '%';
? }

2. 點擊播放,進(jìn)度增加,點擊暫停,進(jìn)度停止

handlePlay = () => {
? ? // 設(shè)置播放按鈕
? ? this.setState({
? ? ? autoPlay: !this.state.autoPlay,
? ? });
? ? // 清楚定時器
? ? clearInterval(this.timer);
?
? ? setTimeout(() => {
? ? ? if (this.state.autoPlay) {
? ? ? ? const wrapWidth = this.line.clientWidth;
? ? ? ? const innerWidth = this.inner.clientWidth;
? ? ? ? if (innerWidth < wrapWidth) {
? ? ? ? ? this.timer = setInterval(() => {
? ? ? ? ? ? // 設(shè)置定時器,每1000毫秒執(zhí)行一次,每1000毫秒滑塊長度增加進(jìn)度條的1%長度
? ? ? ? ? ? this.inner.style.width = Math.round(this.inner.clientWidth / this.line.clientWidth * 100) + 1 + '%';
? ? ? ? ? ? // 每次獲得的增加的百分比長度都進(jìn)行四舍五入
? ? ? ? ? ? if (this.inner.clientWidth >= this.line.clientWidth) {
? ? ? ? ? ? ? // 當(dāng)滑塊的長度大于等于進(jìn)度條的長度時,清楚定時器,并且關(guān)閉播放按鈕
? ? ? ? ? ? ? clearInterval(this.timer);
? ? ? ? ? ? ? this.setState({
? ? ? ? ? ? ? ? autoPlay: false
? ? ? ? ? ? ? });
? ? ? ? ? ? }
? ? ? ? ? }, 1000);
? ? ? ? } else {
? ? ? ? ? // 當(dāng)滑塊寬度大于進(jìn)度條寬度時,點擊播放按鈕,延時1000毫秒自動關(guān)閉播放按鈕
? ? ? ? ? setTimeout(() => {
? ? ? ? ? ? this.setState({
? ? ? ? ? ? ? autoPlay: false
? ? ? ? ? ? });
? ? ? ? ? }, 1000);
? ? ? ? }
? ? ? }
? ? }, 20);
? }

3. 圓點可以拖拽,調(diào)整進(jìn)度條進(jìn)度

這個功能中,使用了四個事件,分別是:onMouseMove、onMouseUp、onMouseLeave放在進(jìn)度條上,onMouseDown放在可拖拽的圓點上。

handleMouseDown = e => {
? ? // 鼠標(biāo)按下時打開可拖功能
? ? this.setState({
? ? ? drag: true,
? ? });
? }
?
? handleMouseMove = e => {
? ? // 當(dāng)可拖拽功能打開時
? ? if (this.state.drag) {
? ? ? // 滑塊寬度小于進(jìn)度條寬度或大于0時
? ? ? if (this.inner.clientWidth <= this.line.clientWidth || this.inner.clientWidth <= 0) {
? ? ? ? // 將進(jìn)度條分為200份
? ? ? ? const len = this.line.clientWidth / 200;
? ? ? ? // 判斷導(dǎo)航是否隱藏
? ? ? ? const windowWidth = window.innerWidth - this.line.clientWidth - this.line.offsetLeft - 20;
? ? ? ? let lineWidth;
? ? ? ? if (windowWidth > 240) {
? ? ? ? ? // 導(dǎo)航未隱藏
? ? ? ? ? lineWidth = e.pageX - this.line.offsetLeft - 240;
? ? ? ? } else {
? ? ? ? ? // 導(dǎo)航隱藏
? ? ? ? ? lineWidth = e.pageX - this.line.offsetLeft;
? ? ? ? }
? ? ? ? const innerWidth = Math.round(lineWidth / len);
? ? ? ? // 滑塊寬度每次增加或減少0.5%的寬度
? ? ? ? this.inner.style.width = 0.5 * innerWidth + '%';
? ? ? }
? ? }
? }
?
? handleMouseUp = e => {
? ? // 當(dāng)鼠標(biāo)放開或者離開進(jìn)度條時關(guān)閉拖拽功能
? ? this.setState({
? ? ? drag: false,
? ? });
? }

以上基本實現(xiàn)了這個功能,播放這一塊還會再加?xùn)|西,后期再加入

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 解決React報錯React.Children.only expected to receive single React element child

    解決React報錯React.Children.only expected to rece

    這篇文章主要為大家介紹了React報錯React.Children.only expected to receive single React element child分析解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • react滾動加載useInfiniteScroll?詳解

    react滾動加載useInfiniteScroll?詳解

    使用useInfiniteScroll?hook可以處理檢測用戶何時滾動到頁面底部的邏輯,并觸發(fā)回調(diào)函數(shù)以加載更多數(shù)據(jù),它還提供了一種簡單的方法來管理加載和錯誤消息的狀態(tài),今天通過實例代碼介紹下react滾動加載useInfiniteScroll?相關(guān)知識,感興趣的朋友跟隨小編一起看看吧
    2023-09-09
  • React通過hook實現(xiàn)封裝表格常用功能

    React通過hook實現(xiàn)封裝表格常用功能

    這篇文章主要為大家詳細(xì)介紹了React通過hook封裝表格常用功能的使用,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以參考下
    2023-12-12
  • react底層的四大核心內(nèi)容架構(gòu)詳解

    react底層的四大核心內(nèi)容架構(gòu)詳解

    這篇文章主要為大家詳細(xì)介紹了react四大核心內(nèi)容架構(gòu),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • flouting?ui定位組件完美替代ant?deisgn使用詳解

    flouting?ui定位組件完美替代ant?deisgn使用詳解

    這篇文章主要為大家介紹了flouting?ui定位組件完美替代ant?deisgn使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • react實現(xiàn)動態(tài)表單

    react實現(xiàn)動態(tài)表單

    這篇文章主要為大家詳細(xì)介紹了react實現(xiàn)動態(tài)表單,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • React懶加載實現(xiàn)原理深入分析

    React懶加載實現(xiàn)原理深入分析

    懶加載意思是不會預(yù)加載,而是需要使用某段代碼,某個組件或者某張圖片時,才加載他們(延遲加載),這篇文章主要介紹了React懶加載實現(xiàn)原理
    2022-11-11
  • React Hooks與setInterval的踩坑問題小結(jié)

    React Hooks與setInterval的踩坑問題小結(jié)

    本文主要介紹了React Hooks與setInterval的踩坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • React合成事件及Test Utilities在Facebook內(nèi)部進(jìn)行測試

    React合成事件及Test Utilities在Facebook內(nèi)部進(jìn)行測試

    這篇文章主要介紹了React合成事件及Test Utilities在Facebook內(nèi)部進(jìn)行測試,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • react入門級詳細(xì)筆記

    react入門級詳細(xì)筆記

    這篇文章講述了React的基本介紹,基本使用和React相關(guān)js庫.通過這篇文章可以入門React的使用,可以快速上手使用React進(jìn)行代碼的編寫
    2021-06-06

最新評論