vue+element实现美观大方好看的音乐网站,仿照咪咕音乐网

news2025/1/12 13:24:58

目录

一、前言

二、实现及效果图

1.效果图

 2.项目结构、设计说明

 3.顶部菜单

 4.首页轮播图

 5.歌单推荐

三、总结


一、前言

咪咕音乐网,最近看到其官网,第一感觉真的很美观大方,有被它惊艳到。所以作者忍不住做了一版仿照咪咕音乐的demo。

与音乐相关的demo,之前也发过一篇关于QQ音乐的demo,可以访问:

《vue+element高度仿照QQ音乐,完美实现PC端QQ音乐》

二、实现及效果图

1.效果图

 

 

 2.项目结构、设计说明

 项目以vue项目创建,前端某些元素使用element,项目启动执行的命令为:

  1. npm install
  2. npm run dev

结构如下截图,项目已经集成和实现了需要请求后端接口的一切功能,所以无须花费精力去考虑前端如何去对接后端和接口,可以把一切精力放在实现前端界面设计上来。

这样不懂后端的伙伴也省心省力,接口请求只需按照模板去copy就好,无非就是get/post/delete/put等请求方式和参数传递的差别,当然不明白的可以细问作者。

项目结构还是分为:顶部+具体功能显示容器+底部,页面存放于src/page目录下,看目录命名就能明白其含义,具体功能页面在views目录下。

路由在router目录中,全局布局公用样式在styles,比如整个项目框架左右空间布局,最小宽度等。

路由权限也是很重要的一个功能,为permission.js,所有页面跳转都会经过其拦截,有人问,路由权限有什么用,好说,比如订单页面或个人中心页面吧,肯定是需要登录才能访问的,首页却是无需登录即可访问的,那么就可以在permission.js里面获取登录token,有token即表示已经登录,可以访问订单或个人中心页面,否则跳转登录页等。

 3.顶部菜单

顶部菜单分为两级菜单,交互为鼠标聚焦触发

源码实现:

<template>
  <div id="header">
    <div class="contain-box header">
      <h1 class="logo">
        <a href="https://music.migu.cn" title="咪咕音乐 music.migu.cn">
          <img src="../../../public/img/logo.png" alt="咪咕音乐 放厮听·趣玩乐">
        </a>
      </h1>
      <div class="header-left">
        <ul class="nav-container">
          <li class="nav-item on" data-nav-type="music" @mouseover="onMouseOver(1)">
            <a class="header-tag" target="">
              <span>音乐</span>
            </a>
          </li>
          <li class="nav-item " data-nav-type="video" @mouseover="onMouseOver(2)">
            <a class="header-tag" target="">
              <span>现场</span>
            </a>
          </li>
          <li class="nav-item " data-nav-type="vip">
            <a class="header-tag vip" target="">
              <span>会员中心</span>
            </a>
          </li>
          <li class="nav-item " data-nav-type="yyr">
            <a class="header-tag" target="_blank">
              <span>破壳平台</span>
            </a>
          </li>
          <li class="nav-item " data-nav-type="app">
            <a class="header-tag" target="_blank">
              <span>客户端下载</span>
            </a>
          </li>
        </ul>
      </div>
      <div class="header-right">
        <div class="search smallinp show">
          <div class="ipt">
            <input type="text" id="search_ipt" autocomplete="off" placeholder="搜索歌曲、歌手、MV">
            <span class="btn-search">
            <i class="el-icon-search"></i>
            </span>
          </div>
          <ul class="J_search_list" id="J_search_list"></ul>
        </div>
        <div id="J-user-info" class="default-user show">
          <a id="J_login">
            <img src="../../../public/img/no-login.png" alt="" class="default-avatar">
          </a>
        </div>
      </div>


    </div>

    <div class="sub-header">
      <div class="contain-box">
        <ul class="music show" :style="subMenuIndex===1?'display: block;':'display: none;'">
          <li class="on">
            <a>首页</a>
          </li>
          <li class="">
            <a>歌单</a>
          </li>
          <li class="">
            <a>专辑</a>
          </li>
          <li class="">
            <a>榜单</a>
          </li>
          <li class="">
            <a>歌手</a>
          </li>
          <li class="">
            <a>彩铃</a>
          </li>
        </ul>
        <ul class="video hide" :style="subMenuIndex===2?'display: block;':'display: none;'">
          <li class="">
            <a>首页</a>
          </li>
          <li class="">
            <a>演唱会</a>
          </li>
          <li class="">
            <a>独家放送</a>
          </li>
          <li class="">
            <a>MV</a>
          </li>
        </ul>
      </div>
    </div>

  </div>
</template>

<script>
  export default {
      data() {
        return {
          subMenuIndex: 1,//子菜单显示
        };
      },
      mounted() {
      },
      methods: {
        onMouseOver(index){//鼠标聚焦显示二级菜单
          this.subMenuIndex = index;
        }
      }
    };
</script>

 4.首页轮播图

轮播图使用element的走马灯效果,element好处就是简单方便使用。

Element - The world's most popular Vue UI framework

 

 5.歌单推荐

模仿官方样式,鼠标聚焦显示播放按钮,同时显示音波震动效果

源码实现

<div id="playlist" class="section contain-box">
      <div class="container section-header">
        <h2 class="title">歌单推荐</h2>
        <a class="more">更多<i class="iconfont el-icon-arrow-right"></i></a>
      </div>
      <div class="container">
        <div class="wrapper-contain">
          <div class="wrapper-items">
            <div class="item-contain" v-for="(item,index) in recommends" :key="index">
              <div class="thumb">
                <div class="item-box">
                  <a class="img-box">
                    <img :src="item.img"  :alt="item.name" class="img-block lazy-img img-full">
                  </a>
                  <span class="playlist-play btn-play">
                    <img class="cf-play" src="../../../public/img/btn-play.png">
                  </span>
                  <p class="item-playCnt"><i class="iconfont el-icon-headset" style="font-size: 16px;line-height: 24px;"></i>{{item.listenNum}}</p>
                </div>
                <div class="item-info">
                  <a class="item-title">{{item.name}}</a>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div id="album" class="section contain-box">
      <div class="container section-header">
        <h2 class="title">新碟上架</h2>
        <a class="more">更多<i class="iconfont el-icon-arrow-right"></i></a>
      </div>
      <div class="container">
        <div class="wrapper-items">
          <div class="item-contain" v-for="(item,index) in newDiskList" :key="index">
            <div class="thumb">
              <div class="item-box">
                <a class="img-box">
                  <img :src="item.img" :alt="item.name" class="img-block lazy-img img-full">
                </a>
                <i class="album-cover"></i>
                <span class="album-play btn-play"><img class="cf-play" src="../../../public/img/btn-play.png"></span>
                <span class="update-time">2023-04-20</span>
              </div>
              <div class="item-info">
                <p class="album-name name-block">
                  <a>{{item.name}}</a>
                </p>
                <p class="singer block-name-next">
                  <a>那英</a>
                  / <a>马伊琍</a>
                  / <a>许一鸣</a>
                  / <a>田园</a>
                  / <a>董冬冬</a>
                  / <a>白宇</a>
                  / <a>A-Lin</a>
                </p>
              </div>
            </div>
          </div>
        </div>
      </div>

    </div>

    <div id="digitalAlbum" class="section">
      <div class="container section-header contain-box">
        <h2 class="title">数字专辑</h2>
        <a class="more">更多<i class="iconfont el-icon-arrow-right"></i></a>
      </div>
      <div class="back-wrapper" style="padding: 21px 0;">
        <div class="container contain-box">
          <div class="wrapper-items">
            <div class="item-contain" v-for="(item,index) in digitalAlbumList">
              <div class="thumb">
                <div class="item-box">
                  <a class="img-box">
                    <img :src="item.img" :alt="item.name" class="img-block lazy-img img-full">
                  </a>
                  <i class="album-cover"></i>
                  <span class="update-time">2023-04-30</span>
                </div>
                <div class="item-info">
                  <p class="album-name name-block">
                    <a>{{item.name}}</a>
                  </p>
                  <p class="singer block-name-next">
                    <a>朝简</a>
                    / <a>窦唯</a>
                  </p>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>

 数据构造源码:

<script>
  export default {
    data() {
      return {
        banners:[//轮播图
          require('../../../public/img/230517091951259_1400x350_5713.jpg'),
          require('../../../public/img/23051910364536_1400x350_3748.jpg'),
          require('../../../public/img/230519104200186_1400x350_6951.jpg'),
          require('../../../public/img/230519105837175_1400x350_329.jpg'),
          require('../../../public/img/230519105101366_1400x350_2796.jpg'),
          require('../../../public/img/230519132656314_1400x350_6114.jpg'),
          require('../../../public/img/23051613414308_1400x350_1883.jpg')
        ],
        recommends:[//推荐
          {name:'〔骑行在路上〕无限循环,解压必备',img:require('../../../public/img/272769fe-fd84-437d-8e74-84a199a9d2a7.jpg'),listenNum:'198.2w'},
          {name:'粤语回忆录|回忆杀里的经典记录',img:require('../../../public/img/5a5e7199-5ceb-4094-aa87-4f446670432a.jpg'),listenNum:'155.6w'},
          {name:'学习纯音 | 凝神静气,思维跃升',img:require('../../../public/img/b72d056e-3fc7-4c18-b95b-2d3f215a1f25.jpg'),listenNum:'119.2w'},
          {name:'宅家小调丨平凡小事促成美好日常',img:require('../../../public/img/482f5fb2-10ff-4f6f-b8a8-a18dad8a8fb7.jpg'),listenNum:'95.8w'},
          {name:'散步减压丨远离繁华,走向空旷',img:require('../../../public/img/356363c5-26a1-4ea9-b83e-326e7cd000f1.jpg'),listenNum:'93.5w'},
          {name:'驾车:希望不辜负理想也不辜负热爱',img:require('../../../public/img/b981f60f-3785-4dac-a7f3-f5cb7d5eaefc.jpg'),listenNum:'93.2w'},
          {name:'〔骑行在路上〕无限循环,解压必备',img:require('../../../public/img/272769fe-fd84-437d-8e74-84a199a9d2a7.jpg'),listenNum:'198.2w'},
          {name:'粤语回忆录|回忆杀里的经典记录',img:require('../../../public/img/5a5e7199-5ceb-4094-aa87-4f446670432a.jpg'),listenNum:'155.6w'},
          {name:'学习纯音 | 凝神静气,思维跃升',img:require('../../../public/img/b72d056e-3fc7-4c18-b95b-2d3f215a1f25.jpg'),listenNum:'119.2w'},
          {name:'宅家小调丨平凡小事促成美好日常',img:require('../../../public/img/482f5fb2-10ff-4f6f-b8a8-a18dad8a8fb7.jpg'),listenNum:'95.8w'},
          {name:'散步减压丨远离繁华,走向空旷',img:require('../../../public/img/356363c5-26a1-4ea9-b83e-326e7cd000f1.jpg'),listenNum:'93.5w'},
          {name:'驾车:希望不辜负理想也不辜负热爱',img:require('../../../public/img/b981f60f-3785-4dac-a7f3-f5cb7d5eaefc.jpg'),listenNum:'93.2w'}
        ],
        newDiskList:[//新碟上架
          {name:'《龙城》影视原声带',img:require('../../../public/img/AS6b7741232ee61de18b9c31babc5795ff.jpg')},
          {name:'瞧!你这小脾气 影视剧原声带',img:require('../../../public/img/AS7b869e0e8002e25bac9fa77ef5f5d3a8.jpg')},
          {name:'泰版《放羊的星星》原声带',img:require('../../../public/img/ASa375961663661da5a832cc028de468a9.jpg')},
          {name:'鲸鱼马戏团VOL.7 索拉里斯 —— 时间与永恒',img:require('../../../public/img/AS99df91468fcb4791943ef12808449191.jpg')},
          {name:'《声生不息·宝岛季》第5期',img:require('../../../public/img/AS8e621cc6f42ee7f29d146771bd505032.jpg')},
          {name:'《龙城》影视原声带',img:require('../../../public/img/AS6b7741232ee61de18b9c31babc5795ff.jpg')},
          {name:'瞧!你这小脾气 影视剧原声带',img:require('../../../public/img/AS7b869e0e8002e25bac9fa77ef5f5d3a8.jpg')},
          {name:'泰版《放羊的星星》原声带',img:require('../../../public/img/ASa375961663661da5a832cc028de468a9.jpg')},
          {name:'鲸鱼马戏团VOL.7 索拉里斯 —— 时间与永恒',img:require('../../../public/img/AS99df91468fcb4791943ef12808449191.jpg')},
          {name:'《声生不息·宝岛季》第5期',img:require('../../../public/img/AS8e621cc6f42ee7f29d146771bd505032.jpg')}
        ],
        digitalAlbumList:[//数字专辑
          {name:'神女赋',img:require('../../../public/img/AM85cc6100766e75b3e8115973ad1316ca.jpg')},
          {name:'琵琶行',img:require('../../../public/img/AM8f61951fa2888ed88f64c724d3057c23.jpg')},
          {name:'宋词',img:require('../../../public/img/AMd388fa758ff8baaa5bc236aa96c69887.jpg')},
          {name:'元曲',img:require('../../../public/img/AM5176573d3745c183aa1cbad23479ef8f.jpg')},
          {name:'DREAMS',img:require('../../../public/img/AMeb1420713a4a582e7e681ffc75048038.jpg')},
        ],
        rankingBanner:[//顶部小轮播图
          require('../../../public/img/small-banner1.jpg'),
          require('../../../public/img/small-banner2.jpg'),
          require('../../../public/img/small-banner3.jpg')
        ]
      };
    },
    mounted() {
    },
    methods: {
    }
  };
</script>

三、总结

首页样式和框架设计已经实现完成,紧接着就是其他功能页面的实现了,敬请期待。

关注作者,及时了解更多好项目!

作者主页也有更多好项目分享!

获取源码或如需帮助,可通过博客后面名片+作者即可!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

庄懂的TA笔记(十七)<特效:屏幕UV + 屏幕扰动>

庄懂的TA笔记&#xff08;十七&#xff09;&#xff1c;特效&#xff1a;屏幕UV 屏幕扰动&#xff1e; 大纲&#xff1a; 目录 庄懂的TA笔记&#xff08;十七&#xff09;&#xff1c;特效&#xff1a;屏幕UV 屏幕扰动&#xff1e; 大纲&#xff1a; 正文&#xff1a; 一…

UNIX环境高级编程——线程控制

12.1 引言 本章讲解控制线程行为方面的详细内容&#xff0c;介绍线程属性和同步原语属性。 12.2 线程限制 12.3 线程属性 线程属性对象用pthread_attr_t结构表示&#xff0c;可以用这个结构修改线程默认属性&#xff0c;并把这些属性与创建的线程联系起来。 #include <p…

腾讯C++二面,全程2小时追问基础!

今天给大家分享星球一位同学腾讯面经&#xff0c;主要摘取了部分一二面经&#xff0c;然后部分问题我做了补充说明~ 星球原文&#xff1a;https://t.zsxq.com/0eO4O13HV&#xff0c;已获授权 一面 1、C11有哪些新特性&#xff0c;有哪些新关键字 2、C中结构体占多少字节&…

51单片机——I2C-EEPROM实验,小白讲解,相互学习

I2C介绍 I2C&#xff08;Inter&#xff0d;Integrated Circuit&#xff09;总线是由 PHILIPS 公司开发的两线式 串行总线&#xff0c;用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的 一种总线标准。它是同步通信的一种特殊形式&#xff0c;具有接口线少&#x…

【逆向工程核心原理:SEH】

SEH SEH是Windows操作系统提供的异常处理机制&#xff0c;在程序源代码中使用__ try、 __except、__finally关键字来具体实现。主要用在反调试中。 注&#xff1a; SEH与C中的try. catch 异常处理具有不同结构。从时间上看&#xff0c;与C的try、catch异常处理相比&#xff0…

uni-app--》uView组件库:提升您的uni-app开发体验

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

MMDet3d样本均衡

MMDet3d样本均衡 文章目录 MMDet3d样本均衡CBGSDataset训练时数据是200帧&#xff0c;后面处理时&#xff0c;dataloader中数据变成了460帧&#xff0c;怎么均衡的&#xff1f;思考抽帧数计算某个类别帧数为0 Reference欢迎关注公众号【三戒纪元】 CBGSDataset **CBGS &#x…

UE虚幻引擎,Unity3D,Blender区别和联系

1. 官网手册 UnityUEBlenderUnity 用户手册 (2019.4 LTS) - Unity 手册虚幻引擎5.2文档 | 虚幻引擎5.2文档 (unrealengine.com)Blender 3.5 Reference Manual — Blender Manual 2. Unity, UnrealEngine, Blender的区别 Blender 是一款免费的开源软件&#xff0c;是一个开源…

Godot引擎 4.0 文档 - 循序渐进教程 - 脚本语言

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Scripting languages — Godot Engine (stable) documentation in English 脚本语言 本课将概述 Godot 中可用的脚本语言。您将了解每个选项的优缺点。在下一部分中&…

CentOS7搭建伪分布式Hadoop(全过程2023)

##具体操作目录## 1.配置静态ip2.关闭防火墙3.修改主机名为 *master* &#xff0c;并重启虚拟机vi /etc/hostname 4.修改主机名与ip映射5.设置SSH免密登录6.安装配置java环境----------------------正式Hadoop配置1.移动安装包到合适位置2.解压安装包并重命名3.配置环境变量4.修…

know it and do it

overview&#xff1a; 在一盘盘有立即反馈的系统中&#xff0c;可以更直观的看到知道一个道理和能自然的用出来之间的鸿沟有多大。 这个就是日积月累的训练的意义了。 一夜回到解放前 继续金铲铲的游玩回味&#xff0c;之前一段时间忙于工作就放下了&#xff0c;后来新的版本…

20230521 AI 一周大事件汇总

&#x1f680; ChatGPT 上线联网和插件功能 OpenAI宣布将在这周推出联网和插件功能&#xff0c;位于Alpha和Beta通道的ChatGPT Plus用户都可使用70多个上线的插件。 更新意味着ChatGPT将利用最新的信息和资讯为使用者提供服务。 上线的ChatGPT插件种类涵盖了行程安排助理、代…

拿捏大厂面试官的高质量自动化测试工程师简历--看完必有所获

一、前言&#xff1a;简历&#xff08;职场敲门砖&#xff09; 作为软件测试的垂直领域深耕者&#xff0c;面试或者被面试都是常有的事&#xff0c;可是不管是啥&#xff0c;总和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等&#xff0c…

阿里p10手敲python +pytest +yaml + Allure 实现接口自动化框架

以前弄过好多接口自动化框架的东西&#xff0c;比如httprunner2.0版本实现的接口自动化框架&#xff0c;还有httprunner3.X实现的接口自动化框架&#xff0c;这些都是开源的&#xff0c;实现起来比较简单。 以及使用pythonunittestddtyaml等工具实现的接口自动化框架等。 今天…

【腾讯云 Finops Crane 集训营】安装使用及EHPA弹性演示

随着时间的推移&#xff0c;降本增效成为了企业界和组织中的一个新口号。在2023年&#xff0c;这个口号进一步获得了广泛的认可和重要性&#xff0c;成为了许多组织在业务运营中的关键目标。在2023年&#xff0c;许多组织开始将降本增效作为战略性目标&#xff0c;并将其融入到…

3.fabric二进制工具包介绍

(1)Fabric二进制工具包: Fabric二进制工具包:Fabric二进制工具包(Fabric Binary Distribution)是Hyperledger Fabric的核心组件,它包含了一系列可执行的二进制文件,用于搭建、管理和操作Fabric网络。该工具包提供了一套命令行工具,可以执行各种与Fabric网络相关的任务…

模板(初阶)

目录 一、泛型编程二、函数模板2.1 函数模板的概念2.2 函数模板的格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 三、类模板3.1 类模板的定义格式3.2 类模板的实例化 一、泛型编程 如何实现一个通用的Swap函数 void Swap(int& x, int& y) {int …

chatgpt赋能Python-pythonapp自动化

Python App自动化&#xff1a;优化SEO的终极解决方案 随着互联网的发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;变得日益重要。对于任何网站或应用程序开发人员来说&#xff0c;SEO应该是一个非常重要的考虑因素。为了帮助开发人员和企业提高其在线可见性&#x…

Squid代理服务器应用

在web架构中&#xff0c;用户一般进入负载均衡层&#xff0c;通过调度来访问web应用层&#xff0c;但是如果访问量太大&#xff0c;并发量较高&#xff0c;web应用层会吃不消&#xff0c;我们把静态资源、经常要访问的资源放入缓存&#xff0c;用户直接访问缓存层&#xff0c;加…

解析使用FPGA逻辑实现FIR滤波器的几种架构

有限脉冲响应(finite impulse response&#xff0c;FIR)数字滤波器 一、FIR数字滤波器理论介绍 FIR滤波器的实质就是输入序列与系统脉冲响应的卷积&#xff0c;即&#xff1a; 其中&#xff0c;N为滤波器的阶数&#xff0c;也即抽头数&#xff1b;x(n)为第n个输入序列&#xff…