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

news2024/9/25 19:14:34

一.前言

  1. QQ音乐官网:点击访问
  2. 作者成品效果预览:点击访问
  3. 作者其他博客成品汇总预览:点击访问

暂时源码并没有提供其他获取渠道,私聊作者获取即可,或通过博客后面名片添加作者,很简单!

二.主要功能点列表

  • 顶级菜单
  • 二级菜单
  • 歌单推荐
  • 新歌首发
  • 精彩推荐
  • 新碟首发
  • 排行榜
  • MV
  • 通用网站底部(版权、企业信息等)

三.产品效果图

1.切换顶级菜单、二级菜单:
在这里插入图片描述
2.歌单推荐(菜单切换+轮播):
在这里插入图片描述
3.新歌首发(菜单切换+轮播):
在这里插入图片描述
4.精彩推荐(轮播):
在这里插入图片描述5.新碟首发(菜单切换+轮播):
在这里插入图片描述
6.排行榜(背景图裁剪实现:background-position属性):
在这里插入图片描述
7.MV(菜单切换+轮播):
在这里插入图片描述

四.实现

项目目录截图:
在这里插入图片描述

  1. img存放各种静态图片资源等;
  2. page目录是通用目录文件(看名称几乎也能明白了),top就是网站通用顶部,index就是框架通用主体盒子,foot就是网站通用底部;
  3. router就是路由;
  4. views其他功能目录文件,子目录home目录为首页,其他子目录功能待开发实现;
  5. components为组件存放目录,子目录home专门存放首页组件页面(歌单推荐、新歌首发、精彩推荐。。mv等),所以首页已经被拆分成各个子页面,非常美观和利于后续功能拓展或修改

首页主页面 views/home/index.vue,通过引入子页面组件:

<template>
  <div style="font-size: 14px;">
    <song-sheet-recommend></song-sheet-recommend>
    <new-song-first></new-song-first>
    <hot-recommend></hot-recommend>
    <new-dish-first></new-dish-first>
    <ranking-list></ranking-list>
    <mv></mv>
  </div>

</template>

<script>
  import songSheetRecommend from "../../components/home/song_sheet_recommend.vue";
  import newSongFirst from "../../components/home/new_song_first.vue";
  import hotRecommend from "../../components/home/hot_recommend.vue";
  import newDishFirst from "../../components/home/new_dish_first.vue";
  import rankingList from "../../components/home/ranking_list.vue";
  import mv from "../../components/home/mv.vue";

  export default {
    components: {
      songSheetRecommend,
      newSongFirst,
      hotRecommend,
      newDishFirst,
      rankingList,
      mv
    },
    data() {
      return {

      };
    },
    mounted() {
    },
    methods: {
    }
  };
</script>

<style>
</style>

歌单推荐(首页其中子页面之一),菜单切换,模拟数据交互,types1和types2赋值给types:

<template>
  <div class="mod_bg" style="font-size: 14px;">
    <div style="margin: 0 10%;">
      <div class="mod_title">
        歌单推荐
      </div>
      <div class="mod_small_title">
        <span v-for="(item,index) in submenus" :key="index" :class="subMenuIndex!==index?'sub-menu-hover':''" @click="selSubMenu(index)" :style="'padding: 10px 30px;'+(subMenuIndex===index?'color: #31c27c;':'')">
          {{item.name}}
        </span>
      </div>
      <div>
        <el-carousel trigger="click" :autoplay="false" height="350px">
          <el-carousel-item v-for="i in 4" :key="i" indicator-position="outside">
            <div style="margin: 0 10%;" class="recommend-box">
              <div class="recommend-item" v-for="(item,index) in types" :key="index">
                <div class="play-item">
                  <div style="text-align: center;height: 224px;overflow: hidden;">
                    <el-image :src="item.img" fit="cover" style="width: 100%;height: 224px;" class="cover"></el-image>
                  </div>
                  <div class="play-box">
                    <img src="../../../public/img/cover_play.png">
                  </div>
                </div>

                <div class="recommend-item-title title-active">
                  {{item.name}}
                </div>
                <div class="recommend-item-des">
                  播放量:{{item.playNum}}
                </div>
              </div>
            </div>
          </el-carousel-item>
        </el-carousel>
      </div>

    </div>
  </div>

</template>

<script>
  export default {
    data() {
      return {
        subMenuIndex: 0,
        submenus: [
          {name:'为你推荐'},
          {name:'经典'},
          {name:'网络歌曲'},
          {name:'韩语'},
          {name:'官方歌单'},
          {name:'情歌'},
        ],
        types:[],
        types1:[
          {name:'二哥抖音最火',playNum:'4357.9万',img:require('../../../public/img/recommend1.jpg')},
          {name:'华语天花板:奏响青春的时代乐章',playNum:'1190.5万',img:require('../../../public/img/recommend2.jpg')},
          {name:'冬季限定 ·冰雪世界专属电音BGM',playNum:'4.3万',img:require('../../../public/img/recommend3.jpg')},
          {name:'车载DJ热歌:轻松一路Fun肆嗨!',playNum:'4534.6万',img:require('../../../public/img/recommend4.jpg')},
          {name:'爱的故事翻篇,被爱的人不用道歉',playNum:'2037.3万',img:require('../../../public/img/recommend5.jpg')}
        ],
        types2:[
          {name:'不为人知的天才,老一辈香港音乐人',playNum:'51.5万',img:require('../../../public/img/recommend6.jpg')},
          {name:'以漂亮的姿势,穿越到八十年代',playNum:'87.5万',img:require('../../../public/img/recommend7.jpg')},
          {name:'「经典粤语」唱着你我的悲欢离合',playNum:'123.3万',img:require('../../../public/img/recommend8.jpg')},
          {name:'重温一把当年的火,粤语经典',playNum:'104.9万',img:require('../../../public/img/recommend9.jpg')},
          {name:'有一种歌词,叫小美',playNum:'315.7万',img:require('../../../public/img/recommend10.jpg')}
        ]
      };
    },
    mounted() {
      this.types = this.types1;
    },
    methods: {
      selSubMenu(index){//切換菜單
        this.subMenuIndex = index;
        console.info(index % 2);
        if(index % 2 === 0){
          this.types = this.types1;
        }else{
          this.types = this.types2;
        }
      },
    }
  };
</script>

<style>
  .mod_bg {
    background: url("../../../public/img/bg_detail.jpg") 50% 0 repeat-x;
    /*background: linear-gradient(to bottom, #FFFFFF,#FFFFFF,#FFFFFF, #eeeeee);*/
  }
  .mod_bg .el-carousel__button{
    background-color: #67e56d !important;
  }
  .mod_title{
    height: 40px;
    line-height: 40px;
    font-size: 28px;
    font-weight: bolder;
    color: #3a3a3a;
    text-align: center;
    padding: 50px 0 24px 0;
    letter-spacing:10px;
  }
  .mod_small_title{
    text-align: center;
    height: 50px;
    line-height: 50px;
    font-size: 15px;
  }
  .recommend-box{
    display: flex;
  }
  .recommend-item{
    width: calc(20% - 0px);
    margin: 10px 10px 10px 10px;
    cursor: pointer;
  }
  .recommend-item:first-of-type{
    margin: 10px 10px 10px 0!important;
  }
  .recommend-item:last-of-type{
    margin: 10px 0 10px 10px!important;
  }
  .recommend-item-title{
    height: 22px;
    line-height: 22px;
    overflow: hidden;
    text-overflow: ellipsis;
    margin-top: 15px;
  }
  .title-active:hover{
    cursor: pointer;
    color: #31c27c;
  }
  .recommend-item-des{
    color: #999;
  }
  .play-box{
    opacity: 0;
    position: relative;
    text-align: center;
    height: 224px;
    overflow: hidden;
    margin-top: -224px;
    background-color: rgba(161, 161, 161, 0.5);
  }
  .play-box img{
    width: 25px;
    height: 25px;
    margin-top: 87px;
  }
  .play-item:hover .cover{
    transition: transform 1s ease 0s;
    transform: scale(1.1);
  }
  .play-item:hover .play-box{
    opacity: 1;
  }
  .play-item:hover .play-box img{
    transition: transform 0.5s ease 0s;
    transform: scale(2);
  }
</style>

五.总结

以QQ音乐官方网站作为参考,模拟实现,实现最终的效果还是满意的,样式交互等也是最大化模拟官方的,后续再不断完善、增加其他功能和其他页面。

觉得不错的点个赞,如有建议的请留言,非常感谢!
如需帮助,私聊作者即可!再次感谢~

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

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

相关文章

创建的vue项目--打包

自创建的项目&#xff08;未使用项目框架&#xff09;&#xff0c;使用weabpack打包 1.在package.json文件中配置 2.在控制台执行打包命令npm run build 打包完成后&#xff0c;会在项目中生成一个dist文件夹&#xff0c;其中就是打包生成的静态文件 3.打开index.html&…

RocketMq基础详解

1、RocketMq的架构&#xff1a; 在RocketMq中有四个部分组成&#xff0c;分别是Producer&#xff0c;Consumer&#xff0c;Broker&#xff0c;以及NameServer&#xff0c;类比于生活中的邮局&#xff0c;分别是发信者&#xff0c;收信者&#xff0c;负责暂存&#xff0c;传输的…

找到二叉树中的最大搜索二叉树

题目 给定一棵二叉树的头节点 head&#xff0c;一致其中所有节点的值都不一样&#xff0c;找到含有节点最多的搜索二叉树&#xff0c;并返回这棵子树的头节点。 示例 分析 树形dp套路&#xff1a;如果题目求解目标是S规则&#xff0c;则求解流程可以定成以每一个节点为头节点…

【前端】如何判断是页面滚动还是窗口滚动

在写项目的时候遇到这个问题&#xff0c;现在举两个例子来记录这个问题。 页面滚动 html: <div class"temp"><template v-for"item in 100"><div>{{ item }}</div></template> </div>css: .temp {height: 100px;o…

老马闲评数字化「3」业务说了算还是技术说了算?

原文作者&#xff1a;行云创新CEO 马洪喜 导语 前两集和大伙聊了一下“数字化不转型行不行”以及“你的企业急不急着转”这两个话题。后面收到不少朋友的消息&#xff0c;说写的挺好&#xff0c;但“急着转、不敢转”的情况非常的普遍&#xff0c;有没有啥好主意给说一说。 麦…

冬去春来,ToB行业压缩的弹簧就要迸发了

目前来看&#xff0c;认知、实践、技术、服务这四方面的新变化&#xff0c;都将成为2023年企业数智化业务需求“井喷”的重要原因。 作者|周羽 出品|产业家 2023&#xff0c;冬去春来。 不止于字面。新的一年&#xff0c;中国的ToB厂商即将迎来“拨云见日”的朗朗晴空。 …

[文件上传工具类] MultipartFile 统一校验

目录​​​​​​​ 1. 创建上传文件的统一校验类 包含功能: -> 1. 多文件上传校验 -> 2. 文件名字校验(特殊符号) -> 3. 文件后缀校验 2. 使用方式 建议: 在文件上传开始的位置添加 -> 两个重载方法, 单文件 多文件都支持 -> 示例: 直接可以用, 任意位…

C++ 包装器function

目录 1、为什么需要包装器&#xff1f; 2、包装器的声明和使用 (1) 声明 (2) 实际应用 (3) 包装器接收类成员函数 3、包装器的绑定&#xff1a;bind函数 (1) 调整参数顺序 (2) 调整参数个数 1、为什么需要包装器&#xff1f; 函数模板可以接收各种不同类型的参数&…

光流正负值的含义以及如何利用光流进行warping

本文主要介绍光流的形式&#xff0c;光流值的正负代表什么含义&#xff0c;以及如何利用光流进行warping。 1. 光流正负值的含义 光流的概念&#xff1a;光流表示的是从reference frame到target frame&#xff0c;物体的移动。光流的形式&#xff1a;光流的表示也是数字化的。…

镭速-跨国车企数据高速、安全跨境传输解决方案

一、背景及趋势 在新一代信息技术驱动的数字经济时代&#xff0c;数据已然成为新型生产要素&#xff0c;是国家基础性资源和战略性资源。在汽车市场全球化背景下&#xff0c;产品、数据双跨境将成为车企未来常态。数据的价值核心在于流通和应用&#xff0c;但数据也牵涉着竞争…

23.1.30 将TF-A源码移植的过程,整理成自己的笔记

将TF-A源码移植的过程&#xff0c;整理成自己的笔记&#xff0c;上传到CSDN 一、配置TF-A源码 自动探测 自动换行 1.对tf-a源码进行解压 tar xfz tf-a-stm32mp-2.2.r2-r0.tar.gz 打补丁 3.进入tf-a源码目录 $> cd tf-a-stm32mp-2.2.r2 4.打补丁命令 $> for p in ls -1 .…

JavaScript中的Array对象~

初识Array&#xff1a; Array 对象用于在单个的变量中存储多个值 定义&#xff1a; 方式1 //返回的数组为空&#xff0c;length字段为0 var 变量名new Array(); //size是期望的数组元素个数&#xff0c;返回的length字段将被设置为size的值--返回具有指定个数&#xff0c;元…

vue2面试题持续更新。。。

文章目录1、vue 修改数据页面不重新渲染数组/对象的响应式 &#xff0c;vue 里面是怎么处理的&#xff1f;2、生命周期Vue 生命周期都有哪些&#xff1f;父子组件生命周期执行顺序3、watch 和 computed 的区别4、组件通信&#xff08;组件间传值&#xff09;5、$nextTick6、修饰…

postman常用变量总结

一、变量分类环境变量&#xff1a;只在所属环境内使用&#xff1b;全局变量&#xff1a;整个postman中全部接口皆可使用该变量&#xff1b;集合变量&#xff1a;只在设置的集合中可使用&#xff0c;且与环境无关&#xff1b;局部变量数据变量二、环境变量设置方式方式一方式二方…

网络知识详解之:HTTP协议基础

网络知识详解之&#xff1a;HTTP协议基础 计算机网络相关知识体系详解 网络知识详解之&#xff1a;TCP连接原理详解网络知识详解之&#xff1a;HTTP协议基础网络知识详解之&#xff1a;HTTPS通信原理剖析&#xff08;对称、非对称加密、数字签名、数字证书&#xff09;网络知…

第三章.逻辑回归—逻辑回归

第三章.逻辑回归 3.1 逻辑回归&#xff08;Logistic Regression&#xff09; 线性回归以及非线性回归是用来处理回归问题的&#xff0c;而逻辑回归是用来处理分类问题的。 1.应用场景&#xff1a; 1).分类&#xff1a; 垃圾邮件分类预测肿瘤是良性还是恶行预测某人的信用是好…

ITIL知识管理分析及如何实施

什么是知识管理 知识管理是在 IT 服务台内收集、分析、存储和共享知识的过程。它旨在帮助服务台团队在整个使用寿命期间做出正确的决策 通过有效控制和处理信息流来循环和事件解决过程。 ITIL 4将知识管理定义为负责向以下机构提供知识的一个中央流程 所有其他IT 服务管理 &a…

linux / Generic Netlink

一、概述 Generic Netlink 是内核专门为了扩展 netlink 协议簇而设计的“通用netlink协议簇”。由于 netlink 协议最多支持 32 个协议簇&#xff0c;目前 Linux4.1 的内核中已经使用其中 21 个&#xff0c;对于用户需要定制特殊的协议类型略显不够&#xff0c;而且用户还需自行…

SHELL基本知识超级详解

目录 shell基本知识 1&#xff0c;为什么学习和使用Shell编程 2&#xff0c; shell的起源 3&#xff0c;shell的功能 4&#xff0c;shell的分类 5&#xff0c; shell脚本的基本元素 6&#xff0c; shell脚本编写规范 7&#xff0c;shell脚本的执行方式 8&#xff0c; 执…

JavaScript 类的继承

通过原型链的方式继承 通过实例化一个构造函数&#xff0c;使字类的原型指向父类的实例&#xff0c;字类就可以调用到父类的属性和方法 function Parent() {this.parentName 父亲;this.getParentName function () {console.log("parent name is: %s", this.paren…