实现旋转木马效果,可以分为如下几个步骤:
- 初始布局
在HTML中创建一个容器元素,然后在其中添加多个子元素,这些子元素将组成我们的木马效果。为了充分体现木马效果,这些子元素需要位置排列形成一个环。
- 样式与动画
为容器元素以及子元素定义样式,使其在页面中呈现出我们想要的样式和动画效果。通过CSS3中的转换、动画控制元素的旋转、移动、透明度等效果。在这里,我们需要使用CSS3中的transform
属性;
- 事件处理
为了控制木马的旋转、停止,需要为容器元素绑定事件。我们可以使用鼠标控制左右旋转,也可以使用自动轮播控制。在这里,我们需要使用原生JS完成事件的绑定与控制。
示例一:
HTML代码,一个容器元素包含多个子元素:
<div class="carousel">
<div class="item item1">1</div>
<div class="item item2">2</div>
<div class="item item3">3</div>
<div class="item item4">4</div>
<div class="item item5">5</div>
</div>
CSS代码,为容器元素和子元素定义样式:
.carousel {
width: 400px;
height: 400px;
margin: 0 auto;
perspective: 1000px; /* 定义3D视角 */
}
.item {
position: absolute;
width: 300px;
height: 250px;
background-color: #fff;
opacity: 0.8;
border-radius: 5px;
box-shadow: 0 0 10px #999;
text-align: center;
line-height: 250px;
font-size: 120px;
transform-style: preserve-3d; /* 子元素继承3D属性 */
transition: transform .6s ease; /* 定义过渡动画 */
}
.item:nth-child(1) {
transform: rotateY(0deg) translateZ(200px);
}
.item:nth-child(2) {
transform: rotateY(72deg) translateZ(200px);
}
.item:nth-child(3) {
transform: rotateY(144deg) translateZ(200px);
}
.item:nth-child(4) {
transform: rotateY(216deg) translateZ(200px);
}
.item:nth-child(5) {
transform: rotateY(288deg) translateZ(200px);
}
/* 定义鼠标悬停时的样式 */
.item:hover {
transform: scale(1.2);
opacity: 1;
box-shadow: 0 0 20px #999;
}
JS代码,为容器元素绑定事件:
var carousel = document.querySelector('.carousel');
var items = document.querySelectorAll('.item');
var angle = 0;
var interval;
// 左旋转
document.querySelector('.left').addEventListener('click', function() {
angle += 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
});
// 右旋转
document.querySelector('.right').addEventListener('click', function() {
angle -= 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
});
// 自动轮播
interval = setInterval(function() {
angle -= 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
}, 3000);
// 鼠标移入停止自动轮播,移除继续自动轮播
carousel.addEventListener('mouseover', function() {
clearInterval(interval);
});
carousel.addEventListener('mouseout', function() {
interval = setInterval(function() {
angle -= 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
}, 3000);
});
示例二:
HTML代码,一个容器元素包含多个子元素:
<div class="carousel">
<div class="item item1">
<img src="img1.jpg">
<h3>标题1</h3>
<p>内容1</p>
</div>
<div class="item item2">
<img src="img2.jpg">
<h3>标题2</h3>
<p>内容2</p>
</div>
<div class="item item3">
<img src="img3.jpg">
<h3>标题3</h3>
<p>内容3</p>
</div>
<div class="item item4">
<img src="img4.jpg">
<h3>标题4</h3>
<p>内容4</p>
</div>
<div class="item item5">
<img src="img5.jpg">
<h3>标题5</h3>
<p>内容5</p>
</div>
</div>
CSS代码,为容器元素和子元素定义样式:
.carousel {
width: 100%;
height: 550px;
margin: 0 auto;
position: relative;
overflow: hidden;
}
.item {
position: absolute;
width: 40%;
height: 400px;
left: 50%;
top: 10%;
margin-left: -20%;
background-color: #fff;
opacity: 0.8;
border-radius: 5px;
box-shadow: 0 0 10px #999;
text-align: center;
font-size: 22px;
color: #333;
transform-style: preserve-3d;
transition: transform .6s ease;
}
.item img {
width: 100%;
height: 300px;
display: block;
margin-bottom: 20px;
}
.item h3 {
margin: 10px 0;
font-size: 28px;
}
.item p {
margin: 10px 0;
font-size: 18px;
}
.item:nth-child(1) {
transform: rotateY(0deg) translateZ(400px);
}
.item:nth-child(2) {
transform: rotateY(72deg) translateZ(400px);
}
.item:nth-child(3) {
transform: rotateY(144deg) translateZ(400px);
}
.item:nth-child(4) {
transform: rotateY(216deg) translateZ(400px);
}
.item:nth-child(5) {
transform: rotateY(288deg) translateZ(400px);
}
.item:hover {
transform: scale(1.2);
opacity: 1;
box-shadow: 0 0 20px #999;
}
JS代码,为容器元素绑定事件:
var carousel = document.querySelector('.carousel');
var items = document.querySelectorAll('.item');
var angle = 0;
var interval;
document.querySelector('.left').addEventListener('click', function() {
angle += 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
});
document.querySelector('.right').addEventListener('click', function() {
angle -= 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
});
interval = setInterval(function() {
angle -= 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
}, 3000);
carousel.addEventListener('mouseover', function() {
clearInterval(interval);
});
carousel.addEventListener('mouseout', function() {
interval = setInterval(function() {
angle -= 72;
carousel.style.transform = 'rotateY(' + angle + 'deg)';
}, 3000);
});
以上是实现旋转木马效果的基本步骤和两个示例的代码。需要注意的是,为了实现3D效果,需要使用CSS3中的transform属性,同时计算元素的旋转角度(angle)和移动距离(translateZ),最终通过JS控制容器元素的transform属性来实现旋转和停止。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生js实现旋转木马效果 - Python技术站