1 作业要求
- 实现轮播图
- 有左右切换按钮(左右箭头)
- 有底层快捷按钮(小圆点)
- 图片渐隐渐显
2 作业完成步骤
- 完成html框架的搭建
- 完成css样式的搭建
- 完成脚本编写
- 动态生成快捷按钮
- 为快捷按钮添加点击监听器
- 为左右切换按钮添加点击监听器
- 为鼠标移入移出事件添加监听器
3 难点分析
- 页面框架搭建部分
- 图片的显示与隐藏是由累加的active类属性进行控制的,在css样式中,active应单独设立样式,display属性设置为block,用来显示;在img类属性中display属性设置为none,用来隐藏。
- 小圆点的添加是动态的,需要设定包裹快捷按钮的容器。
- 布局中需要使用绝对定位,并设置z-index属性,该属性值越大越在上层。
- 脚本编写部分
- 定时器的使用。定时器是每个一定时间就执行一次,但并不是在这个时间内不执行其他代码,因此涉及到定时器完成后才能执行的代码,应该放入定期中进行判断。
- 渐隐渐显效果,在快捷按钮和左右切换按钮上需要分别设置。因为自动切换时模拟的点击右边切换按钮,因此不需要再设置渐隐渐显。
4 关键代码
文档结构
<div class="main">
<div class="container">
<img src="banner/banner1.jpg" alt="" data-index="index1" class="img active">
<img src="banner/banner2.jpg" alt="" data-index="index2" class="img">
<img src="banner/banner3.jpg" alt="" data-index="index3" class="img">
<img src="banner/banner4.jpg" alt="" data-index="index4" class="img">
<span class="left btn"><</span>
<span class="right btn">></span>
<!--下面的div中动态添加轮播图小圆点-->
<div class="point-list"></div>
</div>
</div>
CSS样式
.img {width: 600px;height: 210px;display: none;box-sizing: border-box;opacity: 1;}
.point-list {position: absolute;bottom: 0;left: 0;right: 0;display: flex;flex-flow: row nowrap;justify-content: center;align-items: center;z-index: 2;}
.point {display: block;width: 10px;height: 10px;border-radius: 5px;background-color: #fff;margin: 0 5px;}
.active {display: block;background-color: black;}
JavaScript部分
生成小圆点并增加监听器
//获取所有class为img的标签元素
var imgs = document.querySelectorAll('.img');
//动态生成小圆点
imgs.forEach(function (item) {
//生成一个小圆点
var point = document.createElement('span');
//为生成的小圆点添加class属性point
point.classList.add('point');
//设置小圆点的自定义属性data-index的值为对应的img的自定义属性值
point.dataset['index'] = item.dataset['index'];
//获取文档中存放校园的,class为.point-list的用来存放小圆点的容器
var pointlist = document.querySelector('.point-list');
//将小圆点成为容器的子节点
pointlist.appendChild(point);
//查看当前img元素的class中是否有active的值,如果有,就赋给相应的小圆点
item.classList.forEach(function (v) {
if (v === 'active') {
point.classList.add('active');
}
})
});
//为每个小圆点添加监听器,监听click事件
var points = document.querySelectorAll('.point');
points.forEach(function (item) {
item.addEventListener('click', function (ev) {
//获取当前点击事件对应元素的自定义属性值
var index = ev.target.dataset['index'];
var currentimg = document.querySelector('.img.active');
//获得当前显示图片的计算opacity值
var opacity = parseInt(window.getComputedStyle(currentimg).opacity);
var timery = setInterval(function () {
opacity -= 0.05;
currentimg.style.opacity = opacity;
//当opacity的值小于0之后结束当前定时器,进入到下一个图片,并启动渐显定时器
if (opacity <= 0) {
//结束当前定时器
clearInterval(timery);
imgs.forEach(function (item) {
//清空img元素的active值
item.classList.remove('active');
if (index === item.dataset['index']) {
item.classList.add('active');
}
});
//使用函数来将小圆点的active属性与同index值的img进行绑定
setPointActive(index);
currentimg = document.querySelector('.img.active');
currentimg.style.opacity = 0;
//执行渐显函数
fadeIn(currentimg,50);
}
}, 30);
});
});
为按钮增加监听器(右侧与左侧类似,省略)
//找到左侧按钮
var leftbtn = document.querySelector('.left');
//为按钮增加监听器
leftbtn.addEventListener('click', function () {
//找到当前显示的图片
var currentimg = document.querySelector('.img.active');
//获得当前显示图片的计算opacity值,并将其转换为整数类型
var opacity = parseInt(window.getComputedStyle(currentimg).opacity);
//设置渐隐定时器
var timery = setInterval(function () {
opacity -= 0.05;
currentimg.style.opacity = opacity;
//当opacity的值小于0之后结束当前定时器,进入到下一个图片,并启动渐显定时器
if (opacity <= 0) {
//结束当前定时器
clearInterval(timery);
//移除当前显示图片的active属性,将其隐藏
currentimg.classList.remove('active');
//如果当前节点的前一个节点值不为空,且class中有img,就将前一个节点作为当前节点
if (currentimg.previousElementSibling !== null && currentimg.previousElementSibling.classList.contains('img')) {
currentimg = currentimg.previousElementSibling;
} else {
//如果当前节点的前一个节点值为空,或者class中没有img,就将imgs的最后一个节点作为当前节点
currentimg = imgs.item(imgs.length - 1);
}
//将兄弟节点设置为当前节点后,给当前节点的class属性中增加active值,让其显示
currentimg.classList.add('active');
//使用函数来将小圆点的active属性与同index值的img进行绑定
setPointActive(currentimg.dataset['index']);
//将当前节点的opacity的值归零,以便开始渐显
currentimg.style.opacity = 0;
//执行渐显函数
fadeIn(currentimg,20);
}
}, 20);
}, false);
为鼠标移入移出事件增加监听器
var container = document.querySelector('.container');
//定时器
var timer = null;
//当鼠标移开时,启动定时器
container.addEventListener('mouseout', function () {
var ev = new Event('click');
timer = setInterval(function () {
rightbtn.dispatchEvent(ev);
}, 5000);
}, false);
//当鼠标移入时,取消定时器
container.addEventListener('mouseover', function () {
clearInterval(timer);
}, false);
小圆点设置反色函数
function setPointActive(index) {
points.forEach(function (item) {
item.classList.remove('active');
if (index === item.dataset['index']) {
item.classList.add('active');
}
});
}
渐显函数
function fadeIn(currentimg,time) {
var opacity = parseInt(window.getComputedStyle(currentimg).opacity);
var timerx = setInterval(function () {
opacity += 0.05;
currentimg.style.opacity = opacity;
console.log(opacity + 'IN');
if (opacity >= 1) {
clearInterval(timerx);
}
}, time);
}