Vue之网易云音乐PC版轮播图的实现

最近在刷网易云音乐歌单时发现首页的轮播图很有意思,正好自己想尝试做一个PC版的网易云音乐,于是就是使用Vue去做这个demo,废话少说,我要出招了,接招吧

网易云音乐PC版轮播图

页面的DOM结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<template>
<div class="slider-container" ref='slider'
:style="sliderStyle"
@mouseover="pause()"
@mouseout="play()">
<div class="slider-content" :class="mask ? 'mask' : ''">
<div class="slider" v-for="(item, index) in list"
:key="index"
:class="setClass(index)"
@click="onClick(index)" :style="setBGImg(item.src)">
</div>
<i v-show="arrow" class="iconfont icon-left" @click="prev()"></i>
<i v-show="arrow" class="iconfont icon-right" @click="next()"></i>
</div>
<div class="dots" v-if="dots">
<span v-for="(item, index) in list" :key="index"
:style="setActiveDot(index)"
@mouseover="currentIndex = index"></span>
</div>
</div>
</template>

Slider-container的样式(Stylus)

1
2
3
4
5
6
.slider-container
width: 100%
height: 100%
text-align: center
padding: 10px 0
position: relative

这个子组件主要分为两块。

  1. 轮播图,其中它们的业务逻辑是
  • 自动切换
  • 左右icon切换轮播图
  • 点击前后轮播图切换轮播图
  • 鼠标滑动到轮播图停止轮播,离开后继续轮播

Slider-content的DOM结构

1
2
3
4
5
6
7
8
9
<div class="slider-content" :class="mask ? 'mask' : ''">
<div class="slider" v-for="(item, index) in list"
:key="index"
:class="setClass(index)"
@click="onClick(index)" :style="setBGImg(item.src)">
</div>
<i v-show="arrow" class="iconfont icon-left" @click="prev()"></i>
<i v-show="arrow" class="iconfont icon-right" @click="next()"></i>
</div>

Slider-content的样式(Stylus)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
.slider-content
position: relative
width: 100%
height: calc(100% - 20px)
left: 0%
top: 0%
margin: 0px
padding: 0px
background-size: inherit
.slider
position: absolute
margin: 0
padding: 0
top: 0
left: 50%
width: 65%
height: 100%
transition: 500ms all ease-in-out
background-color: #fff
background-repeat: no-repeat
background-position: center
background-size: inherit
transform: translate3d(-50%,0,-80px)
z-index: 1
&:before
position: absolute
content: ""
width: 100%
height: 100%
top: 0
left: 0
background-color: rgba(0, 0, 0, 0)
transition-delay: 100ms!important
transition: all 500ms
cursor: pointer
&.active
transform: translate3d(-50%, 0, 0)
z-index: 20
&.prev
transform: translate3d(-75%, 0, -100px)
z-index: 19
&.next
transform: translate3d(-25%, 0, -100px)
z-index: 18
i
width: 17.5%
display: none
position: absolute
top: 40%
font-size: 22px
color: rgba(255, 255, 255, 0.5)
text-shadow: 0 0 24px rgba(0, 0, 0, 0.3)
cursor: pointer
z-index: 21
&:first-child
left: 0
&:last-child
right: 0
&:hover
i
color: rgba(255, 255, 255, 0.8)
display: block
&.mask
.slider
&.prev, &.next
&:before
background-color: rgba(0, 0, 0, 0.50)
  1. 底部的dot, 其中它们的业务逻辑是
  • 当前轮播图对应位置的dot高亮
  • 鼠标移动到相应的dot上切换对应位置的轮播图

Dots的DOM结构

1
2
3
4
5
<div class="dots" v-if="dots">
<span v-for="(item, index) in list" :key="index"
:style="setActiveDot(index)"
@mouseover="currentIndex = index"></span>
</div>

Dots的样式(Stylus)

1
2
3
4
5
6
7
8
9
.dots 
width: 100%
height: 20px
span
display: inline-block
width: 20px
height: 2px
margin: 1px 3px
cursor: pointer

上面是页面的DOM结构和表现的实现代码,接下来我们要讲的是连招的实现,小心啦,我要摸眼W + R3了。
上面我们讲到轮播图的业务逻辑,接下来,我们就讲讲如何实现的的吧

自动轮播

自动轮播

1
2
3
4
5
6
7
8
play () {
this.pause();
if (this.autoPlay) {
this.timer = setInterval(()=>{
this.next();
}, this.interval)
}
}

暂停轮播

暂停轮播

1
2
3
pause () {
clearInterval(this.timer);
}

Icon切换轮播图

Icon切换轮播图

1
2
3
4
5
6
next () {
this.currentIndex = ++this.currentIndex % this.list.length;
},
prev () {
this.currentIndex = this.currentIndex === 0 ? this.list.length - 1 : this.currentIndex - 1;
},

前后轮播图的切换轮播图

前后轮播图的切换轮播图

1
2
3
4
5
6
7
8
9
10
11
12
13
onClick (i) {
if (i === this.currentIndex){
this.$emit('sliderClick', i);
} else {
let currentClickClassName = this.sliderDomList[i].className.split(' ')[1]
console.log(currentClickClassName)
if (currentClickClassName === 'next') {
this.next()
} else {
this.prev()
}
}
}

dots轮播图的切换轮播图

dots轮播图的切换轮播图

这里比较简单,只需要设置它的鼠标事件即可

1
@mouseover="currentIndex = index"

代码传送门:Vue网易云音乐轮播图的实现
到这里,基本上我们提出的业务逻辑原理都已经实现了,到时候我会将代码整理完了commit到github上,现在正在整理ing,谢谢。

代码传送门:Vue网易云音乐轮播图的实现

很难接受就要和你分离了
小哥哥,小姐姐们,常来玩啊

本文标题:Vue之网易云音乐PC版轮播图的实现

文章作者:小超子

发布时间:2018年06月25日 - 18:06

最后更新:2018年08月11日 - 17:08

原始链接:https://rain120.github.io/2018/06/25/netease-slider/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

0%