Vue + AnimeJS實現(xiàn)3d輪播圖的詳細代碼
效果如下:

基礎布局
首先需要設置輪播容器中的子元素位于3D容器中,這是需要設置transform-style。transform-style有兩個值,flat:設置元素的子元素位于該元素的平面中、preserve-3d:設置元素的子元素位于3D空間中。
與之對應的還需要設置perspective,指與z=0平面的距離 實現(xiàn)3d效果的輪播圖主要需要動態(tài)修改transform中translateX,rotateY,scale以及每個圖片的層級、透明度。

由上圖可知,縮放比例、層級、透明度三個屬性中間值最大,然后兩邊的值逐級遞減。在X軸上的偏移值是以中間圖片為基準向左(逐級遞減)、向右偏移(逐級遞增)。Y軸上的旋轉以中間圖片為基準左邊順時針旋轉,右邊逆時針旋轉。
這里輪播圖為無限輪播效果,處理方式是在初始化的時候保存上述五個參數(shù),因為怎么循環(huán),固定位置對應的五個參數(shù)是相同的,在切換的時候就不需要重新計算。
因為使用的是vite,獲取靜態(tài)文件資源的時候需要使用new URL()方法來實現(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;
}
輪播
在項目初始化時保存了初始化參數(shù),點擊左側按鈕時,分別獲取保存的五個參數(shù)中的第一個,然后放到數(shù)組中的末尾,點擊右側按鈕時,分別獲取五個參數(shù)中的最后一個,放到數(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
}
為了更好的處理動畫,這里使用animejs處理,根據(jù)點擊之后的參數(shù),重新遍歷dom節(jié)點,修改每個dom的偏移值、旋轉角度、縮放比例、透明度,因為沒有在animejs中找到設置層級的屬性,所以這里使用原生設置層級。代碼如下:
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'
})
})
}
至此,一個能夠循環(huán)的3D輪播圖就完成了。代碼示例如下:
https://stackblitz.com/edit/vitejs-vite-1mgsdu?file=src%2Fassets%2Fimages%2F4.jpg
以上就是Vue + AnimeJS實現(xiàn)3d輪播圖的詳細代碼的詳細內容,更多關于Vue AnimeJS3d輪播圖的資料請關注腳本之家其它相關文章!
相關文章
詳解vue-router2.0動態(tài)路由獲取參數(shù)
本篇文章主要介紹了詳解vue-router2.0動態(tài)路由獲取參數(shù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-06-06
Vue.js 實現(xiàn)微信公眾號菜單編輯器功能(一)
最近vue.js 非常火熱,小編也趁機學習了下vuejs的一些基礎知識,于是嘗試做一個像微信平臺里的菜單編輯器功能,下面腳本之家小編把vue.js 微信公眾號菜單編輯器功能的實現(xiàn)代碼分享給大家,需要的朋友參考下2018-05-05
vue基于element-ui的三級CheckBox復選框功能的實現(xiàn)代碼
最近vue項目需要用到三級CheckBox復選框,需要實現(xiàn)全選反選不確定三種狀態(tài)。這篇文章主要介紹了vue基于element-ui的三級CheckBox復選框功能的實現(xiàn)方法,需要的朋友可以參考下2018-10-10
vue+elementUI-el-table實現(xiàn)動態(tài)顯示隱藏列方式
這篇文章主要介紹了vue+elementUI-el-table實現(xiàn)動態(tài)顯示隱藏列方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

