小米轮播图
实现功能:
- 定时切换(2s)
- 点击按钮停止切换
- 点击向左向右按钮进行相应切换
- 鼠标点击下方的小圆点,并进行相应的切换
效果:
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>小米轮播图</title>
<style>
*{margin:0;padding: 0;}
.box{width: 1200px;height: 470px;margin: 100px auto;position: relative;}
.box div{width: 100%;height: 100%;position: absolute;left: 0;top: 0;opacity: 0;transition: opacity 2s;}
.box div img{width: 1200px;height: 470px;}
.item{width: 250px;position: absolute;left: 50%;top:90%;transform:translateX(-50%);}
.item li{list-style: none;width: 12px;height: 12px;border-radius: 50%;border: 1px solid #fff;float: left;margin-left: 30px;display: block;cursor: pointer;}
.show{background: #ccc;}
.box span{width: 40px;height: 80px;position: absolute;top:50%;font-size: 20px;text-align: center;line-height: 80px;color: #ccc;background: #333;opacity: .2;cursor: pointer;transform: translateY(-50%)}
.left{left: 0;}
.right{right:0;}
</style>
</head>
<body>
<div class="box">
<div style="opacity: 1"><img src="./images/01.jpg" alt=""></div>
<div><img src="./images/02.jpg" alt=""></div>
<div><img src="./images/03.jpg" alt=""></div>
<div><img src="./images/04.jpg" alt=""></div>
<div><img src="./images/05.jpg" alt=""></div>
<ul class="item">
<li class="show"></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<span class="left"><</span>
<span class="right">></span>
</div>
</body>
<script>
class Banner{
constructor(){
this.box=document.querySelector(".box");
this.divs=document.querySelectorAll(".box div");
this.item=document.querySelector(".item");
this.lis =document.querySelectorAll("li");
this.left=document.querySelector(".left");
this.right=document.querySelector(".right");
this.time=null;
this.index=0;
// 自动切换
this.automatic();
// 添加事件
this.addEvent();
}
automatic(){
var that =this;
this.time=setInterval(function(){
that.index++;
if(that.index>that.divs.length-1){
that.index=0
}
for(var i=0;i<that.divs.length;i++){
that.divs[i].style.opacity=0;
that.lis[i].className="";
}
that.divs[that.index].style.opacity=1;
that.lis[that.index].className="show"
},2000)
}
addEvent(){
var that =this;
// 添加左按钮事件
this.left.onclick=function(){
that.leftclick();
}
// 添加右按钮事件
this.right.onclick=function(){
that.rightclick()
}
// 添加小圆点事件
this.item.onclick=function(){
that.itemclick()
}
}
leftclick(){
// console.log(1)
// 点击之后先清除计时器
clearInterval(this.time);
this.index--;
if(this.index <0){
this.index = this.divs.length-1;
}
this.clickmove();
}
rightclick(){
clearInterval(this.time);
this.index++;
if(this.index>this.divs.length-1){
this.index=0
}
this.clickmove();
}
clickmove(){
console.log(this.index)
for(var i=0;i<this.divs.length;i++){
this.divs[i].style.opacity=0;
this.lis[i].className="";
}
this.divs[this.index].style.opacity=1;
this.lis[this.index].className="show";
// 点击事件后再开启自动播放
this.automatic();
}
itemclick(){
// 给每个小圆点添加一个内置属性
for(var i =0;i<this.lis.length;i++){
this.lis[i].setAttribute("x",i);
}
var that =this;
// 事件委托
this.item.onclick=function(eve){
var e = eve || window.event;
var target = e.target || e.srcElement;
if(target.nodeName == "LI"){
console.log(target)
clearInterval(that.time);
for(var i=0;i<that.lis.length;i++){
that.divs[i].style.opacity=0;
that.lis[i].className="";
}
that.divs[target.getAttribute("x")].style.opacity=1;
that.lis[target.getAttribute("x")].className="show";
that.index=target.getAttribute("x");
that.automatic();
}
}
}
}
new Banner();
</script>
</html>
网易云轮播图
实现功能
- 定时切换(3s)
- 鼠标放上去停止切换
- 点击左右图片进行图片切换
- 鼠标放上去显示向左向右按钮,鼠标移下来再次隐藏
- 点击向左向右按钮进行相应切换
- 鼠标放到下方的线上,停止定时切换,并进行相应的切换
- 鼠标离开下方的线,重新开始定时切换
效果图:
代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>网页云轮播图</title>
<style>
* {
margin: 0;
padding: 0;
}
.carousel {
width: 1200px;
margin: 100px auto;
}
ul {
list-style-type: none;
position: relative;
display: flex;
min-height: 300px;
margin-bottom: 40px;
}
.prev,
.next {
cursor: pointer;
display: none;
position: absolute;
top: 44%;
z-index: 1;
}
.prev {
left: 0;
}
.next {
right: 0
}
ul li {
width: 700px;
height: 300px;
position: absolute;
left: 250px;
right: 250px;
transition: all .3s ease-out;
opacity: 0;
}
li img {
width: 100%;
height: 100%;
}
.now {
z-index: 1;
opacity: 1;
transform: scale3d(1.0, 1.2, 1.2)
}
.before {
transform: translateX(-250px);
opacity: .8;
}
.after {
transform: translateX(250px);
opacity: .8;
}
.lines {
display: flex;
justify-content: center;
}
.line {
width: 20px;
height: 4px;
background-color: black;
margin: 10px 10px;
}
.active-line{
background-color: red;
}
</style>
</head>
<body>
<div class="carousel">
<ul>
<span class="iconfont prev"><</span>
<span class="iconfont next">></span>
<li class="now"><img src="./images/1.jpg" alt=""></li>
<li class="after"><img src="./images/2.jpg" alt=""></li>
<li><img src="./images/3.jpg" alt=""></li>
<li><img src="./images/4.jpg" alt=""></li>
<li><img src="./images/5.jpg" alt=""></li>
<li class="before"><img src="./images/6.jpg" alt=""></li>
</ul>
<div class="lines">
<div class="active-line line"></div>
<div class="line"></div>
<div class="line"></div>
<div class="line"></div>
<div class="line"></div>
<div class="line"></div>
</div>
</div>
</body>
<script>
function nextPic () {
var picArr = document.querySelectorAll('ul li'),
len = picArr.length,
i = 0;
for (;i < len;i++) {
if (picArr[i].className == 'after') {
picArr[(i + 1) % len].className = 'after';
picArr[i].className = 'now';
if (i - 1 < 0) {
picArr[len - 1].className = 'before';
}else {
picArr[i - 1].className = 'before';
}
//把原来的before删除(原来的now、after都被覆盖掉了)
if (i == 0) {
picArr[len - 2].className = '';
}else if (i == 1) {
picArr[len - 1].className = '';
}else {
picArr[i - 2].className = '';
}
break;
}
}
}
function prevPic () {
var picArr = document.querySelectorAll('ul li'),
len = picArr.length,
i = 0;
for (;i < len;i++) {
if (picArr[i].className == 'before') {
if (i - 1 < 0) {
picArr[len - 1].className = 'before';
}else {
picArr[i - 1].className = 'before';
}
picArr[i].className = 'now';
picArr[(i + 1) % len].className = 'after';
//删除之前的after
picArr[(i + 2)% len].className = '';
break;
}
}
}
function nextLine () {
// 颜色变化
var lineArr = document.getElementsByClassName('line'),
len = lineArr.length;
for (var i = 0;i < len;i++) {
if (lineArr[i].className.indexOf('active-line') != '-1') {
lineArr[i].className = 'line';
lineArr[(i + 1) % len].className = 'active-line line';
break;
}
}
}
function preLine () {
// 颜色变化
var lineArr = document.getElementsByClassName('line'),
len = lineArr.length;
for (var i = 0;i < len;i++) {
if (lineArr[i].className.indexOf('active-line') != '-1') {
lineArr[i].className = 'line';
if (i - 1 < 0) {
lineArr[len - 1].className = 'active-line line';
}else {
lineArr[i - 1].className = 'active-line line';
}
break;
}
}
}
//上一张
function prev () {
prevPic();
preLine();
}
//下一张
function next () {
nextPic();
nextLine();
}
//初始时定时切换
var timer = setInterval(next, 3000);
//鼠标放到轮播图上,暂停切换,显示prev、next按钮
document.getElementsByClassName('carousel')[0].addEventListener('mousemove', function () {
clearInterval(timer);
document.getElementsByClassName('prev')[0].style.display = 'block';
document.getElementsByClassName('next')[0].style.display = 'block';
}, false)
//鼠标离开轮播图上,重新开始切换,隐藏prev、next按钮
document.getElementsByClassName('carousel')[0].addEventListener('mouseleave', function () {
timer = setInterval(next, 3000);
document.getElementsByClassName('prev')[0].style.display = 'none';
document.getElementsByClassName('next')[0].style.display = 'none';
}, false)
//上一张
document.querySelector('.prev').addEventListener('click', function () {
prev();
}, false)
//下一张
document.querySelector('.next').addEventListener('click', function () {
next();
}, false)
//图片点击事件(只有点击before、after有切换)
document.querySelector('ul').addEventListener('click', function(e) {
if (e.target.parentNode.className == 'before') {
prev();
}else if (e.target.parentNode.className == 'after') {
next();
}
}, false)
//移动到线上,切换图片
document.getElementsByClassName('lines')[0].addEventListener('mouseover', function (e) {
//只有冒泡到div的类是line的时候才进行判断,其他情况不判断
if (e.target.className == 'line' || e.target.className == 'active-line line') {
//暂停切换
clearInterval(timer);
var lineArr = this.querySelectorAll('.line'),
len = lineArr.length,
target,
temp,
acitve;
//找到active的位置和鼠标的位置
active = index(lineArr,this.querySelector('.active-line'));
target = index(lineArr,e.target);
//进行移动
temp = Math.abs(target - active);
if (active > target) {
while (temp) {
prev();
temp--;
}
}else {
while (temp) {
next();
temp--;
}
}
}
}, false)
//离开线,重新开始定时切换
document.getElementsByClassName('lines')[0].addEventListener('mouseout', function (e) {
if (e.target.className == 'line' || e.target.className == 'active-line line') {
timer = setInterval(next, 3000);
}
}, false)
//借鉴jquery的index(),找到子元素在父元素中的索引位置(就是给每个子元素添加一个自定义值index)
function index(father,target) {
var i,
len = father.length;
for (i = 0;i < len;i++) {
father[i].index = i;
}
for (i = 0;i < len;i++) {
if (father[i].index == target.index) {
return father[i].index;
}
}
}
</script>
</html>