最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue + AnimeJS實(shí)現(xiàn)3d輪播圖的詳細(xì)代碼

 更新時(shí)間:2024年01月25日 10:51:35   作者:Kakarotto  
輪播圖在開(kāi)發(fā)中是經(jīng)常用到的,3D輪播圖是其中最常用的一種,所以在這篇文章中將給大家介紹Vue + AnimeJS實(shí)現(xiàn)3d輪播圖,文中有詳細(xì)的代碼示例供大家參考,具有一定的參考價(jià)值,需要的朋友可以參考下

效果如下:

基礎(chǔ)布局

首先需要設(shè)置輪播容器中的子元素位于3D容器中,這是需要設(shè)置transform-style。transform-style有兩個(gè)值,flat:設(shè)置元素的子元素位于該元素的平面中、preserve-3d:設(shè)置元素的子元素位于3D空間中。

與之對(duì)應(yīng)的還需要設(shè)置perspective,指與z=0平面的距離     實(shí)現(xiàn)3d效果的輪播圖主要需要?jiǎng)討B(tài)修改transform中translateX,rotateY,scale以及每個(gè)圖片的層級(jí)、透明度。

由上圖可知,縮放比例、層級(jí)、透明度三個(gè)屬性中間值最大,然后兩邊的值逐級(jí)遞減。在X軸上的偏移值是以中間圖片為基準(zhǔn)向左(逐級(jí)遞減)、向右偏移(逐級(jí)遞增)。Y軸上的旋轉(zhuǎn)以中間圖片為基準(zhǔn)左邊順時(shí)針旋轉(zhuǎn),右邊逆時(shí)針旋轉(zhuǎn)。

這里輪播圖為無(wú)限輪播效果,處理方式是在初始化的時(shí)候保存上述五個(gè)參數(shù),因?yàn)樵趺囱h(huán),固定位置對(duì)應(yīng)的五個(gè)參數(shù)是相同的,在切換的時(shí)候就不需要重新計(jì)算。

因?yàn)槭褂玫氖莢ite,獲取靜態(tài)文件資源的時(shí)候需要使用new URL()方法來(lái)實(shí)現(xiàn)資源的引用。初始化代碼如下:

<div style="display: flex; align-items: center; justify-content: center">
  <el-icon size="30" @click="clickArrow('left')"><ArrowLeft /></el-icon>
  <div class="carousel-wrapper" ref="carouselRef">
    <div
      v-for="(carousel, index) in carouselList"
      :key="carousel.id"
      :data-base-id="carousel.id"
      class="item"
      :style="computedStyle(index)"
    >
      <img :src="carousel.url" />
    </div>
  </div>
  <el-icon size="30" @click="clickArrow('right')"><ArrowRight /></el-icon>
</div>
const carouselList = ref([
  {
    id: 1,
    url: new URL('../../assets/images/1.jpg', import.meta.url).href
  },
  {
    id: 2,
    url: new URL('../../assets/images/2.jpg', import.meta.url).href
  },
  {
    id: 3,
    url: new URL('../../assets/images/3.jpg', import.meta.url).href
  },
  {
    id: 4,
    url: new URL('../../assets/images/4.jpg', import.meta.url).href
  },
  {
    id: 5,
    url: new URL('../../assets/images/5.jpg', import.meta.url).href
  }
])

const carouselRef = ref()
type CarouseInfo = {
  x: number[]
  y: number[]
  z: number[]
  opacity: number[]
}
const carouselInfo = reactive<CarouseInfo>({
  x: [],
  y: [],
  z: [],
  opacity: []
})

const baseParams = {
  x: 150,
  xOffset: -300,
  y: -25,
  yOffset: 50,
  opacity: 0.6,
  opacityOffset: 0.2
}

const computedStyle = (i: number) => {
  const { opacity, opacityOffset, xOffset, yOffset } = baseParams
  let z = 0
  let opacityNum = 0
  let x = i * baseParams.x + xOffset
  let y = i * baseParams.y + yOffset
  const centerIndex = (carouselList.value.length - 1) / 2

  if (i <= centerIndex) {
    z = i * 5
    opacityNum = i * opacityOffset + opacity
  } else {
    const baseIndex = i - centerIndex * (i - centerIndex)
    z = baseIndex * 5
    opacityNum = baseIndex * opacityOffset + opacity
  }
  carouselInfo.x.push(x)
  carouselInfo.y.push(y)
  carouselInfo.z.push(z)
  carouselInfo.opacity.push(opacityNum)
  return {
    transform: `translateX(${x}px) rotateY(${y}deg) scale(${opacityNum})`,
    zIndex: z,
    opacity: opacityNum
  }
}
.carousel-wrapper {
  width: 900px;
  height: 100vh;
  display: flex;
  justify-content: center;
  align-items: center;
  position: relative;
  transform-style: preserve-3d;
  overflow: hidden;
  perspective: 1000px;
}
.item {
  position: absolute;
  user-select: none;
}

輪播

在項(xiàng)目初始化時(shí)保存了初始化參數(shù),點(diǎn)擊左側(cè)按鈕時(shí),分別獲取保存的五個(gè)參數(shù)中的第一個(gè),然后放到數(shù)組中的末尾,點(diǎn)擊右側(cè)按鈕時(shí),分別獲取五個(gè)參數(shù)中的最后一個(gè),放到數(shù)組中的最前面,代碼如下:

const switchPosition = (val: number[], type = 'right') => {
  const target = type === 'right' ? val.shift() : val.pop()
  type === 'right' ? val.push(target!) : val.unshift(target!)
  return val
}

為了更好的處理動(dòng)畫(huà),這里使用animejs處理,根據(jù)點(diǎn)擊之后的參數(shù),重新遍歷dom節(jié)點(diǎn),修改每個(gè)dom的偏移值、旋轉(zhuǎn)角度、縮放比例、透明度,因?yàn)闆](méi)有在animejs中找到設(shè)置層級(jí)的屬性,所以這里使用原生設(shè)置層級(jí)。代碼如下:

const clickArrow = (arrowType: string) => {
  const x = switchPosition(carouselInfo.x, arrowType)

  const y = switchPosition(carouselInfo.y, arrowType)
  const z = switchPosition(carouselInfo.z, arrowType)
  const opacity = switchPosition(carouselInfo.opacity, arrowType)

  Array.from(carouselRef.value.children).forEach((item, index) => {
    ;(item as HTMLDivElement).style.zIndex = z[index].toString()
    anime({
      targets: item as HTMLDivElement,
      translateX: x[index],
      rotateY: y[index],
      scale: opacity[index],
      opacity: opacity[index],
      easing: 'linear'
    })
  })
}

 至此,一個(gè)能夠循環(huán)的3D輪播圖就完成了。代碼示例如下:

https://stackblitz.com/edit/vitejs-vite-1mgsdu?file=src%2Fassets%2Fimages%2F4.jpg

以上就是Vue + AnimeJS實(shí)現(xiàn)3d輪播圖的詳細(xì)代碼的詳細(xì)內(nèi)容,更多關(guān)于Vue AnimeJS3d輪播圖的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • vue中的dom節(jié)點(diǎn)和window對(duì)象

    vue中的dom節(jié)點(diǎn)和window對(duì)象

    這篇文章主要介紹了vue中的dom節(jié)點(diǎn)和window對(duì)象,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • 基于Vue+WebSocket實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)可視化的實(shí)戰(zhàn)指南

    基于Vue+WebSocket實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)可視化的實(shí)戰(zhàn)指南

    在現(xiàn)代交通大屏項(xiàng)目中,實(shí)時(shí)數(shù)據(jù)的采集和可視化尤為重要,本文結(jié)合 Vue3 和 ECharts,分享一個(gè)支持多 WebSocket 數(shù)據(jù)源實(shí)時(shí)合并、模擬數(shù)據(jù)調(diào)試、自動(dòng)重連的完整設(shè)計(jì)方案,幫助你快速搭建健壯的數(shù)據(jù)可視化組件,需要的朋友可以參考下
    2025-07-07
  • vue3封裝ECharts組件詳解

    vue3封裝ECharts組件詳解

    前端開(kāi)發(fā)需要經(jīng)常使用ECharts圖表渲染數(shù)據(jù)信息,在一個(gè)項(xiàng)目中我們經(jīng)常需要使用多個(gè)圖表,選擇封裝ECharts組件復(fù)用的方式可以減少代碼量,增加開(kāi)發(fā)效率。感興趣的可以閱讀一下本文
    2023-04-04
  • vue2結(jié)合element-ui實(shí)現(xiàn)TreeSelect樹(shù)選擇功能

    vue2結(jié)合element-ui實(shí)現(xiàn)TreeSelect樹(shù)選擇功能

    這篇文章主要為大家詳細(xì)介紹了vue2如何結(jié)合element-ui實(shí)現(xiàn)TreeSelect樹(shù)選擇功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下
    2024-03-03
  • vue如何批量引入組件、注冊(cè)和使用詳解

    vue如何批量引入組件、注冊(cè)和使用詳解

    這篇文章主要給大家介紹了關(guān)于vue如何批量引入組件、注冊(cè)和使用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-05-05
  • vuejs開(kāi)發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問(wèn)題處理

    vuejs開(kāi)發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問(wèn)題處理

    這篇文章主要介紹了vuejs開(kāi)發(fā)組件分享之H5圖片上傳、壓縮及拍照旋轉(zhuǎn)的問(wèn)題處理,需要的朋友可以參考下
    2017-03-03
  • vue 開(kāi)發(fā)一個(gè)按鈕組件的示例代碼

    vue 開(kāi)發(fā)一個(gè)按鈕組件的示例代碼

    本篇文章主要介紹了vue 開(kāi)發(fā)一個(gè)按鈕組件的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • 前端vue+elementUI如何實(shí)現(xiàn)記住密碼功能

    前端vue+elementUI如何實(shí)現(xiàn)記住密碼功能

    這篇文章主要給大家介紹了關(guān)于vue+elementUI如何實(shí)現(xiàn)記住密碼功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09
  • Vue3點(diǎn)擊側(cè)邊導(dǎo)航欄完成切換頁(yè)面內(nèi)組件全過(guò)程(WEB)

    Vue3點(diǎn)擊側(cè)邊導(dǎo)航欄完成切換頁(yè)面內(nèi)組件全過(guò)程(WEB)

    寫(xiě)頁(yè)面的時(shí)候都會(huì)用到一些導(dǎo)航欄、點(diǎn)擊不同的部分切換不同的頁(yè)面,下面這篇文章主要給大家介紹了關(guān)于Vue3點(diǎn)擊側(cè)邊導(dǎo)航欄完成切換頁(yè)面內(nèi)組件的相關(guān)資料,需要的朋友可以參考下
    2023-06-06
  • Vuecli3配置代理及遇到的問(wèn)題解決

    Vuecli3配置代理及遇到的問(wèn)題解決

    這篇文章主要為大家介紹了Vuecli3配置代理及遇到的問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08

最新評(píng)論

内丘县| 灯塔市| 龙泉市| 深泽县| 东安县| 壶关县| 冀州市| 灯塔市| 阜新市| 高台县| 澳门| 凯里市| 太保市| 太白县| 区。| 阳西县| 莫力| 云龙县| 特克斯县| 开鲁县| 兴义市| 大悟县| 南康市| 阳城县| 雅安市| 苏尼特右旗| 五河县| 香河县| 通化市| 开平市| 酒泉市| 呼和浩特市| 哈巴河县| 五台县| 辽中县| 河间市| 绩溪县| 句容市| 玉门市| 荔波县| 平远县|