使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果


Posted in Javascript onAugust 16, 2019

旋转叠加

使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果

平移

使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果

前段时间做Hybrid App,UI设计湿要求某一个页面的展示要实现滑动轮播效果,选中的内容卡片居中显示,上一个内容卡片和下一个内容以小一倍的大小显示在选中的卡片后头,而且要高斯模糊等等。。最骚的是滑动特效要是一个个旋转叠加。(摔!

当时用的是vue-cli-3 + ant-design-vue实现的页面,发现ant-design-vue里头有现成的Carousel组件可用,由于排期比较急,先暂时用这个实现了第一版,没有特效没有其他花里胡哨的展示。验收完第一版后,发现ant-design-vue的坑是真的多啊。。Carousel在移动端也是十分的不流畅。总是就是体验特别的不好。最后一气之下,全部样式自己写,全部组件自己封装,将ant-design-vue完完整整移出了项目。

轮播图这块想到了Swiper这一好东西,现在已经有了vue版,但是是没有专门的vue版文档的,可以找到的项目也比较少。无奈之下啃了Swiper4文档,一顿猛操作,摸到了一点点门道。把需求实现了是也。简单整理了一下,写了个简单的小demo,记录一下,如果可以帮到你那是最好啦~

1.首先引入Vue-Awesome-Swiper

引入Vue-Awesome-Swiper有两种方式,一种是全局引入,一种是组件内引入。如果你的项目里只有一个地方要用到这玩意,那就在用到的那个页面引入就行,如果多个地方要用到,那就全局引入吧。

全局引入:

// main.js
import VueAwesomeSwiper from 'vue-awesome-swiper'
import 'swiper/dist/css/swiper.css'
Vue.use(VueAwesomeSwiper, /* { default global options } */)

组件内引入:

// xxx.vue
<script>
import 'swiper/dist/css/swiper.css'
import { swiper, swiperSlide } from 'vue-awesome-swiper'
export default {
 components: {
  swiper,
  swiperSlide
 }
}
</script>

2.在页面使用

<template>
 <div class="swiper-content">
  <swiper ref="mySwiper" :options="swiperOption" class="show-swiper">
   <template v-for="(item, index) in list">
    <swiper-slide :key="index">
     <div class="swiper-item">
      <span>{{ item }}</span>
     </div>
    </swiper-slide>
   </template>
  </swiper>
 </div>
</template>

js部分

旋转叠加

<script>
import { mapState } from 'vuex'
import store from '@/store'
export default {
 data() {
  return {
   list: [1, 2, 3, 4, 5, 6],
   swiperOption: {
    // 设置slider容器能够同时显示的slides数量,默认为1, 'auto'则自动根据slides的宽度来设定数量
    slidesPerView: 'auto',
    /*
    * 开启这个参数来计算每个slide的progress(进度、进程)
    * 对于slide的progress属性,活动的那个为0,其他的依次减1
    */
    watchSlidesProgress: true,
    // 默认active slide居左,设置为true后居中
    centeredSlides: true,
    // 当你创建一个Swiper实例时是否立即初始化,这里我们手动初始化
    init: false,
    on: {
     progress: function() {
      for (let i = 0; i < this.slides.length; i++) {
       const slide = this.slides.eq(i) // 指定匹配元素集缩减值
       const slideProgress = this.slides[i].progress // 当前元素集的progress值

       let modify = 0 // 偏移权重
       if (parseInt(Math.abs(slideProgress)) > 0) {
        modify = Math.abs(slideProgress) * 0.2 // 不一定要0.2,可自行调整
       }
       const translate = slideProgress * modify * 500 + 'px' // 500是swiper-slide的宽度
       const scale = 1 - Math.abs(slideProgress) / 5 // 缩放权重值,随着progress由中向两边依次递减,可自行调整
       const zIndex = 99 - Math.abs(Math.round(10 * slideProgress))
       slide.transform(`translateX(${translate}) scale(${scale})`)
       slide.css('zIndex', zIndex)
       slide.css('opacity', 1) // 是否可见
       if (parseInt(Math.abs(slideProgress)) > 1) { // 设置了只有选中的元素以及他两遍的显示,其他隐藏
        slide.css('opacity', 0)
       }
      }
     },
     slideChange: function() {
      store.commit('SET_ACTIVE_INDEX', this.activeIndex)
     }
    }
   }
  }
 },
 computed: {
  swiper() {
   return this.$refs.mySwiper.swiper
  },
  ...mapState({
   activeItemIndex: state => state.activeIndex
  })
 },
 mounted() {
  this.initSwiper()
 },
 methods: {
  initSwiper() {
   this.$nextTick(async() => {
    await this.swiper.init() // 现在才初始化
    await this.swiper.slideTo(this.activeItemIndex)
   })
  }
 }
}
</script>

平移

<script>
import { mapState } from 'vuex'
import store from '@/store'
export default {
 data() {
  return {
   list: [1, 2, 3, 4, 5, 6],
   swiperOption: {
    slidesPerView: 'auto',
    watchSlidesProgress: true,
    // 设定slide与左边框的预设偏移量(单位px)
    slidesOffsetBefore: 37,
    // 设置slide之间的距离(单位px)
    spaceBetween: 17,
    centeredSlides: true,
    init: false,
    on: {
     progress: function() {
      for (let i = 0; i < this.slides.length; i++) {
       const slide = this.slides.eq(i)
       const slideProgress = this.slides[i].progress

       const scale = 1 - Math.abs(slideProgress) / 5 // 缩放权重值,随着progress由中向两边依次递减,可自行调整
       slide.transform(`scale3d(${scale}, ${scale}, 1)`)
      }
     },
     slideChange: function() {
      store.commit('SET_ACTIVE_INDEX', this.activeIndex)
     }
    }
   }
  }
 },
 computed: {
  swiper() {
   return this.$refs.mySwiper.swiper
  },
  ...mapState({
   activeItemIndex: state => state.activeIndex
  })
 },
 mounted() {
  this.initSwiper()
 },
 methods: {
  initSwiper() {
   this.$nextTick(async() => {
    await this.swiper.init() // 现在才初始化
    await this.swiper.slideTo(this.activeItemIndex)
   })
  }
 }
}
</script>

配置参数那里,init我是设置的false,我是想在项目挂载完成后,获取到了接口数据之后,再用 this.swiper.init() 去初始化轮播组件的,然后我把激活项的索引存在了vuex里头,这样每次从其他页面返回这个页面,就可以用 this.swiper.slideTo(this.activeItemIndex) 去控制我要定位到哪一个内容卡片先。

3.样式初始化方面

swiper-content {
 width: 100%;
 height: 100%;
 position: relative;
 overflow: hidden;
 margin: 0 auto;
 padding: 50px 0;

 .show-swiper {
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;

  .swiper-slide {
   width: 500px;
   // 表示所有属性都有动作效果,过度时间为0.4s,以慢速开始和结束的过渡效果
   transition: all .4s cubic-bezier(.4, 0, .2, 1);
   
   .swiper-item {
    width: 100%;
    height: 500px;
    background: rgb(140, 172, 134);
    border-radius: 6px;
    color: orangered;
    font-size: 24px;
    line-height: 1.5;
    border: 1px solid orangered;
   }
  }
 }
}

因为 slidesPerView: 'auto' ,所以swiper-slide我们要给他一个初始化的宽度,以便他自动计算容器宽度,然后这里我设置了动画的效果 transition: all .4s cubic-bezier(.4, 0, .2, 1); 可以根据自己的需要作出改动

大概就是这些内容,是不是很简单呢。我会把源码地址贴出来,有需要的话就自行clone参考吧~,项目里我使用的是vue-cli3,可以自行调整。

总结

以上所述是小编给大家介绍的使用Vue-Awesome-Swiper实现旋转叠加轮播效果&平移轮播效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
Jquery中对数组的操作代码
Aug 12 Javascript
jquery使用append(content)方法注意事项分享
Jan 06 Javascript
JS实现根据出生年月计算年龄
Jan 10 Javascript
将中国标准时间转换成标准格式的代码
Mar 20 Javascript
浅谈JavaScript中的作用域和闭包问题
Jul 07 Javascript
javascript封装简单实现方法
Aug 11 Javascript
原生js调用json方法总结
Feb 22 Javascript
对angular4子路由&amp;辅助路由详解
Oct 09 Javascript
可能被忽略的一些JavaScript数组方法细节
Feb 28 Javascript
微信小程序实现点击图片放大预览
Oct 21 Javascript
卸载vue2.0并升级vue_cli3.0的实例讲解
Feb 16 Javascript
vue项目中自定义video视频控制条的实现代码
Apr 26 Javascript
详解Vue中组件传值的多重实现方式
Aug 16 #Javascript
详解vue+axios给开发环境和生产环境配置不同的接口地址
Aug 16 #Javascript
JavaScript JSON数据处理全集(小结)
Aug 15 #Javascript
JointJS JavaScript流程图绘制框架解析
Aug 15 #Javascript
基于vue写一个全局Message组件的实现
Aug 15 #Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
Aug 15 #Javascript
解决vuex刷新状态初始化的方法实现
Aug 15 #Javascript
You might like
表格展示无限级分类(PHP版)
2012/08/21 PHP
实用的PHP带公钥加密类分享(每次加密结果都不一样哦)
2014/08/20 PHP
php数组比较实现查找连续数的方法
2015/07/29 PHP
php析构函数的简单使用说明
2015/08/24 PHP
Symfony2联合查询实现方法
2016/03/18 PHP
PHP使用imagick扩展实现合并图像的方法
2017/04/25 PHP
php实现的双色球算法示例
2017/06/20 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
jquery 最简单易用的表单验证插件
2010/02/27 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
jquery利用event.which方法获取键盘输入值的代码
2011/10/09 Javascript
jQuery EasyUI API 中文文档 - Calendar日历使用
2011/10/19 Javascript
用window.onerror捕获并上报Js错误的方法
2016/01/27 Javascript
在页面中输出当前客户端时间javascript实例代码
2016/03/02 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
JavaScript禁止微信浏览器下拉回弹效果
2017/05/16 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
这15个Vue指令,让你的项目开发爽到爆
2019/10/11 Javascript
解决axios post 后端无法接收数据的问题
2019/10/29 Javascript
解决 window.onload 被覆盖的问题方法
2020/01/14 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
怎样使用Python脚本日志功能
2016/08/14 Python
Python数据结构与算法之常见的分配排序法示例【桶排序与基数排序】
2017/12/15 Python
Python使用Matplotlib模块时坐标轴标题中文及各种特殊符号显示方法
2018/05/04 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
讲解Python3中NumPy数组寻找特定元素下标的两种方法
2019/08/04 Python
关于pytorch多GPU训练实例与性能对比分析
2019/08/19 Python
python 实现按对象传值
2019/12/26 Python
如何使用Python调整图像大小
2020/09/26 Python
试述DBMS的主要功能
2016/11/13 面试题
幼儿教师个人求职信范文
2013/09/21 职场文书
大学生学习自我评价
2014/01/13 职场文书
redis 解决库存并发问题实现数量控制
2022/04/08 Redis