| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257 |
- <template>
- <view class="gui-swiper-card-wrap">
- <swiper
- :style="{
- width:width+'rpx',
- height:heightIn+'rpx'
- }"
- class="gui-swiper-card"
- :indicator-dots="false"
- :interval="interval"
- :circular="true"
- :autoplay="autoplay"
- :current="currentIndex"
- :previous-margin="spacing+'rpx'"
- :next-margin="spacing+'rpx'"
- @change="swiperchange">
- <swiper-item
- v-for="(item, index) in swiperItems"
- :key="index"
- class="gui-swiper-card-item gui-border-box">
- <navigator
- class="gui-swiper-card-nav gui-transition-all"
- :url="item.url"
- :open-type="item.opentype"
- hover-class="none"
- v-if="item.opentype != 'click'"
- :style="{
- paddingLeft:current != index ? padding +'rpx':'0rpx',
- paddingRight:current != index ? padding +'rpx':'0rpx',
- paddingTop:current != index ? paddingY +'rpx':'0rpx',
- paddingBottom:current != index ? paddingY +'rpx':'0rpx'
- }">
- <image
- :style="{
- borderRadius : borderRadius,
- width:current != index ? widthInSamll+'rpx':widthIn+'rpx',
- height:current != index ? heightInSmall+'rpx':heightIn+'rpx',
- opacity:current != index ? opacity : 1
- }"
- :src="item.img"
- :mode="imgMode"
- class="gui-swiper-card-image gui-transition-all" />
- </navigator>
- <view
- class="gui-swiper-card-nav gui-transition-all"
- hover-class="none"
- v-if="item.opentype == 'click'"
- @tap.stop="taped"
- :data-index="index"
- :style="{
- paddingLeft:current != index ? padding +'rpx':'0rpx',
- paddingRight:current != index ? padding +'rpx':'0rpx',
- paddingTop:current != index ? paddingY +'rpx':'0rpx',
- paddingBottom:current != index ? paddingY +'rpx':'0rpx'
- }">
- <image
- :style="{
- borderRadius : borderRadius,
- width:current != index ? widthInSamll+'rpx':widthIn+'rpx',
- height:current != index ? heightInSmall+'rpx':heightIn+'rpx',
- opacity:current != index ? opacity : 1
- }"
- :src="item.img"
- :mode="imgMode"
- class="gui-swiper-card-image gui-transition-all" />
- </view>
- <view
- v-if="indicatorType == 'number'"
- class="gui-indicator-dot-numbers gui-flex gui-row gui-nowrap"
- :class="indicatorBarBgClass"
- :style="{
- height:indicatorBarHeight+'rpx',
- 'border-bottom-left-radius':borderRadius,
- 'border-bottom-right-radius':borderRadius,
- width:current != index ? widthInSamll+'rpx':widthIn+'rpx',
- left:current != index ? padding+'rpx':'0rpx',
- bottom:current != index ? paddingY+'rpx':'0rpx'
- }">
- <text
- class="gui-indicator-dot-text"
- :style="{
- paddingLeft:'20rpx',
- 'fontStyle':'italic',
- color:titleColor
- }">{{index+1}}</text>
- <text
- class="gui-indicator-dot-text"
- :style="{
- 'fontSize':'36rpx',
- color:titleColor
- }">/</text>
- <text
- class="gui-indicator-dot-text"
- :style="{
- fontSize:'28rpx',
- paddingRight:'20rpx',
- fontStyle:'italic',
- color:titleColor
- }">{{swiperItems.length}}</text>
- <text
- class="gui-swiper-text gui-block-text gui-flex1 gui-ellipsis"
- :style="{
- color:titleColor,
- fontSize:titleSize,
- height:indicatorBarHeight+'rpx',
- lineHeight:indicatorBarHeight+'rpx'
- }">{{item.title}}</text>
- </view>
- </swiper-item>
- </swiper>
- <!-- 进度圆点 -->
- <view
- class="gui-indicator-dots gui-flex gui-row gui-nowrap gui-justify-content-center gui-align-items-center gui-border-box"
- v-if="indicatorType == 'dot'"
- :style="{
- width:width+'rpx',
- height:indicatorBarHeight+'rpx',
- position:indicatorPosition,
- paddingLeft:spacing+'rpx',
- paddingRight:spacing+'rpx',
- 'justify-content':indicatorDirection
- }">
- <view
- class="gui-indicator-dots-wrap gui-flex gui-row gui-nowrap gui-justify-content-center">
- <view
- v-for="(item, index) in swiperItems"
- :key="index"
- :class="[
- 'gui-indicator-dot',
- current == index ? 'dot-show' : '',
- current == index ? indicatorActiveClass : indicatorClass
- ]"
- :style="{
- width : current != index ? indicatorWidth+'rpx' : indicatorActiveWidth +'rpx',
- height : indicatorHeight+'rpx',
- borderRadius : indicatorRadius+'rpx',
- }"></view>
- </view>
- </view>
- </view>
- </template>
- <script>
- export default{
- name : "gui-swiper",
- props : {
- width :{ type : Number, default : 750 },
- height:{ type : Number, default : 300 },
- swiperItems : {
- type : Array,
- default : function(){
- return new Array();
- }
- },
- borderRadius : { type : String, default : '10rpx'},
- indicatorBarHeight:{type : Number, default : 68},
- indicatorBarBgClass:{
- type : Array,
- default : function(){
- return ['gui-bg-black-opacity5'];
- }
- },
- indicatorWidth : { type:Number, default:18 },
- indicatorActiveWidth :{ type:Number, default:18 },
- indicatorHeight : { type:Number, default:18 },
- indicatorRadius:{ type:Number, default:18 },
- indicatorClass : {
- type : Array,
- default : function(){
- return ['gui-bg-gray','gui-dark-bg-level-5'];
- }
- },
- indicatorActiveClass : {
- type : Array,
- default : function(){
- return ['gui-bg-primary'];
- }
- },
- indicatorType:{ type : String, default : "dot" },
- indicatorPosition:{ type : String, default : "absolute" },
- indicatorDirection:{type:String, default:'center'},
- // #ifndef APP-NVUE
- spacing : { type : Number, default : 50 },
- // #endif
- // #ifdef APP-NVUE
- spacing : { type : Number, default : 0 },
- // #endif
- // #ifdef APP-NVUE
- padding : { type : Number, default : 0 },
- // #endif
- // #ifndef APP-NVUE
- padding : { type : Number, default : 26 },
- // #endif
- interval : { type : Number, default : 5000 },
- autoplay : { type : Boolean, default : true },
- currentIndex : { type : Number, default : 0 },
- opacity:{ type : Number, default:0.66},
- titleColor:{type:String, default:"#FFFFFF"},
- titleSize:{type:String, default:"28rpx"},
- imgMode:{type:String, default:'aspectFill'}
- },
- data() {
- return {
- current : 0,
- isReady : false,
- widthIn : 750,
- heightIn : 300,
- widthInSamll:700,
- heightInSmall:280,
- paddingY:0
- }
- },
- watch:{
- currentIndex : function (val) {
- this.current = val;
- }
- },
- created:function(){
- this.current = this.currentIndex;
- this.init();
- },
- methods:{
- init : function(){
- // 图片宽高计算
- this.widthIn = this.width - this.spacing*2;
- this.heightIn = this.height / this.width * this.widthIn;
- this.paddingY = this.padding * this.height / this.width;
- this.widthInSamll = this.widthIn - this.padding * 2;
- this.heightInSmall = this.heightIn - this.paddingY * 2;
- },
- swiperchange : function (e) {
- var current = e.detail.current;
- this.current = current;
- this.$emit('swiperchange', current);
- },
- taped : function(e){
- this.$emit('taped', e.currentTarget.dataset.index);
- }
- },
- emits : ['swiperchange', 'taped']
- }
- </script>
- <style scoped>
- .gui-swiper-card-wrap{position:relative;}
- .gui-swiper-card{overflow:hidden;}
- .gui-swiper-card-item{font-size:0; overflow:hidden; line-height:0;}
- .gui-swiper-card-nav{font-size:0; position:relative;}
- .gui-indicator-dots{width:750rpx; overflow:hidden; z-index:1; left:0; bottom:0;}
- .gui-indicator-dot{margin:6rpx;}
- .gui-indicator-dots-wrap{padding:0 20rpx;}
- .gui-indicator-dot-text{text-align:center; line-height:68rpx; padding:0 4rpx; color:#FFFFFF; font-size:32rpx;}
- .gui-indicator-dot-numbers{overflow:hidden; align-items:center; position:absolute; z-index:1; left:0; bottom:0;}
- .gui-swiper-text{width:200rpx; line-height:68rpx; padding-right:25rpx; overflow:hidden;}
- /* #ifndef APP-NVUE */
- @keyframes dot-show{from{opacity:0.1;}to{opacity:1;}}
- .dot-show{animation:dot-show 300ms linear forwards;}
- /* #endif */
- </style>
|