使用构造函数以及原型的方法实现图片轮播
时间: 2023-05-30 13:07:59 浏览: 229
图片轮播效果实现
以下是使用构造函数和原型的方法实现图片轮播的示例代码:
```html
<!DOCTYPE html>
<html>
<head>
<title>图片轮播</title>
<style>
.container {
width: 500px;
height: 300px;
position: relative;
overflow: hidden;
}
.container img {
width: 500px;
height: 300px;
position: absolute;
top: 0;
left: 0;
opacity: 0;
transition: opacity 1s;
}
.container img.active {
opacity: 1;
}
.controls {
position: absolute;
top: 50%;
transform: translateY(-50%);
z-index: 1;
}
.controls button {
display: inline-block;
width: 20px;
height: 20px;
border-radius: 50%;
background-color: #fff;
margin: 0 5px;
cursor: pointer;
border: none;
outline: none;
}
.controls button.active {
background-color: #000;
}
</style>
</head>
<body>
<div class="container"></div>
<div class="controls"></div>
<script>
function Slider(container, images) {
this.container = container;
this.images = images;
this.currentIndex = 0;
this.timer = null;
this.controls = null;
this.init();
}
Slider.prototype = {
constructor: Slider,
init: function() {
this.renderImages();
this.renderControls();
this.addListeners();
this.play();
},
renderImages: function() {
var html = '';
for (var i = 0; i < this.images.length; i++) {
html += '<img src="' + this.images[i] + '" alt="">';
}
this.container.innerHTML = html;
this.container.querySelector('img').classList.add('active');
},
renderControls: function() {
var html = '';
for (var i = 0; i < this.images.length; i++) {
html += '<button></button>';
}
this.controls = this.container.nextSibling;
this.controls.innerHTML = html;
this.controls.querySelector('button').classList.add('active');
},
addListeners: function() {
var self = this;
this.controls.addEventListener('click', function(event) {
if (event.target.tagName === 'BUTTON') {
self.stop();
self.goTo(parseInt(event.target.innerHTML) - 1);
self.play();
}
});
},
goTo: function(index) {
if (index === this.currentIndex) {
return;
}
var currentImage = this.container.querySelector('img.active');
var nextImage = this.container.querySelectorAll('img')[index];
var currentButton = this.controls.querySelector('button.active');
var nextButton = this.controls.querySelectorAll('button')[index];
currentImage.classList.remove('active');
nextImage.classList.add('active');
currentButton.classList.remove('active');
nextButton.classList.add('active');
this.currentIndex = index;
},
play: function() {
var self = this;
this.timer = setInterval(function() {
var nextIndex = (self.currentIndex + 1) % self.images.length;
self.goTo(nextIndex);
}, 2000);
},
stop: function() {
clearInterval(this.timer);
}
};
var container = document.querySelector('.container');
var images = ['https://via.placeholder.com/500x300/ff0000', 'https://via.placeholder.com/500x300/00ff00', 'https://via.placeholder.com/500x300/0000ff'];
new Slider(container, images);
</script>
</body>
</html>
```
这个示例代码创建了一个名为 `Slider` 的构造函数,接受两个参数:图片容器和图片数组。构造函数的原型对象定义了轮播的各种方法,包括初始化、渲染图片、渲染控制按钮、添加事件监听器、跳转到指定图片、播放和停止。在构造函数的 `init` 方法中,调用了其他的方法,按照顺序执行了初始化操作。在最后一行创建了一个 `Slider` 的实例,传入了图片容器和图片数组。
在 HTML 中,需要把图片容器和控制按钮容器分别创建出来,并放在合适的位置。图片容器需要设置 `position: relative` 和 `overflow: hidden`,使得图片能够在容器内部水平滚动。控制按钮容器需要设置 `position: absolute` 和 `top: 50%; transform: translateY(-50%)`,使得按钮能够在容器垂直居中。需要注意的是,控制按钮容器应该放在图片容器的后面,以便通过 `nextSibling` 属性获取到。
CSS 样式中定义了图片和控制按钮的样式,使得图片能够在容器内部水平滚动,且当前图片和当前控制按钮能够被高亮显示出来。
JavaScript 代码中创建了一个 `Slider` 的实例,并传入了图片容器和图片数组。在 `Slider` 的构造函数中,调用了 `init` 方法,按照顺序执行了初始化操作。在 `init` 方法中,调用了其他的方法,包括渲染图片、渲染控制按钮、添加事件监听器、播放轮播。其中,`renderImages` 和 `renderControls` 方法分别根据图片数组渲染出图片和控制按钮,并将它们添加到相应的容器中。`addListeners` 方法给控制按钮容器添加了一个 `click` 事件监听器,当用户点击控制按钮时,停止轮播、跳转到指定图片、并重新开始轮播。`goTo` 方法用来实现跳转到指定图片,它会根据当前索引和目标索引之间的差值,来决定是向左滚动还是向右滚动。`play` 和 `stop` 方法分别用来开始和停止轮播。在 `play` 方法中,使用 `setInterval` 方法实现定时器,每隔 2 秒钟将当前索引加 1 并跳转到下一张图片。在 `stop` 方法中,使用 `clearInterval` 方法来清除定时器,从而停止轮播。
阅读全文