JavaScript實(shí)現(xiàn)網(wǎng)頁(yè)播放器
今天我和大家分享用JavaScript在網(wǎng)頁(yè)編寫一個(gè)播放器。
對(duì)于播放器,大家都不陌生,那么要怎么樣才能實(shí)現(xiàn)它呢?
下面是我做的一個(gè)播放器的圖
首先我們從上向下看看這個(gè)播放器,它的最上面是標(biāo)題(head):我的音樂(lè);中間是內(nèi)容(body):歌曲;最下面(foot):控制音樂(lè)播放的控件。標(biāo)題部分就只有標(biāo)題:我的音樂(lè),而中間內(nèi)容部分是歌單,每個(gè)歌曲都有一個(gè)播放圖標(biāo)(音樂(lè)播放時(shí)才有)和歌曲的信息,底部部分有一些控制播放的圖標(biāo)、當(dāng)前播放歌曲名、歌曲播放進(jìn)度還有歌曲播放時(shí)長(zhǎng)。
布局這塊我們要保存結(jié)構(gòu)與樣式分離,結(jié)構(gòu)用HTML寫,樣式用CSS寫。
網(wǎng)頁(yè)結(jié)構(gòu)布局:我的歌曲不是直接寫上去的,是加載json對(duì)象的。所以這里我寫的內(nèi)容部分的歌曲只是一個(gè)格式。上一首/播放、暫停/下一首的圖標(biāo),我是用a標(biāo)簽寫的,圖標(biāo)加在a標(biāo)簽背景上。歌曲播放的進(jìn)度這塊我是用兩個(gè)div實(shí)現(xiàn)的,里面的一個(gè)div顯示灰色當(dāng)作總進(jìn)度,上面的一個(gè)div顯示白色當(dāng)作當(dāng)前歌曲播放進(jìn)度。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="./css/yinyue.css" >
</head>
<body>
<!--整個(gè)播放器部分-->
<div class="music-list">
<!--標(biāo)題部分-->
<div class="head">我的音樂(lè)</div>
<!--內(nèi)容部分-->
<div class="body" id="tbody">
<!--每一首歌曲的格式-->
<div class="item">
<!--歌曲播放時(shí)的小圖標(biāo)-->
<div class="item-logo box11"><img src="imgs/playing.gif"></div>
<!--歌曲信息-->
<div class="item-name">手掌心——丁當(dāng)</div>
</div>
</div>
<!--底部部分-->
<div class="foot">
<!--上一首/播放、暫停/下一首的圖標(biāo)-->
<div class="box1">
<!--上一首的圖標(biāo)-->
<a href="javascript:;" class="btn-pre"></a>
<!--播放、暫停的圖標(biāo)-->
<a href="javascript:;" class="btn-play" id="btnPlay"></a>
<!--下一首的圖標(biāo)-->
<a href="javascript:;" class="btn-next"></a>
</div>
<!--歌曲播放的當(dāng)前時(shí)間-->
<div class="box2 play-current">0.00</div>
<!--歌曲播放的進(jìn)度和歌曲名-->
<div class="box3 mid">
<!--歌曲名-->
<span id="playingNmae" class="m-name">我的音樂(lè)</span>
<!--歌曲播放的進(jìn)度-->
<div class="box31"></div>
<div class="box32"><a href="" class=" rel="external nofollow" dot"></a></div>
</div>
<!--歌曲播放的總時(shí)間-->
<div class="box4 play-duration">4.13</div>
</div>
</div>
<script src="js/data.js"></script>
<script src="js/index.js"></script>
</body>
</html>
網(wǎng)頁(yè)樣式布局:大家可以自己設(shè)置好看的字體、顏色樣式。另外在設(shè)置background: url("../imgs/play-default.png") no-repeat;時(shí)注意:url里面的路徑要寫兩個(gè)點(diǎn)表示退出當(dāng)前目錄,到根目錄。還有背景要設(shè)置no-repeat(不平鋪)。在用絕對(duì)定位時(shí)要遵守子絕父相原則還要注意設(shè)置z-index屬性。
/*去除標(biāo)簽中自帶的內(nèi)外邊距*/
* {
margin: 0;
padding: 0;
}
/*設(shè)置整個(gè)播放器樣式:
布局是彈性盒,
水平居中,
寬度和高度,
帶邊框,
設(shè)置彈性盒子的彈性方向:column(垂直的豎向)
*/
.music-list {
display: flex;
margin: 0 auto;
height: 600px;
width: 400px;
border: 1px solid #ccc;
flex-direction: column;
}
/*設(shè)置標(biāo)題部分*/
.head{
flex: 1;
background: #3498db;
color: #fff;
font: 24px "華文行楷";
display: flex;
/*橫軸居中*/
justify-content: center;
/*縱軸居中*/
align-items: center;
border-bottom: 1px solid white;
box-sizing: border-box;
}
/*設(shè)置內(nèi)容部分*/
.body {
flex: 7;
/*超出部分隱藏*/
overflow-x: hidden;
}
/*設(shè)置底部部分*/
.foot {
flex: 2;
display: flex;
background: #3498db;
color: #fff;
font-size: 14px;
border-top: 1px solid white;
box-sizing: border-box;
}
/*設(shè)置每一首歌曲的格式*/
.item {
display: flex;
height: 50px;
line-height: 50px;
background: #3498db;
color: #fff;
font-size: 14px;
cursor: pointer;
transition: all .5s;
}
/*除了最后一首歌曲其他歌曲都顯示下邊框*/
.item:not(:last-child) {
border-bottom: 1px solid white;
}
/*設(shè)置歌曲播放時(shí)的小圖標(biāo)的背景顏色*/
.box11 {
background: #f0f0f0;
}
/*設(shè)置歌曲信息*/
.item-name {
flex: 6;
/*不挨著邊框?qū)?/
padding: 0 10px;
}
/*鼠標(biāo)懸停的效果*/
.item:hover {
background: #2980b9;
}
/*鼠標(biāo)點(diǎn)擊的效果*/
.item:active {
/*點(diǎn)擊事件想要立體效果可以加盒子陰影,相對(duì)定位*/
position: relative;
top: 2px;
left: 2px;
box-shadow: 5px 5px 10px rgba(0, 0, 0, .5);
}
/*設(shè)置上一首/播放、暫停/下一首的圖標(biāo)的占據(jù)大小*/
.box1 {
flex: 3;
display: inline-block;
}
/*設(shè)置歌曲播放的當(dāng)前時(shí)間的占據(jù)大小*/
.box2 {
flex: 1;
display: inline-block;
padding: 50px 0;
text-align: left;
}
/*設(shè)置歌曲播放的進(jìn)度和歌曲名的占據(jù)大小*/
.box3 {
flex: 5;
display: inline-block;
position: relative;
padding: 35px 0;
}
/*設(shè)置歌曲播放的總時(shí)間的占據(jù)大小*/
.box4 {
flex: 1;
display: inline-block;
padding: 50px 0;
text-align: right;
}
/*分配上一首/播放、暫停/下一首的圖標(biāo)大小*/
.box1 a {
display: inline-block;
margin: 50px 0;
width: 30%;
height: 50%;
}
/*設(shè)置上一首的圖標(biāo)*/
.btn-pre {
background: url("../imgs/pre-default.png") no-repeat;
cursor: pointer;
}
/*設(shè)置上一首的圖標(biāo)鼠標(biāo)懸停效果*/
.btn-pre:hover {
background: url("../imgs/pre-active.png") no-repeat;
}
/*設(shè)置播放的圖標(biāo)*/
.btn-play {
background: url("../imgs/play-default.png") no-repeat;
cursor: pointer;
}
/*設(shè)置播放的圖標(biāo)鼠標(biāo)懸停效果*/
.btn-play:hover {
background: url("../imgs/play-active.png") no-repeat;
}
/*設(shè)置暫停的圖標(biāo)*/
.btn-pause {
background: url("../imgs/pause-default.png") no-repeat;
cursor: pointer;
}
/*設(shè)置暫停的圖標(biāo)鼠標(biāo)懸停效果*/
.btn-pause:hover {
background: url("../imgs/pause-active.png") no-repeat;
}
/*設(shè)置下一首的圖標(biāo)*/
.btn-next {
background: url("../imgs/next-default.png") no-repeat;
cursor: pointer;
}
/*設(shè)置下一首的圖標(biāo)鼠標(biāo)懸停效果*/
.btn-next:hover {
background: url("../imgs/next-active.png") no-repeat;
}
/*設(shè)置歌曲名的字體*/
.m-name {
font: 20px "楷體";
}
/*設(shè)置歌曲播放總進(jìn)度*/
.box31 {
position: absolute;
width: 100%;
height: 2px;
background: #cacaca;
z-index: 1;
}
/*設(shè)置歌曲播放當(dāng)前進(jìn)度*/
.box32 {
position: absolute;
width: 20%;
height: 2px;
background: white;
z-index: 2;
}
/*跟著歌曲播放當(dāng)前進(jìn)度一起動(dòng)的小圓點(diǎn)*/
.dot {
position: absolute;
display: inline-block;
right: 0;
top: -2px;
height: 5px;
width: 5px;
border-radius: 2.5px;
background: #fff;
}
JavaScript代碼:因?yàn)椴シ艌D標(biāo)和暫停圖標(biāo)點(diǎn)擊要交替變化,而且這些圖標(biāo)是當(dāng)作背景顯示的,我們可以只改變a標(biāo)簽的背景就行,就是點(diǎn)擊時(shí)換一個(gè)背景(換背景的方法是換一個(gè)class)。設(shè)置歌曲播放進(jìn)度時(shí)可以看一下audio中的一些事件loadeddata、timeupdate、ended;用ended可以實(shí)現(xiàn):自動(dòng)播放下一首歌曲的功能。在設(shè)置前進(jìn)和后退的功能時(shí)注意要獲取鼠標(biāo)點(diǎn)擊的位置(就是距離開(kāi)始的距離)。通過(guò)給 player.currentTime設(shè)置值可以改變歌曲進(jìn)度。
// 創(chuàng)建一個(gè)播放器dom對(duì)象
var player = document.createElement('audio');
//設(shè)置一個(gè)值保存當(dāng)前播放歌曲的索引
var currentIndex = 0;
//設(shè)置一個(gè)標(biāo)記判斷歌曲是否播放
var isPlay = false;
//動(dòng)態(tài)加載歌曲
(function () {
//設(shè)置一個(gè)值保存所有歌曲dom對(duì)象
var html = '';
//獲取所有歌曲的dom對(duì)象
for (var i = 0; i < musics.length; i++) {
var m = musics[i];
//設(shè)置每一首歌曲的格式
html += `<div class="item" data-index="${i}">
<div class="item-logo box11"></div>
<div class="item-name">${m.name}---${m.artist}</div>
</div>`
}
//添加所有歌曲
document.getElementById('tbody').innerHTML = html;
//給播放器一個(gè)默認(rèn)的播放地址
player.src = musics[currentIndex].path;
})();
//為每一首歌曲設(shè)置點(diǎn)擊事件
var trs = document.querySelectorAll('.item')
for (let i = 0; i < trs.length; i++) {
trs[i].addEventListener('click', function () {
//清除上一首歌曲的播放狀態(tài)
clearStatus();
//獲取歌曲索引
var index = this.dataset.index;
currentIndex = index;
var msc = musics[index];
//給播放器設(shè)置的播放地址
player.src = msc.path;
//開(kāi)始播放
startPlayer();
})
}
//函數(shù):開(kāi)始播放
function startPlayer() {
//設(shè)置播放標(biāo)記
isPlay = true;
// 播放歌曲
player.play();
trs[currentIndex].style.background = '#2980b9';
// 添加播放歌曲的小圖標(biāo)
trs[currentIndex].querySelector('.item-logo').innerHTML = '<img src="imgs/playing.gif">';
//設(shè)置圖標(biāo)為播放狀態(tài)
document.querySelector('#btnPlay').className = 'btn-pause';
//設(shè)置歌曲名
document.querySelector('#playingNmae').innerText = `${musics[currentIndex].name} - ${musics[currentIndex].artist}`;
}
//函數(shù):清除上一首歌曲的播放狀態(tài)
function clearStatus() {
trs[currentIndex].style.background = '';
trs[currentIndex].querySelector('.item-logo').innerHTML = '';
}
//函數(shù):暫停播放
function pausePlay() {
//暫停播放
player.pause();
//設(shè)置播放標(biāo)記
isPlay = false;
//設(shè)置圖標(biāo)為暫停狀態(tài)
document.getElementById('btnPlay').className = 'btn-play';
}
//函數(shù):實(shí)現(xiàn)上一首歌曲功能的點(diǎn)擊事件
document.querySelector('.btn-pre').addEventListener('click', function () {
//暫停播放
pausePlay();
//清除上一首歌曲的播放狀態(tài)
clearStatus();
//實(shí)現(xiàn)上一首歌曲功能
if (currentIndex == 0) {
currentIndex = musics.length - 1;
} else {
--currentIndex;
}
console.log(currentIndex)
//給播放器設(shè)置的播放地址
player.src = musics[currentIndex].path;
startPlayer();
})
//函數(shù):實(shí)現(xiàn)播放歌曲功能的點(diǎn)擊事件
document.getElementById('btnPlay').addEventListener('click', function () {
//通過(guò)判斷播放標(biāo)志
if (isPlay) {
pausePlay();
} else {
startPlayer();
}
})
//函數(shù):實(shí)現(xiàn)下一首歌曲功能的點(diǎn)擊事件
document.querySelector('.btn-next').addEventListener('click', function () {
pausePlay();
clearStatus();
if (currentIndex == musics.length - 1) {
currentIndex = 0;
} else {
++currentIndex;
}
console.log(currentIndex)
player.src = musics[currentIndex].path;
startPlayer();
})
//設(shè)置歌曲播放進(jìn)度
var now = 0;
var total = 0;
//歌曲數(shù)據(jù)加載完后的事件
player.addEventListener('loadeddata', function () {
// 歌曲當(dāng)前的進(jìn)度(時(shí)間)
now = player.currentTime;
// 歌曲總的進(jìn)度(時(shí)間)
total = player.duration;
//把歌曲進(jìn)度(時(shí)間)顯示到播放器上
document.querySelector('.play-current').innerText = fmtTime(now);
document.querySelector('.play-duration').innerText = fmtTime(total);
})
//當(dāng)currentTime(歌曲當(dāng)前進(jìn)度時(shí)間)更新時(shí)會(huì)觸發(fā)timeupdate事件
player.addEventListener('timeupdate', function () {
//獲取歌曲當(dāng)前的進(jìn)度(時(shí)間)
now = player.currentTime;
// 歌曲當(dāng)前的進(jìn)度
var p = now / total * 100 + '%';
//把歌曲當(dāng)前的進(jìn)度同步到進(jìn)度條上
document.querySelector('.box32').style.width = p;
document.querySelector('.play-current').innerText = fmtTime(now);
})
//歌曲結(jié)束事件(自動(dòng)播放下一首歌曲的功能)
player.addEventListener('ended', function () {
//清除上一首歌曲的播放狀態(tài)
clearStatus();
//播放下一首歌曲
currentIndex++;
if (currentIndex >= musics.length) {
currentIndex = 0;
}
player.src = musics[currentIndex].path;
startPlayer();
})
//前進(jìn)歌曲事件
document.querySelector('.box31').addEventListener('click', function (e) {
//獲取鼠標(biāo)點(diǎn)擊的位置
let right = e.offsetX;
// 設(shè)置進(jìn)度條到鼠標(biāo)點(diǎn)擊的位置
document.querySelector('.box32').style.width = right;
//計(jì)算鼠標(biāo)點(diǎn)擊的位置歌曲的進(jìn)度
let seekTo = right/200*total;
//設(shè)置歌曲的進(jìn)度
player.currentTime=seekTo;
})
//后退歌曲事件
document.querySelector('.box32').addEventListener('click', function (e) {
let left = e.offsetX;
document.querySelector('.box32').style.width = left;
let seekTo = left/200*total;
player.currentTime=seekTo;
})
//函數(shù):格式化時(shí)間
function fmtTime(time) {
time *= 1000;
time = new Date(time);
var m = time.getMinutes();
var s = time.getSeconds();
m = m < 10 ? '0' + m : m;
s = s < 10 ? '0' + s : s;
return m + ':' + s;
}
musics:
var musics = [
{
artist: "GALA ",
id: 1,
name: "追夢(mèng)赤子心",
path: "musics/1.mp3"
},
{
artist: "筷子兄弟",
id: 2,
name: "父親",
path: "musics/2.mp3"
},
{
artist: "丁當(dāng)",
id: 3,
name: "手掌心",
path: "musics/3.mp3"
},
{
artist: "佐々木李子",
id: 4,
name: "Good Night",
path: "musics/4.mp3"
},
{
artist: "張韶涵",
id: 5,
name: "隱形的翅膀",
path: "musics/5.mp3",
},
{
artist: "楊丞琳",
id: 6,
name: "雨愛(ài)",
path: "musics/6.mp3",
},
{
artist: "耀樂(lè)團(tuán)",
id: 7,
name: "流星",
path: "musics/7.mp3",
},
{
artist: "逃跑計(jì)劃",
id: 8,
name: "再飛行 (MV版)",
path: "musics/8.mp3",
},
{
artist: "金貴晟",
id: 9,
name: "虹之間",
path: "musics/9.mp3",
}
]

大家學(xué)了jQuery和一些框架之后上面的一些東西就可以用jQuery和框架來(lái)寫,那樣比較方便。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- (jsp/html)網(wǎng)頁(yè)上嵌入播放器(常用播放器代碼整理)
- 運(yùn)用js教你輕松制作html音樂(lè)播放器
- js實(shí)現(xiàn)的萬(wàn)能flv網(wǎng)頁(yè)播放器代碼
- javascript實(shí)現(xiàn)簡(jiǎn)單的html5視頻播放器
- javascript 播放器 控制
- js實(shí)現(xiàn)可兼容IE、FF、Chrome、Opera及Safari的音樂(lè)播放器
- JavaScript實(shí)現(xiàn)帶播放列表的音樂(lè)播放器實(shí)例分享
- Js視頻播放器插件Video.js使用方法詳解
- 比較炫的圖片播放器 js 焦點(diǎn)效果代碼
- JS+html5制作簡(jiǎn)單音樂(lè)播放器
相關(guān)文章
原生javascript如何實(shí)現(xiàn)共享onload事件
這篇文章主要介紹了原生javascript如何實(shí)現(xiàn)共享onload事件,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07
實(shí)現(xiàn)局部遮罩與關(guān)閉原理及代碼
實(shí)現(xiàn)局部遮罩,或許對(duì)某些朋友有著特殊的意義。局部遮罩的原理很簡(jiǎn)單另外加上關(guān)閉就有著另一番的效果,本文將介紹實(shí)現(xiàn)方法,感興趣的朋友可以了解下,或許對(duì)你有所幫助2013-02-02
調(diào)試Node.JS的輔助工具(NodeWatcher)
Node.JS調(diào)試貌似比較麻煩,每次改完了要重啟一下Node進(jìn)程.GOOGLE上有個(gè)NPM模塊,可以監(jiān)控JS文件的更改,然后自動(dòng)重啟Node.但我下載后在windows里運(yùn)行報(bào)錯(cuò)2012-01-01
JS產(chǎn)生隨機(jī)數(shù)的用法小結(jié)
本文給大家分享js產(chǎn)生隨機(jī)數(shù)的用法小結(jié),非常不錯(cuò),具有參考借鑒價(jià)值,感興趣的朋友一起看看吧2016-12-12
js/html光標(biāo)定位的實(shí)現(xiàn)代碼
光標(biāo)定位,想必大家有所了解吧,在本文將為大家介紹的是通過(guò)自定義函數(shù)來(lái)實(shí)現(xiàn)標(biāo)簽元素的定位,感興趣的朋友可以了解下2013-09-09
DataGear開(kāi)發(fā)基于three.js的3D數(shù)據(jù)可視化看板的詳細(xì)代碼
DataGear?支持采用原生的HTML、JavaScript、CSS制作數(shù)據(jù)可視化看板,也支持導(dǎo)入由npm、vite等前端工具構(gòu)建的前端程序包,這篇文章主要介紹了DataGear制作基于three.js的3D數(shù)據(jù)可視化看板,需要的朋友可以參考下2024-02-02

