uni-app实现swiper滑动放大缩小、实现scroll-view与swiper双向联动

简介: uni-app实现swiper滑动放大缩小、实现scroll-view与swiper双向联动

#### uni-app实现swiper滑动放大缩小、实现scroll-view与swiper双向联动


# 先看效果图


![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/c66d0b4683df462f825cae11b656fa1e.gif#pic_center)



## 思路


1、利用scroll-view的scroll-into-view属性:值为某子元素id(id不能以数字开头)。设置哪个方向可滚动,则在**哪个方向滚动到该元素**

2、利用swiper的current属性:当前所在滑块的 index

## 布局代码


```

<template>

<view>

 <scroll-view class="scroll-top" scroll-x="true" show-scrollbar="false" :scroll-into-view="seqToView">

  <view class="scroll-view-item" v-for="(item,index) in list" :id="'seq-' + index" @click="tabClick(index)">

   <view class="scroll-view-item-view">

    <image class="scroll-top-item-image" :src="item.image"></image>

    <text class="scroll-top-item-text">{{item.title}}</text>

   </view>

  </view>

 </scroll-view>


 <swiper class="swiper-top" previous-margin='28px' next-margin='28px' @change="change" :current="currentIndex">

  <block v-for="(item,index) in swiperList" :key="index">

   <swiper-item>

    <view class="box" :animation="index == currentIndex?animationData:animationData2">

     <view class="imgcot">

      <image :src="item.image" mode="widthFix"></image>

     </view>

    </view>

   </swiper-item>

  </block>

 </swiper>


</view>

</template>

```


## 完整代码

```

<template>

<view>

 <scroll-view class="scroll-top" scroll-x="true" show-scrollbar="false" :scroll-into-view="seqToView">

  <view class="scroll-view-item" v-for="(item,index) in list" :id="'seq-' + index" @click="tabClick(index)">

   <view class="scroll-view-item-view">

    <image class="scroll-top-item-image" :src="item.image"></image>

    <text class="scroll-top-item-text">{{item.title}}</text>

   </view>

  </view>

 </scroll-view>


 <swiper class="swiper-top" previous-margin='28px' next-margin='28px' @change="change" :current="currentIndex">

  <block v-for="(item,index) in swiperList" :key="index">

   <swiper-item>

    <view class="box" :animation="index == currentIndex?animationData:animationData2">

     <view class="imgcot">

      <image :src="item.image" mode="widthFix"></image>

     </view>

    </view>

   </swiper-item>

  </block>

 </swiper>


</view>

</template>


<script>

export default {

 data() {

  return {

   list: [

    {

     image: '/static/image/member/es0-selected.png',

     title: '海关数据系统\n多账号免费用'

    },

    {

     image: '/static/image/member/es1-unselect.png',

     title: '建站推广服务\n抵用券'

    },

    {

     image: '/static/image/member/es2-unselect.png',

     title: '企业网站免费\n诊断1次'

    }, {

     image: '/static/image/member/es3-unselect.png',

     title: '海外广告投放\n免费开'

    }, {

     image: '/static/image/member/es4-unselect.png',

     title: '2CShop独立\n站商城试用'

    }, {

     image: '/static/image/member/es5-unselect.png',

     title: '提供优质服务\n商产品折扣'

    }

   ],

   swiperList: [

    {

     image: '/static/image/member/es0.png'

    },

    {

     image: '/static/image/member/es1.png'

    },

    {

     image: '/static/image/member/es2.png'

    },

    {

     image: '/static/image/member/es3.png'

    },

    {

     image: '/static/image/member/es4.png'

    },

    {

     image: '/static/image/member/es5.png'

    }

   ],

   currentIndex: 0,

   animationData: {},

   animationData2: {},

   currentSelect: 0,

   seqToView: '' // 滚动至序号

  }


 },

 methods: {

  tabClick(index) {

   if (index == this.currentSelect) {

    return

   } else {

    this.list[index].image = '/static/image/member/es' + index + '-selected.png'

    this.list[this.currentSelect].image = '/static/image/member/es' + this.currentSelect + '-unselect.png'

    this.currentSelect = index

    this.currentIndex = index

   }


  },

  change(e) {

   this.currentIndex = e.detail.current

   console.log(this.currentIndex)

   this.tabClick(this.currentIndex)

   this.seqToView = 'seq-' + this.currentIndex // 滚动至选中序号位置

  },

  scroll: function(e) {

   console.log(e)

   this.old.scrollTop = e.detail.scrollTop

  },

 },

 onLoad() {

  // 收缩

  var animation = uni.createAnimation({

   duration: 400,

   timingFunction: 'ease',

  })

  animation.scale(1).step()

  this.animationData = animation.export()

  // 展开

  var animation2 = uni.createAnimation({

   duration: 400,

   timingFunction: 'ease',

  })

  animation2.scale(0.94).step()

  this.animationData2 = animation2.export()

 },

}

</script>


<style>

.scroll-top {

 margin: 34rpx 54rpx 0 0;

 white-space: nowrap;

 width: 100%;

}


.scroll-view-item {

 display: inline-block;

 padding: 0 20rpx;

 font-size: 32rpx;

 color: #666666;

 line-height: 74rpx;

 position: relative;

}


.scroll-view-item-view {

 display: flex;

 flex-direction: column;

 align-items: center;

 flex-wrap: wrap;

}


.scroll-top-item-image {

 width: 90rpx;

 height: 90rpx;

}


.scroll-top-item-text {

 margin-top: 24rpx;

 width: 143rpx;

 font-size: 24rpx;

 font-family: PingFangSC-Medium;

 font-weight: 400;

 color: #372E1D;

 display: block;

 line-height: normal;

 text-align: center;

}


.swiper-top {

 height: 100vh;

 margin-top: 88rpx;

}


.swiper-block {

 height: 300rpx;

 width: 100%;

}


.swiper-item {

 display: flex;

 flex-direction: column;

 justify-content: center;

 align-items: flex-start;

 overflow: unset;

}


.slide-image {

 height: 250rpx;

 width: 520rpx;

 border-radius: 9rpx;

 box-shadow: 0px 0px 30rpx rgba(0, 0, 0, 0.2);

 margin: 0rpx 30rpx;

 z-index: 1;

}


.active {

 transform: scale(1.14);

 transition: all 0.2s ease-in 0s;

 z-index: 20;

}

</style>


```

相关文章
|
小程序 Android开发 网络架构
uni-app中使用scroll-view滚到底部时多次触发scrolltolower
uni-app中使用scroll-view滚到底部时多次触发scrolltolower
1255 0
uni-app中使用scroll-view滚到底部时多次触发scrolltolower
|
2月前
|
开发工具
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
阿里云点播服务web播放器sdk,短剧视频类App实现参考。仿抖音 仿陌陌 短视频 无限滑动播放 视频流。无uniapp video 原生组件的层级、遮挡、覆盖问题,适合与不同功能视图组合使用,实现丰富的应用功能。
uniapp, 短剧视频类App实现参考,支持滑动播放,仿抖音 仿陌陌 短视频 无限滑动播放 视频流
|
6月前
|
XML Java Android开发
Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)
Android App开发音量调节中实现拖动条和滑动条和音频管理器AudioManager讲解及实战(超详细 附源码和演示视频)
259 0
|
6月前
|
XML Java Android开发
Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)
Android App手势冲突处理中上下左右滑动的处理以及侧滑边缘菜单的讲解及实战(附源码 可直接使用)
477 0
|
6月前
|
XML Java Android开发
Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)
Android App事件交互中区分点击和长按动作以及识别手势滑动方向的讲解及实战(附源码 可直接使用)
502 0
uni-app swiper实现公告栏上下循环滚动(整理)
uni-app swiper实现公告栏上下循环滚动(整理)
|
JavaScript 小程序 前端开发
uni-app/微信小程序:scroll-view纵向滚动高度自适应flex布局填充剩余高度
uni-app/微信小程序:scroll-view纵向滚动高度自适应flex布局填充剩余高度
1134 0
|
数据安全/隐私保护
RadioGroup+ViewPager +Fragment 制作APP主界面底部导航和左右滑动
RadioGroup+ViewPager +Fragment 制作APP主界面底部导航和左右滑动
134 0
RadioGroup+ViewPager +Fragment 制作APP主界面底部导航和左右滑动
|
XML 存储 定位技术
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
238 0
Android 天气APP(二十五)地图天气(下)嵌套滑动布局渲染天气数据
|
API Android开发
Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报
Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报
261 0
Android 天气APP(二十一)滑动改变UI、增加更多天气数据展示,最多未来15天天气预报

热门文章

最新文章