用vue写一个旋转可点击放大图片的立方体
时间: 2023-11-30 10:02:03 浏览: 147
好的,我可以给您提供一个简单的示例代码,您可以根据需要进行修改和扩展。
首先,我们需要创建一个Vue组件,我们可以称之为“CubeImage”。接下来,我们需要在组件中定义一些必要的数据和方法。
在数据方面,我们需要定义一个对象,用于存储每个面的图片路径、旋转角度和点击事件。
在方法方面,我们需要实现以下功能:
1. 点击一个面时,将该面旋转到正面,并放大显示该面图片。
2. 点击放大后的图片时,关闭放大窗口,并将该面旋转回原来的位置。
下面是示例代码:
```html
<template>
<div class="cube-image">
<div class="cube" :style="cubeStyle" @click="rotate">
<div class="face front" :style="faceStyle(0)" @click="openModal(0)"></div>
<div class="face back" :style="faceStyle(1)" @click="openModal(1)"></div>
<div class="face left" :style="faceStyle(2)" @click="openModal(2)"></div>
<div class="face right" :style="faceStyle(3)" @click="openModal(3)"></div>
<div class="face top" :style="faceStyle(4)" @click="openModal(4)"></div>
<div class="face bottom" :style="faceStyle(5)" @click="openModal(5)"></div>
</div>
<div class="modal" v-if="modal.show" @click="closeModal">
<img :src="modal.src" :style="modal.style">
</div>
</div>
</template>
<script>
export default {
data() {
return {
images: [
{ src: 'image1.jpg', rotate: 0, click: false },
{ src: 'image2.jpg', rotate: -90, click: false },
{ src: 'image3.jpg', rotate: 0, click: false },
{ src: 'image4.jpg', rotate: 90, click: false },
{ src: 'image5.jpg', rotate: -90, click: false },
{ src: 'image6.jpg', rotate: 90, click: false }
],
modal: {
show: false,
src: '',
style: {}
}
}
},
computed: {
cubeStyle() {
return {
transform: `rotateX(${this.images[0].rotate}deg) rotateY(${this.images[2].rotate}deg) rotateZ(${this.images[4].rotate}deg)`
}
}
},
methods: {
faceStyle(index) {
return {
backgroundImage: `url(${this.images[index].src})`,
transform: `rotateX(${this.images[index].rotate}deg) translateZ(100px)`
}
},
rotate() {
this.images.forEach((image, index) => {
if (image.click) {
image.rotate = (image.rotate + 90) % 360
image.click = false
}
})
},
openModal(index) {
this.modal.show = true
this.modal.src = this.images[index].src
this.modal.style = {
transform: `rotateX(${this.images[index].rotate}deg) rotateY(${this.images[(index + 2) % 6].rotate}deg) rotateZ(${this.images[(index + 4) % 6].rotate}deg) scale(2)`
}
this.images[index].click = true
},
closeModal() {
this.modal.show = false
this.images.forEach((image, index) => {
if (image.click) {
image.click = false
}
})
}
}
}
</script>
<style scoped>
.cube-image {
perspective: 1000px;
height: 400px;
}
.cube {
position: relative;
width: 200px;
height: 200px;
transform-style: preserve-3d;
transition: transform 1s ease;
}
.face {
position: absolute;
width: 200px;
height: 200px;
background-size: cover;
background-position: center;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
cursor: pointer;
}
.front {
transform: translateZ(100px);
}
.back {
transform: rotateY(180deg) translateZ(100px);
}
.left {
transform: rotateY(-90deg) translateZ(100px);
}
.right {
transform: rotateY(90deg) translateZ(100px);
}
.top {
transform: rotateX(90deg) translateZ(100px);
}
.bottom {
transform: rotateX(-90deg) translateZ(100px);
}
.modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
}
.modal img {
max-width: 90%;
max-height: 90%;
object-fit: contain;
cursor: pointer;
transition: transform 0.5s ease;
}
.modal img:hover {
transform: scale(1.5);
}
</style>
```
在这个示例中,我们使用了CSS 3D转换来构建一个立方体,并在每个面上显示不同的图片。我们还添加了一些交互效果,例如点击面时旋转立方体和放大图片。
请注意,这只是一个示例,您可以根据需要进行修改和扩展。例如,您可以添加更多的面,使用不同的动画效果,或者从外部传递图片路径和其他配置参数。
阅读全文