template-project/components/function-list/swiper-gong-ge/swiper-gong-ge.vue

173 lines
5.1 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<view class="posir">
<swiper class="bacf width100"
:current="currentIndex"
:indicator-dots="ifAutoplay"
:autoplay="false"
:duration="500"
:style="{paddingBottom:itemTop,height: swiperHeight+'px'}"
@change="changeEv">
<swiper-item v-for="(items,indexs) in list" :key="indexs">
<view class="disac fw">
<block v-for="(item,index) in items" :key="index">
<view @tap="chooseGe(item.url,index)" class="disjcac fc swiper-item-box" :style="{width:['50%','50%','50%','33.3%','25%','20%'][rowNum],paddingTop:itemTop}">
<view class="disjcac" :style="{height: maxHeight+'rpx'}">
<!-- 图片 -->
<image :src="item.iconsrc" mode="widthFix" :style="{width: item.iconWidth +'rpx',height: item.iconHeight +'rpx'}"></image>
</view>
<!-- 标题 -->
<view class="clips1" :style="{color:titlec,fontSize:fonts,marginTop:titleTop}">{{item.title}}</view>
</view>
</block>
</view>
</swiper-item>
</swiper>
<!-- 指示点 -->
<view class="posia disjcac width100" style="bottom: 20rpx;">
<view class="mar-y10 gong-ge-spot"
:class="currentIndex==index ? 'active-spot' : ''"
v-for="(item,index) in list.length" :key="index"
:style="{backgroundColor:currentIndex==index ? activeStop : moStop}"></view>
</view>
</view>
</template>
<script>
import imgTools from '@/jsFile/img/yy-img.js';
export default {
name:'column-function',
props:{
list:{
type:Array,
default:()=>{
return [
[
{url:'',iconsrc:'/static/tabbar/icon-select-person.png',iconWidth:60,iconHeight:60,title:'标题一'},
{url:'',iconsrc:'/static/tabbar/icon-select-fun.png',iconWidth:60,iconHeight:60,title:'标题二'},
{url:'',iconsrc:'/static/tabbar/icon-select-home.png',iconWidth:60,iconHeight:60,title:'标题三'},
{url:'',iconsrc:'/static/tabbar/icon-select-news.png',iconWidth:60,iconHeight:60,title:'标题四'},
{url:'',iconsrc:'/static/tabbar/icon-select-news.png',iconWidth:60,iconHeight:60,title:'标题四'},
{url:'',iconsrc:'/static/tabbar/icon-select-news.png',iconWidth:60,iconHeight:60,title:'标题四'},
],
[
{url:'',iconsrc:'/static/tabbar/icon-select-person.png',iconWidth:60,iconHeight:60,title:'标题一'},
{url:'',iconsrc:'/static/tabbar/icon-select-fun.png',iconWidth:60,iconHeight:60,title:'标题二'},
{url:'',iconsrc:'/static/tabbar/icon-select-home.png',iconWidth:60,iconHeight:60,title:'标题三'},
{url:'',iconsrc:'/static/tabbar/icon-scan.png',iconWidth:60,iconHeight:60,title:'标题五'},
]
]
}
},
// 是否自动轮播
ifAutoplay:{
type:Boolean,
default:false
},
// 一排显示数量
rowNum:{
type:String,
default:'5'
},
// 标题颜色
titlec:{
type:String,
default:'#000000'
},
// 字体大小
fonts:{
type:String,
default:'28rpx'
},
// 字体距离图标的距离
titleTop:{
type:String,
default:'20rpx'
},
// item的顶部距离
itemTop:{
type:String,
default:'50rpx'
},
// 选中时指示点的颜色
activeStop:{
type:String,
default:'rgba(0,0,0,1)'
},
// 未选中时指示点的颜色
moStop: {
type:String,
default:'rgba(0,0,0,.2)'
}
},
data(){
return {
currentIndex:0,
swiperHeight:0,
}
},
mounted() {
this.changeHeight();
},
computed:{
// 找图标高度最大值
maxHeight() {
let arr = [];
this.list.forEach(item=>{arr.push(item.iconHeight);})
let max = arr.reduce((a,b)=>{return b > a ? b : a})
return max;
}
},
methods:{
// 改变swiper的高度
changeHeight() {
const query = uni.createSelectorQuery().in(this)
query.select('.swiper-item-box').boundingClientRect((rect) => {
// 查询单个格子的高度并设置swiper的高
if(this.list[this.currentIndex].length <= this.rowNum) {
// 如果每轮的数组长度,小于等于一排显示的个数,那么设置一个格子的高度
this.swiperHeight = rect.height*1 + 10;
} else {
// 如果每轮的数组长度,大于一排显示的个数,那么设置两个个格子的高度
this.swiperHeight = rect.height*2 + 10;
}
}).exec()
},
// 列表选择事件
chooseGe(url,index) {
// console.log(imgTools.uploadImg(),137);
// imgTools.chooseCompressImg();
imgTools.chooseCompressImg().then(res=>{
console.log(imgTools.getImgInfo(res));
})
// 抛出事件
// this.$emit('chooseGe',{url,index})
// if(url) {
// uni.navigateTo({url})
// }
},
changeEv(e) {
this.currentIndex = e.detail.current;
this.changeHeight();
}
}
}
</script>
<style>
.gong-ge-spot{
width: 20rpx;height: 20rpx;
border-radius: 100%;
background-color: rgba(0, 0, 0, .2);
}
.active-spot{
background-color: rgba(0, 0, 0, .5);
animation: gongspot 3s linear alternate infinite;
}
@keyframes gongspot{
0%{background-color: rgba(0, 0, 0, 1);}
25%{background-color: rgba(255, 0, 0, 1);}
50%{background-color: rgba(0, 255, 0, 1);}
75%{background-color: rgba(0, 0, 255, 1);}
100%{background-color: rgba(0, 0, 0, 1);}
}
</style>