上一篇,我们写了一个静态的图标区域,这里,我们实现图标区域逻辑部分,有许多图标时分页 轮播显示。
我们使用,轮播图插件。
首先,使用swiper 进行包裹。在Icons.vue 中。
<template>
<div class="icons">
<swiper :options="swiperOption">
<swiper-slide>
<div class="icon">
<div class="icon-img">
<img class="icon-img-content" src="http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png">
</div>
<p class="icon-desc">红门</p>
</div>
</swiper-slide>
<swiper-slide>
<div class="icon">
<div class="icon-img">
<img class="icon-img-content" src="http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png">
</div>
<p class="icon-desc">红门</p>
</div>
</swiper-slide>
</swiper>
</div>
</template>
注意,会有这样一个问题,在滑动区域上半部分是可以滑动的,但是下半部分(没有元素),不能滑动。这是因为swiper-container,只包含到上半部分,如下图。这时候调整一下css, 使得swiper-container 高度等于父元素的高度即可。
旧的css:
<style lang="stylus" scoped>
@import '~styles/variables.styl'
.icons
overflow: hidden
width: 100%
height: 0
padding-bottom: 50%
.icon
position: relative
overflow: hidden
float: left
width: 25%
height: 0
padding-bottom: 25%
.icon-img
position: absolute
top: 0
left: 0
right: 0
bottom: .44rem
box-sizing: border-box
padding: .1rem
.icon-img-content
height: 100%
display: block
margin: 0 auto
.icon-desc
position: absolute
left: 0
right: 0
bottom: 0
height: .44rem
line-height: .44rem
color: $darkTextColor
text-align: center
</style>
新的css
<style lang="stylus" scoped>
@import '~styles/variables.styl'
.icons >>> .swiper-container
width: 100%
height: 0
padding-bottom: 50%
.icon
position: relative
overflow: hidden
float: left
width: 25%
height: 0
padding-bottom: 25%
.icon-img
position: absolute
top: 0
left: 0
right: 0
bottom: .44rem
box-sizing: border-box
padding: .1rem
.icon-img-content
height: 100%
display: block
margin: 0 auto
.icon-desc
position: absolute
left: 0
right: 0
bottom: 0
height: .44rem
line-height: .44rem
color: $darkTextColor
text-align: center
</style>
这样子修改,就可以了。
下面,就是要把原本写死了的img src 属性提取出来,使用v-for 命令循环读取。
<template>
<div class="icons">
<swiper :options="swiperOption">
<swiper-slide>
<div
class="icon"
v-for="item of iconList"
:key="item.id"
>
<div class="icon-img">
<img class="icon-img-content" :src='item.imgUrl'>
</div>
<p class="icon-desc">{{item.desc}}</p>
</div>
</swiper-slide>
</swiper>
</div>
</template>
<script>
export default {
name: 'HomeIcons',
data: function () {
return {
iconList: [{
id: '0001',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门1'
}, {
id: '0002',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色2'
}, {
id: '0003',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门3'
}, {
id: '0004',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门4'
}, {
id: '0005',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色5'
}, {
id: '0006',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色6'
}, {
id: '0007',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色7'
}, {
id: '0008',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门8'
}, {
id: '0009',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色9'
}],
swiperOption: {
pagination: '.swiper-pagination',
loop: true
}
}
}
}
</script>
在页面上看,似乎有一个问题,第9个图标被挤到下面去了,不是显示在滑动区域。如下图。
解决上面的问题,我们需要使用计算属性。
<script>
export default {
name: 'HomeIcons',
data: function () {
return {
iconList: [{
id: '0001',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门1'
}, {
id: '0002',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色2'
}, {
id: '0003',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门3'
}, {
id: '0004',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门4'
}, {
id: '0005',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色5'
}, {
id: '0006',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色6'
}, {
id: '0007',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色7'
}, {
id: '0008',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/20/831d62d2e1c7be02.png',
desc: '红门8'
}, {
id: '0009',
imgUrl: 'https://images3.c-ctrip.com/dj/201506/cxlogo.png',
desc: '橙色9'
}],
swiperOption: {
pagination: '.swiper-pagination',
loop: true
}
}
},
computed: {
pages () {
const pages = []
this.iconList.forEach((item, index) => {
const page = Math.floor(index / 8)
if (!pages[page]) {
pages[page] = []
}
pages[page].push(item)
})
return pages
}
}
}
</script>
在chrome 中安装 vue-devtools 之后,可以查看到,下图。
然后,再修改一下 template 中的内容。
注意一点,当描述文字太长,想显示省略号时,可以使用css 来完成。如下,最后三行。
.icon-desc
position: absolute
left: 0
right: 0
bottom: 0
height: .44rem
line-height: .44rem
color: $darkTextColor
text-align: center
overflow: hidden
white-space: nowrap
text-overflow: ellipsis
当然,可能很多地方,需要用到这个样式,我们可以使用stylus 的 mixins
先在style 目录下,创建mixins.styl 文件,那三行放在一个方法里。
然后在使用时,如下。
<style lang="stylus" scoped>
@import '~styles/variables.styl'
@import '~styles/mixins.styl'
.icons >>> .swiper-container
width: 100%
height: 0
padding-bottom: 50%
.icon
position: relative
overflow: hidden
float: left
width: 25%
height: 0
padding-bottom: 25%
.icon-img
position: absolute
top: 0
left: 0
right: 0
bottom: .44rem
box-sizing: border-box
padding: .1rem
.icon-img-content
height: 100%
display: block
margin: 0 auto
.icon-desc
position: absolute
left: 0
right: 0
bottom: 0
height: .44rem
line-height: .44rem
color: $darkTextColor
text-align: center
ellipsis()
</style>
然后,这部分就完成了,可以提交到分支了。
git push 之后
要合并
命令:
git checkout master (跳到master 分支)
git merge index-icons (当前分支与index-icons 分支合并)
git push