美文网首页
可拖拽的播放进度条实现

可拖拽的播放进度条实现

作者: 阿西Enzo | 来源:发表于2020-06-28 23:57 被阅读0次

    废话不多少,直接上代码

    # index.js
    import styles from './index.less';
    import React, { Component } from 'react';
    
    
    class PlayProcess extends Component {
        constructor(props) {
            super(props);
            this.state = { 
                autoPaly: false
            }
        }
    
    
        handleClick(e){
            let sepUnit = 24;
            // 进度等格划分
            const len = this.line.clientWidth / sepUnit; //每等份宽度
            // const windowWidth = window.innerWidth - this.line.clientWidth - this.line.offsetLeft;//计算屏幕宽度除去进度条后还剩余宽度,因为offsetLeft算得是相对最近position非static的父节点的偏差,event中坐标是相对整个window的
            // let lineWidth;// 进度条有效宽度
            // if(windowWidth > 0){
            //     lineWidth = e.pageX - this.line.offsetLeft - windowWidth;
            // }else{
            //     lineWidth = e.pageX - this.line.offsetLeft;
            // }
            // const innerWidth = Math.round(lineWidth / len);// 份数计算
            // //转百分比
            // this.innerLine.style.width = ( 100 / sepUnit ) * innerWidth + '%';
            this.innerLine.style.width = 100 * ( e.pageX - this.line.offsetLeft ) / this.line.clientWidth + '%';
        }
    
        handleMouseDown(){
            this.setState({
                drag: true
            });
        }
    
        handleMouseMove(e){
            if(this.state.drag){
                this.innerLine.style.width = 100 * ( e.pageX - this.line.offsetLeft ) / this.line.clientWidth + '%';
            }
        }
    
        handleMouseUp(e){
            this.setState({
                drag: false
            });
        }
    
        handleMouseLeave(){
            this.setState({
                drag: false
            });
        }
    
        togglePlay(){
            this.setState({autoPaly: !this.state.autoPaly});
        }
    
        render() { 
            return (
                <div 
                    ref={ play => {
                        this.play = play 
                    }}
                    style={this.props.style ? this.props.style: {}}
                    className={styles.container}>
                    <span 
                        onClick={e => {
                            this.togglePlay();
                        }}
                        className={styles.playButton}>
                        {this.state.autoPaly 
                            ? <span>pause</span>
                            : <span>play</span>
                        }
                    </span>
                    <span 
                        onClick={e => this.handleClick(e)}
                        onMouseMove={e => this.handleMouseMove(e)}
                        onMouseUp={e => this.handleMouseUp(e)}
                        onMouseLeave={e => this.handleMouseLeave(e)}
                        ref={line => {
                            this.line = line
                        }}
                        className={styles.lineWrap}>
                        <span 
                            ref={innerLine => {
                                this.innerLine = innerLine
                            }}
                            className={styles.lineInner}>
                            <span 
                                onMouseDown={e => this.handleMouseDown(e)}
                                ref={dot => {
                                    this.dot = dot
                                }}
                                className={styles.lineDot}></span>
                        </span>
                    </span>
                </div>
            );
        }
    }
     
    export default PlayProcess;
    
    .container {
        width: 100%;
        height: 30px;
        padding: 5px;
        .playButton {
            
        }
    
        .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%;
              }
            }
        }
    }
    
    
    

    相关文章

      网友评论

          本文标题:可拖拽的播放进度条实现

          本文链接:https://www.haomeiwen.com/subject/vplnfktx.html