0

0

在vue-music中关于Player播放器组件的使用说明

亚连

亚连

发布时间:2018-06-23 17:19:52

|

2056人浏览过

|

来源于php中文网

原创

这篇文章主要为大家详细介绍了vue-music关于player播放器组件的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了关于Player播放器组件的具体内容,供大家参考,具体内容如下

迷你播放器:

1.播放器组件会在各个页面的情况下会打开。 首先在vuex state.js 中定义全局的播放器状态

import {playMode} from 'common/js/config.js';

const state = {
 singer:{}, 
 playing:false, //是否播放
 fullScreen:false, //是否全屏
 playList:[], //播放列表
 sequenceList:[], // 非顺序播放列表
 mode:playMode.sequence, // 播放模式(顺序0,循环1,随机2)
 currentIndex:-1, //当前播放索引
}
export default state 


---------------------------------------------
// config.js

export const playMode = {
 sequence:0,
 loop:1,
 random:2
}

2.进入播放器页面时获取播放列表数据,改变播放状态   在music-list列表中打开

在song-list 组件中派发事件到父组件,传入当前歌曲的信息和索引

  • ------------------------------ selectItem(item,index){ this.$emit('select',item,index) },
  • 在music-list 组件中接受派发事件。

    立即学习前端免费学习笔记(深入)”;

    3. 如果commit 多个状态在actions 里设置

    import {playMode} from 'common/js/config.js'
    
    export const selectPlay = function({commit,state},{list,index}){
     commit(types.SET_SEQUENCE_LIST, list)
     commit(types.SET_PLAYLIST, list)
     commit(types.SET_CURRENT_INDEX, index)
     commit(types.SET_FULL_SCREEN, true)
     commit(types.SET_PLAYING_STATE, true)
    }

    4. 在music-list 组件中 用mapActions提交 改变值

    import {mapActions} from 'vuex'
    
    methods:{
     selectItem(item,index){
      this.selectPlay({
      list:this.songs,
      index
      })
     },
     ...mapActions([
      'selectPlay'
     ])
     },

    5.在palyer 中获取vuex 全局状态,赋值状态到相应位置(代码为完整代码,对照后面讲解慢慢理解)

        // 如果有列表数据则显示

      //如果全屏

    @@##@@    //模糊背景图

        //当前歌曲名称

      //当前歌手名

    @@##@@    //封面图

    {{ format(currentTime) }}

    {{ format(currentSong.duration) }}

    @@##@@

    打开播放器的状态

    import {mapGetters,mapMutations} from 'vuex';
    
    ...mapGetters([
     'fullScreen',
     'playList',
     'currentSong',
     'playing',
     'currentIndex',
    ])

    注意:不可在组件中直接赋值改版vuex 中的状态 this.fullScreen = false 需要通过mutations 改变,定义mutation-types 和mutations 然后 用vuex的 mapMutations 代理方法调用

    [types.SET_FULL_SCREEN](state, flag) {
     state.fullScreen = flag
     },
    
    import {mapGetters,mapMutations} from 'vuex';
    methods:{
     ...mapMutations({
     setFullScreen:"SET_FULL_SCREEN", 
     }),
     back(){
     this.setFullScreen(false)
     },
    }

    设置点击播放按钮方法

     
    togglePlaying(){
     this.setPlayingState(!this.playing); //改变全局变量playing 的属性
    },
    
    // 然后watch 监听playing 操作实际的audio 标签的播放暂停
    watch:{
      playing(newPlaying){
       let audio = this.$refs.audio;
       this.$nextTick(() => {
        newPlaying ? audio.play():audio.pause();
       })
      }
     },
    
    // 用计算属性改变相应的播放暂停图标
    playIcon(){
     return this.playing? 'icon-pause':'icon-play'
    },

    设置点击播放上一首和下一首按钮方法。用mapGetters 获取currentIndex 的值(加一或减一) 并改变,从而改变 currentSong 的状态,监听切换播放。判断播放列表界限重置。

    prev(){
        if(!this.songReady){
          return;
        }
    
     let index = this.currentIndex - 1;
     if(index === -1){    //判断播放列表界限重置
      index = this.playList.length-1;
     }
     this.setCurrentIndex(index);
     if(!this.playing){  //判断是否播放改变播放暂停的icon
      this.togglePlaying();
     }
     this.songReady = false;
    },
    next(){
     if(!this.songReady){
        return;
       }
     let index = this.currentIndex + 1;
     if(index === this.playList.length){    //判断播放列表界限重置
      index = 0;
     }
     this.setCurrentIndex(index);
     if(!this.playing){
      this.togglePlaying();
     }
     this.songReady = false;
    },

    监听audio 元素标签的canpaly 事件,当歌曲加载就绪 和 error 事件,当歌曲发生错误的时候,做用户体验,防止用户快速切换导致报错。

    设置songReady 标志位 如果歌曲没有准备就绪,点击下一首的时候直接return false

    data(){
     return {
      songReady:false,
     }
    },
    
    ready(){
     this.songReady = true;
    },
    error(){
     this.songReady = true;
    },

    进度条

    audio元素监听 timeupdate 事件获取当前播放时间的 可读写属性 时间戳。用formt做格式化时间处理,(_pad 为补零函数 )

    获取音频总时长 currentSong.duration

    {{ format(currentTime) }}

    {{ format(currentSong.duration) }}

    updateTime(e){
     this.currentTime = e.target.currentTime; // 获取当前播放时间段
    },
    
    format(interval){
     interval = interval | 0;
     const minute = interval/60 | 0;
     const second = this._pad(interval % 60);
     return `${minute}:${second}`;  
    },
    
    _pad(num,n=2){
     let len = num.toString().length;
     while(len

    建立progress-bar 组件 接收pencent 进度参数,设置进度条宽度和小球的位置。player组件 设置计算属性percent

    percent(){
     return this.currentTime / this.currentSong.duration  // 当前时长除以总时长
    },

    progress-bar 组件

    DM6在线读报系统
    DM6在线读报系统

    DM6在线读报系统ASPX 免费版2.0。如果您是一个DM广告公司的网站管理员,正在寻求一套程序或源码可以让公司网站具有一套配合网站整体架构的电子杂志频道,那您现在可找对了。请仔细阅读以下关于DM6在线读报系统的说明。 这是一个网站用户可以直接在线阅读报纸且无需插件(连Flash都不用)、无需下载、无需安装的在线读报系统(服务器端模块),通过将此系统放到网站文件目录中即可轻松生成网站的在线读报频道

    下载

    const progressBtnWidth = 16 //小球宽度
    
    props:{
     percent:{
     type:Number,
     default:0
     }
    },
    
    
    watch:{
     percent(newPercent){
     if(newPercent>=0 && !this.touch.initated){    
      const barWidth = this.$refs.progressBar.clientWidth - progressBtnWidth;
      const offsetWidth = newPercent * barWidth;
      this.$refs.progress.style.width = `${offsetWidth}px`;
      this.$refs.progressBtn.style.transform=`translate3d(${offsetWidth}px,0,0)`
     }
     }
    }

    设置拖动

    在进度条小按钮progressBtn 上添加touchstart,touchmove,touchend 事件监听方法,事件添加 prevent 防止拖动默认浏览器行为,获取拖动的信息进行计算

    在实例上创建一个touch 对象维护不同的回调之间的通讯共享状态信息。  touchstart事件方法中 ,首先设置this.touch.initated为true,表示拖动开始。  记录开始点击位置 e.touches[0].pageX 存到 touch 对象上,记录当前的进度宽度。

    在touchmove 中首先判断 是否先进入了 touchstart 方法,计算得到 移动的位置 减去 点击开始的位置的 偏移量长度。 let deltax = e.touches[0].pageX - this.touch.startX

    就可以 设置进度条 已有的长度加上偏移量长度。最大不能超过父级progressbar 的宽度

    调用this._offset(offsetWidth) 方法设置进度条宽度

    在touchend 事件方法中将 this.touch.initated 设置为false,表示拖动结束,并派发事件到player 组件将audio的currentTime 值设置为正确值,参数为pencent

    在progressbar 中增加点击事件,调用this._offset(e.offsetX),并且派发事件

     created(){
     this.touch = {};
     },
    
    methods:{
     progressTouchStart(e){
     this.touch.initiated = true;
     this.touch.startX = e.touches[0].pageX;
     this.touch.left = this.$refs.progress.clientWidth;
     },
     progressTouchMove(e){
     if(!this.touch.initiated){
      return;
     }
     let deltaX = e.touches[0].pageX - this.touch.startX;
     let offsetWidth = Math.min(this.$refs.progressBar.clientWidth - progressBtnWidth,Math.max(0,this.touch.left + deltaX));
     this._offset(offsetWidth);
     },
     progressTouchEnd(e){
     this.touch.initiated = false;
     this._triggerPercent();
     },
     progressClick(e){
     const rect = this.$refs.progressBar.getBoundingClientRect();
     const offsetWidth = e.pageX - rect.left;
     this._offset(offsetWidth);
     // this._offset(e.offsetX);
     this._triggerPercent();
     },
     _offset(offsetWidth){
     this.$refs.progress.style.width = `${offsetWidth}px`;
     this.$refs.progressBtn.style[transform] = `translate3d(${offsetWidth}px,0,0)`;
     },
     _triggerPercent(){
     const barWidth = this.$refs.progressBar.clientWidth - progressBtnWidth;
     const percent = this.$refs.progress.clientWidth / barWidth;
     this.$emit("percentChange",percent)
     }
    },

    本文已被整理到了《Vue.js前端组件学习教程》,欢迎大家学习阅读。

    关于vue.js组件的教程,请大家点击专题vue.js组件学习教程进行学习。

    更多vue学习教程请阅读专题《vue实战教程》

    上面是我整理给大家的,希望今后会对大家有帮助。

    相关文章:

    在vue.js中如何整合mint-ui里的轮播图

    在Jstree中如何实现选中父节点时被禁用的子节点也会选中

    在Vue中关于过滤器filters的用法

    在Javascript中自适应处理方法

    在vue-music中关于Player播放器组件的使用说明在vue-music中关于Player播放器组件的使用说明在vue-music中关于Player播放器组件的使用说明

    相关文章

    PotPlayer播放器
    PotPlayer播放器

    potplayer是一款功能全面的视频播放器,支持各种格式的音频文件,内置了非常强大的解码器功能,能够非常流畅的观看,有需要的小伙伴快来保存下载体验吧!

    下载

    相关标签:

    vue

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

    相关专题

    更多
    Java JVM 原理与性能调优实战
    Java JVM 原理与性能调优实战

    本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

    3

    2026.01.20

    PS使用蒙版相关教程
    PS使用蒙版相关教程

    本专题整合了ps使用蒙版相关教程,阅读专题下面的文章了解更多详细内容。

    55

    2026.01.19

    java用途介绍
    java用途介绍

    本专题整合了java用途功能相关介绍,阅读专题下面的文章了解更多详细内容。

    67

    2026.01.19

    java输出数组相关教程
    java输出数组相关教程

    本专题整合了java输出数组相关教程,阅读专题下面的文章了解更多详细内容。

    37

    2026.01.19

    java接口相关教程
    java接口相关教程

    本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

    10

    2026.01.19

    xml格式相关教程
    xml格式相关教程

    本专题整合了xml格式相关教程汇总,阅读专题下面的文章了解更多详细内容。

    11

    2026.01.19

    PHP WebSocket 实时通信开发
    PHP WebSocket 实时通信开发

    本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

    16

    2026.01.19

    微信聊天记录删除恢复导出教程汇总
    微信聊天记录删除恢复导出教程汇总

    本专题整合了微信聊天记录相关教程大全,阅读专题下面的文章了解更多详细内容。

    152

    2026.01.18

    高德地图升级方法汇总
    高德地图升级方法汇总

    本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

    139

    2026.01.16

    热门下载

    更多
    网站特效
    /
    网站源码
    /
    网站素材
    /
    前端模板

    精品课程

    更多
    相关推荐
    /
    热门推荐
    /
    最新课程
    Vue 教程
    Vue 教程

    共42课时 | 6.8万人学习

    Vue3.x 工具篇--十天技能课堂
    Vue3.x 工具篇--十天技能课堂

    共26课时 | 1.4万人学习

    关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
    php中文网:公益在线php培训,帮助PHP学习者快速成长!
    关注服务号 技术交流群
    PHP中文网订阅号
    每天精选资源文章推送

    Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号