国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

使用Vue-Awesome-Swiper實現旋轉疊加輪播效果&平移輪播效果

2019-11-19 11:01:55
字體:
來源:轉載
供稿:網友

旋轉疊加


平移


前段時間做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.jsimport 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實現旋轉疊加輪播效果&平移輪播效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!
如果你覺得本文對你有幫助,歡迎轉載,煩請注明出處,謝謝!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 永仁县| 扎囊县| 四会市| 镇江市| 大石桥市| 溧水县| 锡林郭勒盟| 崇州市| 商都县| 佛学| 卢氏县| 德惠市| 兴化市| 龙游县| 临沂市| 郎溪县| 淳安县| 黑龙江省| 佳木斯市| 兴和县| 上思县| 台州市| 沙河市| 陇川县| 盐城市| 和田县| 临颍县| 隆昌县| 彭阳县| 海伦市| 金山区| 兴国县| 澳门| 青田县| 临武县| 吴旗县| 砚山县| 上林县| 阳信县| 深泽县| 乐平市|