3d Carousal
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>3D Carousel</title>
<script src="https://cdn.jsdelivr.net/npm/alpinejs@3.x.x/dist/cdn.min.js" defer></script>
<script>
function carousel3D({ items, distance }) {
return {
angle: 0,
interval: null,
isDragging: false,
startX: 0,
currentX: 0,
rotateStep: 360 / items,
startAutoRotate(rotate) {
if (rotate) {
this.interval = setInterval(() => {
this.angle += this.rotateStep;
}, 3000);
}
},
stopAutoRotate() {
clearInterval(this.interval);
},
startDrag(event) {
this.stopAutoRotate();
this.isDragging = true;
this.startX = event.type.includes('touch') ? event.touches[0].clientX : event.clientX;
},
onDrag(event) {
if (!this.isDragging) return;
this.currentX = event.type.includes('touch') ? event.touches[0].clientX : event.clientX;
const deltaX = this.currentX - this.startX;
this.angle += deltaX * 0.3;
this.startX = this.currentX;
},
endDrag(rotate) {
this.isDragging = false;
}
}
}
</script>
<script src="https://cdn.tailwindcss.com"></script>
<style>
html, body {
margin: 0;
padding: 0;
}
.transform-3d {
transform-style: preserve-3d;
}
</style>
</head>
<body class="flex items-center min-h-screen overflow-hidden">
<div
x-data="carousel3D({ items: 8, distance: 1900 })"
x-init="startAutoRotate(false)"
@mousedown="startDrag($event)" @mousemove="onDrag($event)"
@mouseup="endDrag(true)" @mouseleave="endDrag(true)"
@touchstart="startDrag($event)" @touchmove="onDrag($event)" @touchend="endDrag(true)"
class="w-full h-fit overflow-hidden relative flex items-center select-none cursor-pointer"
>
<div x-ref="slider" class="relative w-80 h-[520px]" style="left: calc(50% - 160px); perspective: 1000px;">
<div
class="w-full h-full relative transform-3d transition-transform duration-500 ease-out"
:style="'transform: rotateY(' + angle + 'deg)'"
>
<!-- Cards -->
<template x-for="(item, index) in 8" :key="index">
<div
class="absolute inset-0"
:style="'transform: rotateY(' + (index * 45) + 'deg) translateZ(1800px);'"
>
<div class="w-full h-full flex items-center justify-center rounded-lg shadow-xl overflow-hidden">
<img
:src="[
'https://images.pexels.com/photos/2088210/pexels-photo-2088210.jpeg',
'https://images.pexels.com/photos/2253573/pexels-photo-2253573.jpeg',
'https://images.pexels.com/photos/2253573/pexels-photo-2253573.jpeg',
'https://images.pexels.com/photos/1906794/pexels-photo-1906794.jpeg',
'https://images.pexels.com/photos/1906794/pexels-photo-1906794.jpeg',
'https://images.pexels.com/photos/32094012/pexels-photo-32094012/free-photo-of-tall-birch-tree-on-a-sunny-hillside.jpeg',
'https://images.pexels.com/photos/2240137/pexels-photo-2240137.jpeg',
'https://images.pexels.com/photos/62636/pexels-photo-62636.jpeg'
][index]"
alt="carousel image"
class="object-cover w-full h-full rounded-lg border-8 border-white"
/>
</div>
</div>
</template>
</div>
</div>
</div>
</body>
</html>