代码:主要部分我会红线画出来




css:部分:

vue部分:
- <template>
-
- <div class="song-lyric">
-
- <div>
- <div class="type">
- <div class="right">
- <div class="right-center" :class="{ 'rotates': isplay }">
- <div>
- <img src="https://imagesone.oss-cn-beijing.aliyuncs.com/imagebishe/player_bar.png"
- class="right-top" :class="{rotated: isplay}">
- </div>
- <div>
- <img src="https://imagesone.oss-cn-beijing.aliyuncs.com/imagebishe/disc.png"
- class="tight-bottm" :style="{ transform: 'rotate(' + rotationAngle + 'deg)' }">
- </div>
- </div>
- </div>
- <div class="lyric-title">
- <!-- 有歌词 -->
- <!-- <el-input v-model="input" placeholder="请输入内"></el-input>
- <el-input v-model="input" placeholder="差不多"></el-input> -->
- <ul class="has-lyric" v-if="lyr.length" key="index">
- <li v-for="(item,index) in lyr" v-bind:key="index">
- {{item[1]}}
- </li>
- </ul>
- <!-- 没有歌词 -->
- <div v-else class="no-lyric" key="no-lyric">
- <span>暂无歌词</span>
- </div>
- </div>
- </div>
-
- </div>
-
-
- </div>
-
-
- </template>
- <script>
- import {
- mixin
- } from '../mixins';
- import {
- mapGetters
- } from 'vuex';
-
- export default {
- name: 'lyric',
- mixins: [mixin],
- data() {
- return {
- // input: '',
- lyr: [], //当前歌曲的歌词
- isplay: undefined, //获取歌曲开关状态
- rotationAngle: 0 // 记录盒子当前的旋转角度
- }
- },
- computed: {
-
- ...mapGetters([
- 'curTime', //当前歌曲播放到的位置
- 'id', //当前播放的歌曲id
- 'lyric', //歌词
- 'listIndex', //当前歌曲在歌单中的位置
- 'listOfSongs', //当前歌单列表
- 'isPlay' //播放状态
- ])
- },
- created() {
- this.isplay = this.isPlay//获取开关
- console.log('data', this.isplay);//获取点击图片进去歌词页面的开关状态
- this.lyr = this.lyric;
- this.rotateBox();
-
- console.log('this.lyr', this.lyr)
- console.log('this.mapGetters', this.mapGetters)
- },
- watch: {
- isPlay() {
- this.isplay = this.isPlay
- console.log('data', this.isplay);
- this.rotateBox();
- },
- id: function() {
- this.lyr = this.parseLyric(this.listOfSongs[this.listIndex].lyric)
- },
- curTime: function() {
- if (this.lyr.length > 0) {
- for (let i = 0; i < this.lyr.length; i++) {
- if (this.curTime >= this.lyr[i][0]) {
- for (let j = 0; j < this.lyr.length; j++) {
- document.querySelectorAll('.has-lyric li')[j].style.color = '#ffffff';
- document.querySelectorAll('.has-lyric li')[j].style.fontSize = '15px';
- }
- if (i >= 0) {
- document.querySelectorAll('.has-lyric li')[i].style.color = '#95d2f6';
- document.querySelectorAll('.has-lyric li')[i].style.fontSize = '25px';
- }
- }
- }
- }
- }
- },
- methods:{
-
- rotateBox(){
- if(this.isplay){
- this.rotationAngle +=1;
- // if(this.rotationAngle >= 360){
- // this.rotationAngle = this.rotationAngle % 360;
- // }
- setTimeout(this.rotateBox, 20);
- // console.log('this.rotateBox',this.rotationAngle)
- }
- }
-
- }
- }
- </script>
- <style lang="scss" scoped>
- @import '../assets/css/lyric.scss';
- </style>
css部分:
- @import "var.scss";
-
-
- .song-lyric {
- // margin: auto;
- // margin-top: $header-height + 20px;
- width: 100%;
- height: 100%;
- // background-color: $color-white;
- border-radius: 12px;
- display: block;
- background-color: rgb(167, 167, 167);
- // padding: 0 20px 50px 20px;
- // background-color: rgba(0,0,0,.55);
- font-family: $font-family;
-
- // background-size: cover;
- // filter: blur(30px);
- z-index: 1;
-
- .lyric-title {
- text-align: center;
- width: 50%;
- height: 100vh;
- overflow-y: scroll;
- line-height: 60px;
- border-bottom: 2px solid $color-black;
- margin-top: 50px;
- // background: rgba(21, 21, 21, 0.6);
- background-color: rgba(0,0,0,.65);
-
- z-index: 2;
- }
-
- .type{
- display: flex;
- text-align: center;
- width: 100%;
- height: 100vh;
- overflow: hidden;
- line-height: 60px;
- border-bottom: 2px solid $color-black;
- z-index: 2;
- }
- .right{
- text-align: center;
- width: 50%;
- height: 100vh;
- overflow: hidden;
- line-height: 60px;
- border-bottom: 2px solid $color-black;
- margin-top: 50px;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
- flex-wrap: wrap;
- // background: rgba(21, 21, 21, 0.6);
- background-color: rgba(0,0,0,.65);
- // backdrop-filter: blur(4px);
- // box-shadow: inset 0px 1px 6px rgba(255,255,255,0.6), 2px 2px 15px rgba(0,0,0,0.5);
- z-index: 2;
- }
-
- .right-top{ //指针
- position: absolute;
- z-index: 1;
- width: auto;
- left:45%;
- top:117px;
- height:200px;
-
- transition: transform 0.7s linear; transform: rotate(-30deg) translate(35px , -10px);
- }
-
- .rotated {
- transform: rotate(0deg);
- }
-
-
-
- .right-center{
- position: relative;
- width: 600px;
- height: 1000px;
- // background-color: rgb(206, 198, 198);
- }
-
- .has-lyric {
- font-size: 18px;
- width: 100%;
- min-height: 100%;
- text-align: center;
- padding-top: 120px;
- li {
- width: 100%;
- height: 40px;
- line-height: 40px;
- }
- }
-
- .no-lyric {
- // margin: 200px 0;
- padding: 200px 0 0 0;
- width: 100%;
- text-align: center;
-
- span {
- font-size: 18px;
- text-align: center;
- }
- }
- }
-
- .lyric-fade-enter,
- .lyric-fade-leave-to {
- transform: translateX(30px);
- opacity: 0;
- }
-
- .lyric-fade-enter-active,
- .lyric-fade-leave-active {
- transition: all 0.3s ease;
- }
-
- .tight-bottm{ //圆
- position: absolute;
- top:225px;
- width: 400px;
- left:18%;
- height:400px;
- border-radius: 50%;
- transition: transform 0.7s linear;
-
- }
-
- .active {
- animation: none !important;
- // animation: spin 5s linear infinite;
- }
-
- // @keyframes spin {
- // 100% {
- // transform: rotate(360deg);
- // }
- // }
-