首先去Swiper.vue组件中吧Swiper标签复制过来用
<swiper>
<swiper-slide>
<div class="icon">
<div class="icon-img">
<img class='icon-img-content' src='XXX'>
</div>
<p class="icon-desc">
</p>
</div>
</swiper-slide>
</swiper>
然后在组件中添加data数据: iconList数组 数据量自己加
<script>
export default {
name: 'HomeIcons',
data: () => {
return {
iconList: [{
id: '001',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/95/f3dd6c383aeb3b02.png',
desc: '热门景点'
}, {
id: '002',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1804/5a/13ceb38dcf262f02.png',
desc: '一日游'
}, {
id: '003',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1804/ff/fdf170ee89594b02.png',
desc: '厦门必游'
}, {
id: '004',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/97/02f5043b51b2102.png',
desc: '鼓浪屿'
}, {
id: '005',
imgUrl: 'http://img1.qunarzz.com/piao/fusion/1803/95/f3dd6c383aeb3b02.png',
desc: '热门景点'
}]
}
},
然后使用v-for循环
<div class="icons">
<swiper>
<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>
这样写完之后,表面上看好像是OK了。但是 会有一个问题。超过8个的时候,第9个图标会再另起一行(被隐藏起来,但是F12那边是可以看得到位置是在第三行)而不是到第二个分页。
所以我们需要使用计算函数来手动进行分页
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
}
}
这样就可以在超过8个图标的时候自动分一页(第二个子数组)
然后在<swiper-slide>那边进行迭代了
<div class="icons">
<swiper>
<swiper-slide v-for="(page, index) of pages" :key="index">
<div class="icon" v-for="item of page" :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>
还有最后一个问题就是如果图标的描述(desc)字数过多的解决办法。
情况是这样:(rrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr)
那如果我希望在文字描述过长的时候使用...来替代,我要咋做?
我只需要在.icon-desc类中添加CSS样式:
overflow: hidden
white-space: nowrap
text-overflow: ellipsis
如果这个样式在别的地方也想用到,但是又不想重复写代码
那就这样干:
新建src/assets/style/mixins.styl
然后新建函数,将此样式写进函数中:
ellipsis()
overflow: hidden
white-space: nowrap
text-overflow: ellipsis
然后在.Icons.vue的<style>中导入该文件
@import '~styles/mixins.styl'
然后在.icon-desc中添加ellipsis()函数即可
.icon-desc
position: absolute
left: 0
right: 0
bottom: 0
height: .44rem
line-height: .44rem
text-align: center
color: $darkTextColor
ellipsis()
效果图:
最后总结几个CSS样式和JS函数的作用:
js: forEach(function()):
迭代数组。每迭代一次就执行后面的函数。并且能够传值给后面的函数。
Math.floor(x)
返回小于或等于x的最大整数(简称向下取整)
比如 Math.floor(44.333)
返回44
Math.floor(56.99)
返回56
white-space: nowrap: 设定文本不换行,直到</br>
text-overflow: ellipsis:当文本溢出包含元素时使用...来替代