成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

vue組件之輪播圖實(shí)現(xiàn)

xuweijian / 2161人閱讀

摘要:預(yù)覽地址圖片的輪播假設(shè)需要輪播三張圖片,以前的思路就如圖所示,添加兩個(gè)節(jié)點(diǎn)。通過(guò)索引的切換實(shí)現(xiàn)組件的無(wú)縫輪播。這樣子父組件就可以通過(guò)鉤子和來(lái)實(shí)時(shí)通知子組件,從而控制內(nèi)容的展示。這個(gè)判斷只需讓子組件來(lái)做就行了。

預(yù)覽地址

圖片的輪播

假設(shè)需要輪播三張圖片(1,2,3),以前的思路就如圖所示,添加兩個(gè)節(jié)點(diǎn)。通過(guò)索引(index)的切換實(shí)現(xiàn)組件的無(wú)縫輪播。


這種想法的確可行,而且實(shí)現(xiàn)出來(lái)效果還不錯(cuò)。
缺點(diǎn)在于

大量的dom操作。

代碼邏輯相對(duì)挺復(fù)雜,量也更多。

重構(gòu)或添加新功能會(huì)更麻煩

現(xiàn)在的思路

創(chuàng)建兩個(gè)組件分別為 carouselcarousel-item

結(jié)構(gòu)如下


         
          
1
2
3

selected即為顯示的內(nèi)容的name,用sync做一個(gè)"雙向綁定"。這樣子父組件就可以通過(guò) updated鉤子和$children來(lái)實(shí)時(shí)通知子組件,從而控制內(nèi)容的展示。

updated(){
           this.updateChildrens(this.selected)
       }
   methods:{
       updateChildrens(){
           //被選中的那個(gè)可以顯示了,其他的關(guān)閉
       }
   }

也就是說(shuō) carousel負(fù)責(zé)數(shù)據(jù)通信,而carousel-item只需完成動(dòng)畫(huà)過(guò)渡效果就行了,這樣邏輯就非常清晰了。

這里當(dāng)然就存在動(dòng)畫(huà)正向與反向的問(wèn)題,需要兩種方向不同的切入切出的動(dòng)畫(huà)。
carousel需要做一次判斷然后在updateChildrens的時(shí)候就告訴子組件方向。

進(jìn)入方向的判斷

需要一個(gè)變量記錄上一次的selected數(shù)值,假設(shè)就為 oldSelectednewSelected

自動(dòng)輪播是默認(rèn)正向的(往后播放),到最后一個(gè)的時(shí)候回到第一個(gè)應(yīng)該也是正向的

圓點(diǎn)(圖片索引圖標(biāo))選取切換,只需判斷兩次變量的大小就行

方向鍵切換(箭頭圖標(biāo)),和自動(dòng)輪播同理,方向應(yīng)時(shí)刻和箭頭方向一致

解決跳過(guò)中間圖片的問(wèn)題

不管輪播圖數(shù)量多少,這里始終只在兩張圖里面切換。這樣就涉及到一個(gè)問(wèn)題就是會(huì)
跳過(guò)中間的圖片

首先carousel-item有一個(gè)默認(rèn)的圖片過(guò)渡時(shí)間,這里可以通過(guò)計(jì)算oldSelectednewSelected之間的差值來(lái)確定跳過(guò)圖片的數(shù)量。當(dāng)然也有動(dòng)畫(huà)方向的問(wèn)題。

 clickSelected(newSelected){
               clearInterval(this.timer2)
               if(oldSelected===newSelected)return
               lastSelected = oldSelected
                // .............
               this.‘控制時(shí)長(zhǎng)的函數(shù)’(lastSelected,newSelected)
           },
           
  "控制時(shí)長(zhǎng)的函數(shù)"(lastSelected,newSelected){
               //........
               let newIndex = newSelected 
               let animationDuration = "計(jì)時(shí)器的間隔時(shí)長(zhǎng)"
               theIndex = ‘下一個(gè)展示的圖片索引’
               //.......
             this.duration = duration  
               this."carousel組件".forEach(vm=>vm.duration=duration)
               this.$emit("update:selected",names[theIndex])//通知一下父組件將要展示的下一個(gè)圖片的索引
               if(theIndex===newIndex)return
               this.timer2 = setInterval(()=>{
                   if(theIndex===newIndex){
                       this.clearAndSet()
                   }
                   this.$emit("update:selected",names[theIndex])
                   oldIndex>newIndex?theIndex--:theIndex++
               },duration*animationDuration)
  }        

基本就能完成跳過(guò)中間圖片的這樣子的問(wèn)題了,后面的click改為 hover觸發(fā)功能就很簡(jiǎn)單了。

## Card卡片化


需要默認(rèn)三個(gè)同時(shí)出現(xiàn)的圖片,這意味著需要一個(gè)數(shù)組。
但是依然不需要改變selected的數(shù)據(jù)類型(還是字符串)。這種情況用傳遞數(shù)組只會(huì)添加許多不必要的麻煩和降低性能,像是需要做深拷貝,遍歷判斷這類的。
因?yàn)檫@個(gè)應(yīng)該出現(xiàn)的圖片的數(shù)組里面的index都是連號(hào)的。這個(gè)判斷只需讓子組件來(lái)做就行了。

現(xiàn)在在carousel-item通過(guò)計(jì)算得到一個(gè)數(shù)組

this.cardSelected = [selected-1,selected,selected+1]
if(`最后一張圖`){
    //.....
}else if(`第一張圖`){
    
}

現(xiàn)在實(shí)時(shí)顯示的三張圖片的數(shù)組已經(jīng)有了,我只需要分配好他們的位置(左邊,中間,右邊

"我是決定位置的函數(shù)"(){
    let [index,position] = [this.cardSelected.indexOf(Number(this.name)),["left","main","right"]]
    return `position-${position[index]}`
}

簡(jiǎn)單的兩行就搞定了。

然后綁定一下

 :class="{......,[我是決定位置的函數(shù)]:card}">

剩下的定位還是動(dòng)畫(huà)什么的,都可以交給css去完成了。

 &.position-left{
     width: 50%;
     position: absolute;
     top: 0;
     left: -10px;
     transform:scale(0.82);
   }
   &.position-main{
     width: 50%;
     transform: translateX(50%);
     position: relative;
     z-index: 3;
   }
   &.position-right{
     transform: translateX(100%) scale(0.82);
     width: 50%;
     position: absolute;
     top: 0;
     left: 10px;
   }

最后就是點(diǎn)擊兩側(cè)圖片會(huì)切換

調(diào)用父組件的方法就ok了

   "調(diào)用父組件的方法"(){
          let [direction,index] = [this."我是決定位置的函數(shù)".slice(9,16),this.$parent.selectedIndex]
          if(direction==="main")return
           let move = {left:"back", right:"go"}
           this.$parent."我是父組件的方法"(index,move[direction])
     }

## 尚未完善的細(xì)節(jié)

其實(shí)我認(rèn)為動(dòng)畫(huà)還是有一點(diǎn)點(diǎn)瑕疵的,后面會(huì)在css上修改一下,順便簡(jiǎn)單調(diào)整樣式和更換動(dòng)態(tài)svg。最后,有待加強(qiáng)的地方希望大佬們指出來(lái)交流,要是覺(jué)得還行的話,給我的項(xiàng)目點(diǎn)個(gè)star就是最好的了。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/102800.html

相關(guān)文章

  • 移動(dòng)端橫向滑屏之輪播圖

    摘要:圖片描述移動(dòng)端的輪播圖可以有很多方式實(shí)現(xiàn),最常見(jiàn)的可以使用定位手指事件。四手指移入移出開(kāi)關(guān)定時(shí)器 圖片描述 移動(dòng)端的輪播圖可以有很多方式實(shí)現(xiàn),最常見(jiàn)的可以使用定位 + 手指事件。但是我這里介紹的是 CSS3 中的 2d 變換和手指事件,因?yàn)樽儞Q屬性的代碼更加簡(jiǎn)潔優(yōu)雅 一. 移動(dòng)端的準(zhǔn)備工作 * { padding: 0; margin: 0; } img { d...

    Hydrogen 評(píng)論0 收藏0
  • Vue 過(guò)渡實(shí)現(xiàn)播圖

    摘要:過(guò)渡實(shí)現(xiàn)輪播圖過(guò)渡的過(guò)渡系統(tǒng)是內(nèi)置的,在元素從中插入或移除時(shí)自動(dòng)應(yīng)用過(guò)渡效果。 Vue 過(guò)渡實(shí)現(xiàn)輪播圖 Vue 過(guò)渡 Vue 的過(guò)渡系統(tǒng)是內(nèi)置的,在元素從 DOM 中插入或移除時(shí)自動(dòng)應(yīng)用過(guò)渡效果。 過(guò)渡的實(shí)現(xiàn)要在目標(biāo)元素上使用 transition 屬性,具體實(shí)現(xiàn)參考Vue2 過(guò)渡 下面例子中我們用到列表過(guò)渡,可以先學(xué)習(xí)一下官方的例子 要同時(shí)渲染整個(gè)列表,比如使用 v-for,我們需要...

    zr_hebo 評(píng)論0 收藏0
  • [vue組件]無(wú)縫輪播圖

    摘要:實(shí)現(xiàn)原理無(wú)縫滾動(dòng)預(yù)處理為了無(wú)縫滾動(dòng),在傳進(jìn)來(lái)的數(shù)組首部增加末尾元素,在尾部追加首元素看圖數(shù)據(jù)綁定視圖為當(dāng)前顯示的輪播圖索引,然后只需要對(duì)進(jìn)行操作,監(jiān)聽(tīng)的變化,一旦到達(dá)了邊界就重置,顯示出對(duì)應(yīng)的圖片。 該文章請(qǐng)對(duì)應(yīng)源碼閱讀,github源碼地址,DEMO使用地址,線上DEOM展示。 做一個(gè)vue基礎(chǔ)組件系列,使用vue以最簡(jiǎn)潔的方式實(shí)現(xiàn)常用組件,可用于快速二次定制化開(kāi)發(fā)。 (??????...

    GHOST_349178 評(píng)論0 收藏0
  • [vue組件]無(wú)縫輪播圖

    摘要:實(shí)現(xiàn)原理無(wú)縫滾動(dòng)預(yù)處理為了無(wú)縫滾動(dòng),在傳進(jìn)來(lái)的數(shù)組首部增加末尾元素,在尾部追加首元素看圖數(shù)據(jù)綁定視圖為當(dāng)前顯示的輪播圖索引,然后只需要對(duì)進(jìn)行操作,監(jiān)聽(tīng)的變化,一旦到達(dá)了邊界就重置,顯示出對(duì)應(yīng)的圖片。 該文章請(qǐng)對(duì)應(yīng)源碼閱讀,github源碼地址,DEMO使用地址,線上DEOM展示。 做一個(gè)vue基礎(chǔ)組件系列,使用vue以最簡(jiǎn)潔的方式實(shí)現(xiàn)常用組件,可用于快速二次定制化開(kāi)發(fā)。 (??????...

    Clect 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

xuweijian

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<