本项目为网易云音乐的HTML5页面开发实践,旨在通过创建一个简单的音乐播放器页面,掌握H5页面的基本构建方法和技术应用。此页面包括音乐播放控制、页面滑动效果等功能,并且注重移动端适配及优化今天实现网易云歌单页面,探讨一下实现细节
这一天是程序员特殊的日子,网易公司大发慈悲允许程序猿肖摆摆 上班时间开摆,自己做个音乐页面,展现程序员独特的审美魅力。肖摆摆,二话不说,把网易云音乐配合上网易vlog进行页面设计。他一挥手设计出HTML5页面,但是遇到css修改页面渲染属性就不得不多摸摸光秃秃的脑袋了。‘叮叮’ ~~ 原来是直接设置的最后5分钟下班铃声响了。看着,差不多渲染好的页面,肖摆摆做了最后的冲刺——把页面改成滑屏式,配合iPhone 手机 750px 标准调整了格式....
故事后面其实还没完。但是废话不多说,进入网易Music页面看看去吧
一、先上代码
- HTML结构:建立index.html文件,主要设计操作
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>网易music</title>
<!-- 引入 Swiper 库的 CSS 文件,用于实现滑动效果。 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/css/swiper.min.css">
<link rel="stylesheet" href="./common.css">
</head>
<body>
<audio id="j-bjm" src="./bgm.mp3" ></audio>
<div class="next-view-c"></div>
<!-- 音乐按钮 点击事件进行控制 -->
<div class="music-btn off"></div>
<!-- 划页效果 -->
<div class="swiper-container">
<!-- Swiper 容器的包装元素,包含多个滑动页面 -->
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="view index">
<div class="logo-c"> </div>
</div>
</div>
<div class="swiper-slide"></div>
<div class="swiper-slide"></div>
</div>
</div>
<!-- 引入 Swiper 库的 JavaScript 文件,用于实现滑动效果 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/js/swiper.min.js"></script>
<script>
// dom 操作,id 和 类名selector 选择器
// id 获取音乐元素j-bjm,通过类选择器获得 music-btn 按钮
const audio = document.getElementById('j-bjm');
const musicBtn = document.querySelector('.music-btn');
musicBtn.addEventListener('click',function() {
if(audio.paused) { //暂停
audio.play();
}else {
audio.pause();
}
musicBtn.classList.toggle('off'); // 切换类名
});
// <!-- 滑屏 使用 Swiper 库创建一个垂直方向的滑动页面 -->
new Swiper('.swiper-container',{
direction: 'vertical'
})
</script>
</body>
</html>
-
CSS样式:建立common.css文件,渲染页面
* { margin: 0; padding: 0; } html, body { width: 100%; height: 100%; } .music-btn { z-index: 999; position: fixed; top: 25px; left: 25px; width: 40px; height: 40px; background: url(./assert/assert/close.png) no-repeat center / cover; } .music-btn.off { background-image: url(./assert/assert/music.png); } .swiper-container { width: 100%; height: 100%; } .swiper-slide { background-color: green; } .swiper-slide:nth-child(odd) { background-color: pink; } .next-view-c { z-index: 999; background: url(http://s5.music.126.net/static_public/5c21db8d4684556c72180904/gx.4ae36e08269404412ecdb99e9453ca17.svg); background-size: 100%; left: 50%; bottom: 10px; width: 13px; height: 86px; position: fixed; transform: translate3d(-50%, 0, 0); } .view { width: 100%; height: 100%; overflow: hidden; } .view.index { background: url(http://s5.music.126.net/static_public/5c21db8d4684556c72180904/bgg.d78404cec29e5275598b87d1716f0592.png); background-size: cover; background-position: center; } .logo-c { position: absolute; top: 5.6%; right: 15%; width: 186px; height: 218px; background: url(http://s5.music.126.net/static_public/5c21db8d4684556c72180904/title@2x.7c87506dfb012b9dfac5fdd39e2ccb06.png) no-repeat; background-size: 100%; }
二、技术要点
1. H5基础
-
手机网页特性 模拟器调试:
-
在开发过程中,需要考虑不同设备的屏幕分辨率,确保页面在各种设备上的良好展示。
-
开发阶段可以通过
模拟器进行本地调试,通常依据iPhone标准尺寸750px进行设计。 -
对于Retina屏幕等高清设备,实际物理宽度可能达到1500px,此时
1个物理点对应多个像素(如2px)。 -
最终需在真实设备上测试,确保交互流畅性和视觉效果。
-
H5页面适用于移动设备,易于通过社交媒体分享,形成病毒式传播。
-
2. Audio元素
-
音乐播放限制:
- 近年来,为了防止未经用户许可的音频自动播放,浏览器对
<audio>标签的使用施加了限制,要求必须由用户操作触发播放。 - 可以通过JavaScript调用
play()方法来启动音乐播放,但前提是用户已执行过页面内的某个动作,如点击按钮。
- 近年来,为了防止未经用户许可的音频自动播放,浏览器对
3. DOM操作
-
获取DOM元素:
document.getElementById('id'):通过ID获取单个元素。document.querySelector('选择器'):根据CSS选择器获取第一个匹配的元素。
-
添加事件监听:
- 使用
addEventListener方法为DOM元素添加事件监听器,如点击事件。
- 使用
4. CSS高级技巧
-
类名切换:
classList.toggle用于切换元素的类名,常用于状态切换场景,如播放/暂停按钮的状态管理。- 示例中,点击音乐按钮时,通过切换
.off类名改变按钮图标。
-
背景设置:
background-size: cover;使背景图片等比例缩放至完全覆盖背景区域。background-position: center;确保背景图片在容器中居中显示。
-
GPU加速[得懂]:
-
虽然transform也是水平滑动,使用
transform: translate3d(x, y, z)可以触发GPU加速,提高动画性能。 -
结合
left: 50%; transform: translate3d(-50%, 0, 0);实现元素水平居中定位。 -
用* 设置padding和margin,
重置默认样式,统一页面外观。 -
定义音乐按钮、滑动页面等组件的样式,注意使用适当的层级关系(如z-index)保证元素正确显示。
-
6. 补充设计模式
-
封装:
- 将相似的功能或数据封装成函数或对象,对外提供简洁的接口,减少外部依赖。
- 如音频播放逻辑可封装为单独的模块。
-
继承:
不同的页面组件可以继承自基类,共享通用属性和方法。例如:CSS 可以通过一些方式来模拟继承的效果:
- 1.元素继承:某些 CSS 属性会自动从父元素继承到子元素,例如
color、font-family、font-size等。例如:
- 1.元素继承:某些 CSS 属性会自动从父元素继承到子元素,例如
// 在这个 HTML 示例中,`<p>` 元素会继承 `<div>` 元素的 `color` 属性。
<div style="color: red;">
<p>This paragraph will inherit the red color from its parent div.</p>
</div>
- 2.类继承(通过组合) :可以通过组合多个类来模拟继承,例如:
.base-class {
font-size: 16px;
color: blue;
}
.derived-class {
/* 继承 base-class 的属性 */
font-size: inherit;
color: inherit;
/* 添加自己的属性 */
background-color: yellow;
}
-
多态:
- 允许子类重写父类的方法,实现相同接口下的不同行为。
- 在本项目中,音乐按钮的不同状态(播放/暂停)可通过切换类名实现外观变化,体现了多态性。
人家准点下班了。肖摆摆的故事还在继续...