• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
    問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
    當前位置: 首頁 - 科技 - 知識百科 - 正文

    vue一個頁面實現音樂播放器的示例

    來源:懂視網 責編:小采 時間:2020-11-27 22:20:09
    文檔

    vue一個頁面實現音樂播放器的示例

    vue一個頁面實現音樂播放器的示例:本文介紹了vue一個頁面實現音樂播放器的示例,分享給大家,具體如下: 效果如下: 項目地址:https://github.com/ermu592275254/MiniMusicPlayer 演示地址: https://ermu592275254.github.io/MiniMusicPlayer/(歌曲鏈接已
    推薦度:
    導讀vue一個頁面實現音樂播放器的示例:本文介紹了vue一個頁面實現音樂播放器的示例,分享給大家,具體如下: 效果如下: 項目地址:https://github.com/ermu592275254/MiniMusicPlayer 演示地址: https://ermu592275254.github.io/MiniMusicPlayer/(歌曲鏈接已

    本文介紹了vue一個頁面實現音樂播放器的示例,分享給大家,具體如下:

    效果如下:

    項目地址:https://github.com/ermu592275254/MiniMusicPlayer

    演示地址: https://ermu592275254.github.io/MiniMusicPlayer/(歌曲鏈接已失效)

    開發前構思

    界面

    做音樂播放器,界面一定要炫酷。太low了聽歌沒感覺。本身是為了在上班的時候用,于是做成了一個類似網易云音樂的界面,大小合適。不用兼容手機端。

    用css做圖標

    本懷著簡單實用的需求去考慮,圖標可用SVG、url或者css。相對于url,SVG和css更好一些。為了修煉,最終選擇的css。利用好after和before,能減少很多dom嵌套。

    .next {
     position: relative;
     display: inline-block;
     height: 36px;
     width: 36px;
     border: 2px solid #fff;
     border-radius: 20px;
     -webkit-border-radius: 20px;
     -moz-border-radius: 20px;
    }
     
    .next:before {
     content: '';
     height: 0;
     width: 0;
     display: block;
     border: 10px transparent solid;
     border-right-width: 0;
     border-left-color: #fff;
     position: absolute;
     top: 8px;
     left: 10px;
    }
    
    .next:after {
     content: '';
     height: 20px;
     width: 4px;
     display: block;
     background: #fff;
     position: absolute;
     top: 8px;
     left: 22px;
    }
    
    

    畫一個唱片

    網易云的唱片很好看,我也要弄一個唱片! 用好 box-shadow ,一個元素便可以做成很好看的唱片效果。

    .disc {
     position: relative;
     margin-top: 10%;
     margin-left: 10%;
     width: 300px;
     height: 300px;
     border-radius: 300px;
     transform: rotate(45deg);
     background-image: radial-gradient(5em 30em ellipse, #fff, #000);
     border: 2px solid #131313;
     box-shadow: 0 0 0 10px #343935;
     opacity: 0.7;
    }
    

    用range做進度條

    audio本身的樣式很難看,并且不同的瀏覽器呈現出來的效果也不一樣。當然你可以修改audio的樣式,傳統的做法是通過controls屬性來隱藏audio,然后用div來代替。現在是html5時代了,當然要用更符合場景的新元素————range。

    input[type=range] {
     -webkit-appearance: none;
     width: 80%;
     height: 8px;
     border-radius: 10px;
     background-color: #fff;
    }
    input[type=range]::-webkit-slider-thumb{
     -webkit-appearance: none;
    } 
    input[type=range]::-webkit-slider-runnable-track {
     height: 8px;
     border-radius: 20px;
    }
    input[type=range]:focus {
     outline: none;
    }
    
    input[type=range]::-webkit-slider-thumb {
     -webkit-appearance: none;
     margin-top: -3px;
     height: 14px;
     width: 14px;
     background: #eb7470;
     border-radius: 50%;
     border: solid 3px #fff;
     box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.5);
    }
    

    背景濾鏡模糊

    將圖片設置為背景的感覺很棒,可以說整個播放器的顏值這背景提供了一半。設置也非常簡單,用到了css3的濾鏡。

    .bg-blur {
     position: absolute;
     top: 50%;
     left: 50%;
     transform: translate(-50%, -50%);
     width: 100%;
     height: 100%;
     background-position: center;
     background-repeat: no-repeat;
     background-size: cover;
     filter: blur(20px);
     z-index: -1;
    }
    

    背景圖片通過js控制。

    <div class="bg-blur" :style="`background-image:url(${currentSong.album_logo})`"></div>

    歌曲資源

    爬下接口

    直接去蝦米官網打開network,將url復制到postman里面去做請求。通過修改headers發現,會校驗Referer。也就是說只有蝦米允許的域名可以訪問此接口。 http://api.xiami.com/web?v=2.0&app_key=1&key=aliez&page=1&limit=5&callback=jsonp154&r=search/songs

    解決跨域問題

    因為接口支持jsonp。起初嘗試將chrome瀏覽器設置跨域,然后通過$.ajax去做一個jsonp的請求。可以正常訪問。

    之后突然不行了,是不是蝦米做了限制?

    遂改用node啟動一個服務,去偽造referer發起請求,再將請求轉發到頁面。無意中寫了一個代理。

    ...
    case '/song':
     let songOptions = {
     url: 'http://api.xiami.com/web?'+ urlArr[1],
     headers: {
     'Referer': 'http://m.xiami.com/'
     }
     };
     function callback1(error, response, body) {
     if (!error && response.statusCode == 200) {
     res.end(body);
     }
     }
     request(songOptions, callback1);
     break;
    ...
    

    歌詞滾動

    作為一款逼格比較高的播放器,歌詞滾動是必須的。

    原理

    將每一句歌詞保存為一個對象,有對應的時間。當歌曲播放的當前時長大于或等于歌詞的時間,小于此歌詞的下一句歌詞的時間,那么就將此歌詞滾動到可視區域。并且修改字體顏色。

    格式化歌詞

    接口返回的歌詞一臉懵逼,仔細研究一下,發現是有規律的。

    [ti:aLIEz]
    [ar:SawanoHiroyuki[nZk]:mizuki]
    [al:o1]
    [ly:澤野弘之]
    [mu:澤野弘之]
    [ma:]
    [pu:]
    [by:ttpod]
    [total:268512]
    [offset:0]
    [00:00.000]<195>aLIEz <199>- <451>SawanoHiroyuki[nZk]:mizuki
    [x-trans]徹頭徹尾的謊言 - SawanoHiroyuki[nZk]:mizuki
    [00:01.095]<201>作<250>詞<200>:<201>澤<200>野<199>弘<300>之
    [x-trans]
    [00:02.846]<200>作<150>曲<150>:<200>澤<200>野<351>弘<349>之
    [x-trans]
    [00:20.828]<200>決<250>め<200>つ<201>け<149>ば<201>か<349>り
    [x-trans]一直獨斷專權
    [00:23.279]<200>自<200>惚<200>れ<200>を<200>著<400>た
    [x-trans]總是自負逞強
    [00:24.979]<200>チ<200>ー<200>プ<450>な<550>hokori<350>で
    [x-trans]明明只是一文不值的驕傲
    ......
     refactoringLyrics(lyric){
     let text = lyric.split('[offset:0]')[1];
     let textArr = text.split('\n');
     let lyricsArr = [], translate = [];
     textArr.forEach((item, index) => {
     let time = 0, text = '';
     if (item.indexOf('[x-trans]') > -1) {
     translate.push(item.split('[x-trans]')[1])
     } else if (item.trim() != '') {
     time = item.slice(1, 6).split(':');
     time = parseInt(time[0]) * 60 + parseInt(time[1]);
     text = item.slice(11);
     let arr = text.split('>');
     let str = arr.reduce((a, b) => {
     return a.split('<')[0] + b.split('<')[0]
     });
     let obj = {
     time: time,
     text: str
     };
     lyricsArr.push(obj);
     }
     });
     for (let i in translate) {
     lyricsArr[i].text = lyricsArr[i].text + '\n' + translate[i];
     }
     this.currentLyrics = lyricsArr;
    },
    

    搜索欄實現

    同文件下子組件掛載

    為了遵循模塊化開發,決定將搜索欄寫成一個子組件。在同一頁面下寫子組件,子組件掛載到對應的template就有講究了。此template不能被父組件的掛載元素包含,否則父組件渲染時會因為無法渲染子組件中的數據而報undefined。

    <div id="app" class="main">
    ...
    </div>
    <template id="search-box">
    ...
    </template>
    
    var searchBox = {
     template: '#search-box',
     props: {
     isShow: Boolean,
     openFun: Function
     },
     data(){
     return {
     resultList: [],
     searchValue: '',
     }
     },
     methods: {
     }
     };
     new Vue({
     el: '#app',
     components: {
     'com-tip': tip,
     'search-box': searchBox
     },
     ...
    })
    
    

    eventBus解決數據傳輸

    通過jsonp去請求數據,需要設置一個callback函數,此callback寫成一個全局函數,如果不這樣寫,而是通過 searchBox.methods.callback的形式,this指向將為methods。而無法直接給searchBox的data賦值。 于是通過eventBus來處理,這樣更易維護。

    var EventBus = new Vue();
    var callBack = function(result) {
     console.log(result);
     EventBus.$emit('callBack', result);
    };
    ...
    mounted(){
     let self = this;
     EventBus.$on('callBack', function(res) {
     if (res && res.data) {
     self.resultList = res.data.songs;
     }
     })
    }
    ...
    

    localStrong儲存歌曲信息

    下次再打開,應該播放列表應該保留上一次的數據,這個可直接用localstrong實現

    踩了坑

    prop傳遞數據

    使用cdn,vue的prop只支持中線格式,駝峰格式不生效

    ps: 在用webpack打包的項目中用駝峰是可以,在打包過程中,會做處理。

    // 正確寫法
    <search-box :is-show="showSearch" :open-fun="openSearch" @push-song="pushNewSong"
     @play-song="playSong"></search-box>
    // 錯誤寫法
    <search-box :isShow="showSearch" :openFun="openSearch" @pushSong="pushNewSong"
     @playSong="playSong"></search-box>

    待優化

    手動修改進度,偶爾會不生效。

    搜索暫不支持分頁

    不支持建歌單

    背景顏色與進度條顏色相近需修改進度條顏色

    不支持播放模式選擇-單曲循環-隨機播放

    聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    vue一個頁面實現音樂播放器的示例

    vue一個頁面實現音樂播放器的示例:本文介紹了vue一個頁面實現音樂播放器的示例,分享給大家,具體如下: 效果如下: 項目地址:https://github.com/ermu592275254/MiniMusicPlayer 演示地址: https://ermu592275254.github.io/MiniMusicPlayer/(歌曲鏈接已
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 久久99精品综合国产首页| 亚洲精品国产成人专区| 伊人久久精品线影院| 亚洲精品无码鲁网中文电影| 四虎精品影院永久在线播放| 久久99国产综合精品免费| 看99视频日韩精品| 久久精品国产一区| 精品无码人妻一区二区三区| 亚洲国产av无码精品| 精品国精品国产自在久国产应用男| 精品视频一区二区三区在线观看 | 亚洲精品制服丝袜四区| 精品国产综合区久久久久久| Xx性欧美肥妇精品久久久久久 | 国产精品无码av在线播放| 在线精品亚洲一区二区小说| 精品无码人妻一区二区三区不卡 | 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 国产精品午夜一级毛片密呀| 欧美大片日韩精品| 91国在线啪精品一区| 久久99精品国产自在现线小黄鸭| 中文字幕久精品免费视频| 日韩精品视频在线观看免费| 久久国产成人精品国产成人亚洲| 国产精品美女久久久久AV福利| 亚洲午夜久久久精品影院| 四虎国产精品永久地址99新强 | 日韩精品欧美激情国产一区| 欧美日韩精品一区二区三区不卡 | 91精品国产人成网站| 久久免费国产精品一区二区| 久久精品国产秦先生| 免费视频精品一区二区三区| 欧美日韩精品一区二区| 久久96国产精品久久久| 四虎成人www国产精品| 国产精品福利片免费看| 精品无码久久久久久国产| 亚洲精品色婷婷在线影院|