使用 HTML、CSS 和 JS 创建在线音乐播放器(含免费完整源码),java反射原理面试题

width: 100%;

height: 100%;

object-fit: cover;

opacity: 0;

transition: 1s;

}

.carousel img.active{

opacity: 1;

}

您可以看到我们在这里使用了 CSS 变量,因此我们将来可以轻松更改此音乐播放器主题。

输出

在这里插入图片描述

请注意,这是为移动视图设计的,这就是为什么我使用 chrome 检查器以移动尺寸查看它的原因。

现在创建水平滚动播放列表。放在home-section里面

HTML

最近播放

华语热歌

古风戏腔

//+3

根据你的喜好

失恋回忆

经典老歌

//+3

CSS

.heading{

margin: 30px 0 10px;

text-transform: capitalize;

font-weight: 400;

font-size: 30px;

}

/* playlists card */

.playlists-group{

position: relative;

width: 100%;

min-height: 200px;

height: auto;

display: flex;

flex-wrap: nowrap;

overflow-x: auto;

}

.playlist-card{

flex: 0 0 auto;

max-width: 150px;

height: 100%;

margin-right: 20px;

}

.playlist-card-img{

width: 100%;

height: 150px;

object-fit: cover;

border-radius: 20px;

}

.playlist-card-name{

width: 100%;

text-align: justify;

font-size: 20px;

text-transform: capitalize;

padding: 5px;

}

输出

在这里插入图片描述

我们完成了home section。但是我们的旋转木马还不起作用,所以让我们使用 js 让它工作。打开app.js文件并开始编码。

const carousel = […document.querySelectorAll(‘.carousel img’)];

let carouselImageIndex = 0;

const changeCarousel = () => {

carousel[carouselImageIndex].classList.toggle(‘active’);

if(carouselImageIndex >= carousel.length - 1){

carouselImageIndex = 0;

} else{

carouselImageIndex++;

}

carousel[carouselImageIndex].classList.toggle(‘active’);

}

setInterval(() => {

changeCarousel();

}, 3000);

您可以看到我们的轮播元素,每 3 秒切换一次图像active类。

在这里插入图片描述

现在让我们制作我们的播放器部分。

🍖 player-section 播放器部分


首先使其最小化视图。

song 1

artist 1

00 : 00

00 : 00

如果你看到我们的播放器结构,你会注意到我们有很多hide元素的类。此类hide指示元素将在最小化视图中隐藏。我们为所有元素提供了相同的类,因此我们可以轻松地在 CSS 中设置它们的样式。

.music-player-section{

width: 100%;

height: 100px;

position: fixed;

bottom: 0;

left: 0;

background: var(–alpha-color);

backdrop-filter: blur(50px);

transition: 1s;

}

.music-seek-bar{

-webkit-appearance: none;

width: 100%;

position: absolute;

top: -4px;

height: 8px;

background: var(–secondary-color);

overflow: hidden;

}

.music-seek-bar::-webkit-slider-thumb{

-webkit-appearance: none;

height: 10px;

width: 5px;

background: var(–primary-color);

cursor: pointer;

box-shadow: -400px 0 0 400px var(–primary-color);

}

.current-song-name{

font-weight: 300;

font-size: 20px;

text-align: center;

margin-top: 5px;

text-transform: capitalize;

}

.controls{

position: relative;

width: 80%;

margin: auto;

display: flex;

justify-content: center;

align-items: center;

height: 60px;

font-size: 30px;

}

.controls span{

display: none;

opacity: 0;

transition: 1s;

}

.music-player-section.active .controls{

justify-content: space-between;

}

.music-player-section.active .controls span{

font-size: 25px;

display: block;

opacity: 0.5;

}

.music-player-section.active .controls span.active{

color: var(–primary-color);

opacity: 1;

}

.controls .main i{

margin: 0 5px;

display: none;

}

.controls .main i.active{

display: inline;

}

现在让我们创建最大化视图的样式。

.music-player-section .hide{

display: none;

opacity: 0;

transition: 1s;

}

.music-player-section.active .hide{

display: block;

opacity: 1;

}

.music-player-section.active{

width: 100%;

height: 100%;

padding: 30px;

display: flex;

flex-direction: column;

}

.music-player-section.active .music-seek-bar{

position: relative;

display: block;

border-radius: 50px;

margin: auto;

}

.music-player-section.active .current-song-name{

font-size: 40px;

}

.music-player-section.active .controls{

width: 100%;

font-size: 50px;

}

.artist-name{

text-align: center;

font-size: 20px;

text-transform: capitalize;

}

.cover{

width: 30vh;

height: 30vh;

object-fit: cover;

margin: auto;

border-radius: 20px;

box-shadow: var(–shadow);

}

.current-time{

position: absolute;

margin-top: 5px;

left: 30px;

}

.duration{

position: absolute;

margin-top: 5px;

right: 30px;

}

.icon{

position: absolute;

top: 60px;

transform: scale(1.3);

}

.back-btn{

left: 40px;

}

.nav-btn{

right: 40px;

}

/* volume button */

.volume-slider{

-webkit-appearance: none;

width: 100px;

height: 40px;

position: absolute;

right: -35px;

bottom: 80px;

transform: rotate(-90deg);

border-radius: 20px;

background: var(–alpha-color);

overflow: hidden;

opacity: 0;

display: none;

}

.volume-slider.active{

opacity: 1;

display: block;

}

.volume-slider::-webkit-slider-thumb{

-webkit-appearance: none;

height: 40px;

width: 10px;

background: var(–primary-color);

box-shadow: -200px 0 1px 200px var(–primary-color);

}

输出

在这里插入图片描述

并检查这些样式,现在像这样将active添加到 class music-player-section 中去。

输出

在这里插入图片描述

我们最终会让这个播放器发挥作用。现在从player section类删除这个active。让我们创建播放列表部分。

🏆 playlist-section 播放列表部分


播放列表

song 1

// +7

CSS

.playlist{

width: 100%;

height: 100%;

position: fixed;

top: 0;

right: -100%;

padding: 30px 0;

background: var(–background);

z-index: 3;

transition: 1s;

overflow: auto;

}

.playlist.active{

right: 0;

}

.title{

font-weight: 300;

font-size: 40px;

text-align: center;

margin-top: 15px;

text-transform: capitalize;

margin-bottom: 30px;

}

.queue{

width: 100%;

height: 80px;

padding: 0 30px;

display: flex;

align-items: center;

border-top: 2px solid var(–alpha-color);

}

.queue-cover{

width: 60px;

height: 60px;

border-radius: 10px;

overflow: hidden;

margin-right: 20px;

position: relative;

}

.queue-cover img{

width: 100%;

height: 100%;

object-fit: cover;

}

.queue-cover i{

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%, -50%);

font-size: 30px;

color: var(–primary-color);

display: none;

}

.queue.active i{

display: block;

}

.queue .name{

font-size: 22px;

text-transform: capitalize;

}

输出

在这里插入图片描述

我们已经完成了所有的造型。active也从播放列表部分删除类。

现在让我们 JS 使这个音乐应用程序功能齐全。

✨ navigation 导航部分


我们的音乐播放器中有三个部分。因此,为这个应用程序设置导航系统对我们来说非常重要。通过它我们可以轻松地从一个部分导航到另一个部分。对?所以编码这个。

/导航

切换音乐播放器

const musicPlayerSection = document.querySelector(‘.music-player-section’);

let clickCount = 1;

musicPlayerSection.addEventListener(‘click’, () => {

if(clickCount >= 2){

musicPlayerSection.classList.add(‘active’);

clickCount = 1;

return;

}

clickCount++;

setTimeout(() => {

clickCount = 1;

}, 250);

})

/// 从音乐播放器返回

const backToHomeBtn = document.querySelector(‘.music-player-section .back-btn’);

backToHomeBtn.addEventListener(‘click’, () => {

musicPlayerSection.classList.remove(‘active’);

})

/// 访问播放列表

const playlistSection = document.querySelector(‘.playlist’);

const navBtn = document.querySelector(‘.music-player-section .nav-btn’);

navBtn.addEventListener(‘click’, () => {

playlistSection.classList.add(‘active’);

})

// 从播放列表返回到音乐播放器

const backToMusicPlayer = document.querySelector(‘.playlist .back-btn’);

backToMusicPlayer.addEventListener(‘click’, () => {

playlistSection.classList.remove(‘active’);

})

//导航完成

这是基本的 JS,我还在代码中添加了注释。因此,如果您对此代码有任何疑问,请随时在讨论中问我。我们的导航完成了。所以让我们创建我们的音乐播放器。

🎶 music 音乐部分


对于音乐播放器,我们的页面中需要一个音频源,但现在我们没有。为此在 index.html 中创建一个音频元素。在 body 标记的开头创建此元素。

现在我们必须创建很多函数,所以在开始之前让我们快速选择我们可能需要进行操作的所有元素。

/// 音乐

let currentMusic = 0;

const music = document.querySelector(‘#audio-source’);

const seekBar = document.querySelector(‘.music-seek-bar’);

const songName = document.querySelector(‘.current-song-name’);

const artistName = document.querySelector(‘.artist-name’);

const coverImage = document.querySelector(‘.cover’);

const currentMusicTime = document.querySelector(‘.current-time’);

const musicDuration = document.querySelector(‘.duration’);

const queue = […document.querySelectorAll(‘.queue’)];

// 在此处选择所有按钮

const forwardBtn = document.querySelector(‘i.fa-forward’);

const backwardBtn = document.querySelector(‘i.fa-backward’);

const playBtn = document.querySelector(‘i.fa-play’);

const pauseBtn = document.querySelector(‘i.fa-pause’);

const repeatBtn = document.querySelector(‘span.fa-redo’);

const volumeBtn = document.querySelector(‘span.fa-volume-up’);

const volumeSlider = document.querySelector(‘.volume-slider’);

现在设置音乐源。

// 音乐设置功能

const setMusic = (i) => {

seekBar.value = 0;

let song = songs[i];

currentMusic = i;

music.src = song.path;

songName.innerHTML = song.name;

artistName.innerHTML = song.artist;

coverImage.src = song.cover;

setTimeout(() => {

seekBar.max = music.duration;

musicDuration.innerHTML = formatTime(music.duration);

}, 300);

currentMusicTime.innerHTML = ‘00 : 00’;

queue.forEach(item => item.classList.remove(‘active’));

queue[currentMusic].classList.add(‘active’);

}

setMusic(0);

你可以注意到,为了设置持续时间,我们调用了formatTime,现在创建这个。

// 格式持续时间为 00 : 00 格式

const formatTime = (time) => {

let min = Math.floor(time / 60);

if(min < 10){

min = 0 + min;

}

let sec = Math.floor(time % 60);

if(sec < 10){

sec = 0 + sec;

}

return ${min} : ${sec};

}

现在让我们添加播放/暂停事件。

// playBtn 点击事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值