JavaScript基于原型链封装可复用轮播图组件
作者:闭包旅人时间:2026-10-24 06:57:32浏览:601
本文介绍如何使用JavaScript原型链封装一个通用的轮播图组件。通过DOM元素调用该方法并传入图片路径数组,即可实现自动播放、左右切换及动画效果。代码包含完整的HTML结构与CSS样式,适合前端开发者学习组件化开发思路。
JavaScript原型封装轮播图实现
本文分享了一段利用JavaScript原型链封装的轮播图完整代码,供读者参考学习。
使用方式十分简便:只需获取对应的DOM元素,调用封装好的方法,并传入包含图片路径的数组作为参数即可。
核心代码与样式结构
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
padding: 0px;
margin: 0px;
list-style: none;
}
.leftBtn {
position: absolute;
width: 30px;
height: 30px;
color: black;
background-color: cyan;
top: 50%;
margin-top: -15px;
line-height: 30px;
text-align: center;
opacity: 0.6;
cursor: pointer;
left: 10px;
}
.rightBtn {
position: absolute;
width: 30px;
height: 30px;
color: black;
background-color: cyan;
top: 50%;
margin-top: -15px;
line-height: 30px;
text-align: center;
opacity: 0.6;
cursor: pointer;
right: 10px;
}
.slider {
position: absolute;
bottom: 20px;
width: 100%;
text-align: center;
cursor: pointer;
}
.slider span {
display: inline-block;
width: 8px;
height: 8px;
background-color: darkgray;
border-radius: 50%;
margin-left: 10px;
}
.slider .active {
background-color: #f40;
}
</style>
</head>
<body>
<div class="div"></div>
<div id="div"></div>
<script>
var div = document.getElementsByClassName('div')[0]
var oDiv = document.getElementById('div')
// var arr = ['./tp copy/decade.jpg', './tp copy/decad.jpg', './tp copy/tp.jpg']
HTMLDivElement.prototype.createTurnPage = function (arr) {
var arr = (typeof arr != "object") ? [arr] : arr; //确保参数总是数组
var ul = document.createElement('ul');
ul.className = 'ul'
this.style.width = '400px';
this.style.height = 200 + 'px';
this.style.position = 'relative';
this.style.overflow = 'hidden'
this.style.margin = '200px auto 0px';
this.appendChild(ul);
ul.style.width = (1 + arr.length) * parseInt(this.style.width) + 'px'
ul.style.height = this.style.height
ul.style.position = 'absolute'
for (let i = 0; i < arr.length + 1; i++) {
var li = document.createElement('li');
var img = document.createElement('img');
ul.appendChild(li);
li.appendChild(img);
li.style.width = this.style.width
li.style.height = this.style.height
li.style.float = 'left'
img.style.width = '100%'
img.style.height = '100%'
img.src = arr[i];
}
var LastImg = document.createElement('img');
var liList = document.getElementsByClassName('ul')[0].getElementsByTagName('li');
LastImg.src = arr[0];
LastImg.style.width = '100%'
LastImg.style.height = '100%'
liList[liList.length - 1].removeChild(img)
liList[liList.length - 1].appendChild(LastImg);
var leftBtn = document.createElement('div');
var rightBtn = document.createElement('div');
var slider = document.createElement('div');
for (let i = 0; i < arr.length; i++) {
var span = document.createElement('span')
slider.appendChild(span)
}
var arrSpan = slider.getElementsByTagName('span')
this.appendChild(leftBtn)
this.appendChild(rightBtn)
this.appendChild(slider)
slider.className = 'slider'
leftBtn.className = 'leftBtn';
leftBtn.innerHTML = '<'
rightBtn.className = 'rightBtn';
rightBtn.innerHTML = '>'
var timer = null;
var lock = true
var index = 0;
var moveWidth = document.getElementsByTagName('li')[0].offsetWidth;
var num = document.getElementsByTagName('li').length - 1;
leftBtn.onclick = function () {
autoMove('right->left')
}
rightBtn.onclick = function () {
autoMove('left->right')
}
for (var i = 0; i < arrSpan.length; i++) {
(function (myindex) {
arrSpan[myindex].onclick = function () {
lock = false;
clearTimeout(timer)
index = myindex
startMove(ul, { left: -index * moveWidth }, function () {
lock = true;
timer = setTimeout(autoMove, 2000)
spanMove(index)
})
}
}(i))
}
function autoMove(direction) {
if (lock) {
lock = false
clearTimeout(timer);
if (!direction || direction == 'left->right') {
index++;
startMove(ul, { left: ul.offsetLeft - moveWidth }, function () {
if (ul.offsetLeft == - num * moveWidth) {
ul.style.left = 0 + 'px'
index = 0
}
spanMove(index);
timer = setTimeout(autoMove, 2000)
lock = true
})
} else if (direction == 'right->left') {
if (ul.offsetLeft == 0) {
ul.style.left = - num * moveWidth + 'px'
index = num
}
index--;
startMove(ul, { left: ul.offsetLeft + moveWidth }, function () {
timer = setTimeout(autoMove, 2000)
lock = true
spanMove(index)
})
}
}
}
function spanMove(index) {
for (var i = 0; i < arrSpan.length; i++) {
arrSpan[i].className = ''
}
arrSpan[index].className = 'active'
}
timer = setTimeout(autoMove, 1500)
}
// div.createTurnPage(arr)
oDiv.createTurnPage(['./tp copy/decade.jpg', './tp copy/logo.jpg', './tp copy/decad.jpg', './tp copy/tp.jpg'])
function getStyle(dom, attr) {
if (window.getComputedStyle) {
return window.getComputedStyle(dom, null)[attr];
} else {
dom.currentScript[attr];
}
}
function startMove(dom, attrObj, callback) {
clearInterval(dom.timer);
var speed = null,
cur = null;
dom.timer = setInterval(function () {
var stop = true;
for (var attr in attrObj) {
if (attr == "opacity") {
cur = parseFloat(getStyle(dom, attr)) * 100;
} else {
cur = parseInt(getStyle(dom, attr));
}
speed = (attrObj[attr] - cur) / 7;
speed = speed < 0 ? Math.floor(speed) : Math.ceil(speed);
if (attr == "opacity") {
dom.style.opacity = (speed + cur) / 100;
} else {
dom.style[attr] = speed + cur + "px";
}
if (cur != attrObj[attr]) {
stop = false;
}
}
if (stop) {
clearInterval(dom.timer);
typeof callback == "function" && callback();
}
}, 20);
}
</script>
</body>
</html>
此外,本站还提供jQuery、JavaScript及Bootstrap等多种技术栈的图片轮播精彩专题供参考。
希望上述内容能对您的学习有所启发,欢迎继续支持本站获取更多技术资源。
作者最新文章
什么时候该用JS构造器:与工厂模式、字面量的选择对比
2026-11-05 16:18:22
推荐几款轻量级JS照片墙开源库及对比
2026-11-05 15:56:19
JavaScript递归写法有哪些常见陷阱及避免方法
2026-11-05 14:53:38
JS数组浅拷贝与深拷贝怎么选?场景与方法总结
2026-11-05 14:41:02
p5.js 中 setup() 和 draw() 函数的执行机制详解
2026-11-05 12:32:38
