从0开始做一个网易云音乐的页面

392 阅读3分钟

前言

网易可以说是做页面做的最好的大厂之一了,网易的程序员一直秉持“把用户当小白”的原则,注重每一个细节的打磨,这也使用户体验极佳,学习如何做它的页面能让我们对HTML5和css有更深的了解,本文将与各位一起探讨网易云音乐的设计理念和技术实现。

模拟器

在pc端我们通过模拟器进行本地调试,模拟器顾名思义,可以完全模拟应用在手机上的复刻。为了确保我们的产品能够完美适配各个不同的手机屏幕,我们一般使用手机型号为iPhone SE的来进行调试,这能保证每个发光点(pt)都能对应实际的2个像素(px),从而呈现更加细腻的画面效果。

结构样式

首先,我们需要创建基本的HTML结构。这个页面将包含一个音频文件、一个音乐按钮、一个滑动容器(使用Swiper库)和几个滑动页面。

音频播放

为了实现音乐的播放和暂停,我们使用了HTML5的标签,并通过JavaScript来控制音频的播放状态。

    <audio id="j-bgm" src="./bgm.mp3"></audio>
// 获取音频元素和音乐按钮元素
const audio = document.getElementById('j-bgm');
const musicBtn = document.querySelector('.music-btn');

    
// 为音乐按钮添加事件监听器
musicBtn.addEventListener('click', function() {
  if (audio.paused) {
    audio.play();
  } else {
    audio.pause();
  }
})

在js里,我们通过检查audio.paused的属性可以判断音频是否处于暂停状态。如果音频暂停,则调用audio.play()方法播放音频;否则,调用audio.pause()方法暂停音频。

滑动翻页

为了实现页面的滑动翻页效果,我们使用了Swiper插件。Swiper是一个非常强大的滑动插件,可以支持多种滑动方向和效果。它还有一个非常牛的特点就是它能自动适应不同屏幕尺寸,确保代码能在各种设备上运行。我们可以通过 <linkrel="stylesheet"href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/css/swiper.min.css">将Swiper 引入

<div class="swiper-container">
  <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 class="swiper-slide"></div>
    <div class="swiper-slide"></div>
  </div>
</div>

完整代码

HTML结构

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>网易云音乐年终总结h5</title>
  <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/css/swiper.min.css">
  <link rel="stylesheet" href="./common.css">
  <style>
  * {
    margin: 0;
    padding: 0;
  }
  </style>
</head>
<body>
  <audio id="j-bgm" src="./bgm.mp3"></audio>
  <div class="next-view-c"></div>
  <div class="music-btn off"></div>
  <!-- 滑页操作 -->
  <div class="swiper-container">
    <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 class="swiper-slide"></div>
      <div class="swiper-slide"></div>
    </div>
  </div>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.0.2/js/swiper.min.js"></script>
  <script>
  // dom 
  const audio = document.getElementById('j-bgm');
  // 选择器
  const musicBtn = document.querySelector('.music-btn');

  musicBtn.addEventListener('click', function() {
    if (audio.paused) {
      audio.play();
    } else {
      audio.pause();
    }
    musicBtn.classList.toggle('off');
    
  })

  // 滑屏
  new Swiper('.swiper-container', {
    direction: 'vertical'
  })

  </script>
</body>
</html>

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/close.png) no-repeat center / cover;
}
.music-btn.off {
  background-image: url(./assert/music.png);
}
/* 单屏 滑屏h5 效果 */
.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);
  position: absolute;
  background-position: center;
  background-size: cover;
}
.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%;
}

有人可能疑问第42行,最后一个0不是没有用吗,为什么还要多此一举呢,其实这正是网易的细节所在,在CSS中使用translate3d时,浏览器会尝试使用GPU(图形处理单元)来处理这些变换,而不是CPU。这可以显著提高动画的性能,特别是在移动设备上。所以即使z值为0,也可以触发硬件加速。

成品如下:

image.png