轮播图效果如下:

javascript 轮播图 javascript轮播图制作_javascript


轮播图实现方式:通过定位的方式,改变left的值,形成轮播图的效果(也可以是从上到下翻滚的,改变top或(bottom))

需要准备的素材:

1、轮播图片任意

2、左右移动箭头

轮播图的制作方法:

第一步创建三个文件

.html文件, .css文件, .js文件
在创建一个img文件夹用来放图片
我这里的文件名字:轮播图.html 轮播图.css 轮播图.js(文件名最好是英文)

第二步:通过html把框架搭好:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <link rel="stylesheet" href="轮播图.css">
    <script src="./轮播图.js" defer></script>
    <style>
        .imgdiv ul li img{
            /* 图片大小 */
            width: 1024px;
            height:420px;
        }
    </style>
</head>
<body>
    <div class="imgdiv" style="width: 1024px; height: 420px;">
        <ul style="left: 0;">
            <li><img src="./img/1.jpg" alt=""></li>
            <li><img src="./img/2.jpg" alt=""></li>
            <li><img src="./img/3.jpg" alt=""></li>
            <li><img src="./img/4.jpg" alt=""></li>
        </ul>
        <span class="lf"><img src="./img/左箭头.png" alt=""></span>
        <span class="rf"><img src="./img/右箭头.png" alt=""></span>
    </div>
</body>
</html>

注意的点:1、script标签引外部js时,加上defer(加载完成html后,在加载js),避免获取不到元素的情况。

2、js获取外部css样式修改的时候,也就是没有在html文件里的样式,有可能js获取不到,所以上面代码中需要改变的left值,还有图片还有外部盒子的宽度,我都写在了html里,也方便了如果图片大小改变时,只需要修改html文档就好,css和js代码都不需要动

上面代码运行结果:我这里准备了四张图片(读者想用几张都可以)

javascript 轮播图 javascript轮播图制作_javascript 轮播图_02

第三步:写css样式

1,写css把图片横向布局,并且通过overflow:hidden的方式把外面的图片隐藏
2,给ul设置定位,并把left设置为0px;也就是向左偏移为0
(如果是上下轮播,图片纵向布局,top为0px)

代码示例:(动画效果显示;在父级上ul上加上:transition动画效果。)

*{
    margin: 0;
    padding: 0;
}
ul li{
    list-style: none;
}
.imgdiv{
    margin: 200px auto 0;
    overflow: hidden;
    position:relative;
}
.imgdiv ul{
    display:flex;
    transition: left 1s linear;/*动画效果*/
    position:absolute;
}
.imgdiv span{
    cursor:pointer;
}
.imgdiv span.lf{
    position: absolute;
    left: 10px;
}
.imgdiv span.rf{
    position: absolute;
    right: 10px;
}
.imgdiv>div{
    margin: 0 auto;
    position: absolute;
    left:0;
    bottom:20px;
    display: flex;
}
.newsdiv{
    width: 0;
    height: 0;
    border: 10px solid rgb(139, 138, 138);
    border-radius: 50%;
    margin:0 20px;
    cursor:pointer;
    opacity: 0.3;
}

上述代码中的下面这两段代码:是给下面放小圆点盒子与小圆点样式的。在js中根据图片个数动态创建小圆点

.imgdiv>div{
    margin: 0 auto;
    position: absolute;
    left:0;
    bottom:20px;
    display: flex;
}
.newsdiv{
    width: 0;
    height: 0;
    border: 10px solid rgb(139, 138, 138);
    border-radius: 50%;/*正方形变成圆形*/
    margin:0 20px;
    cursor:pointer;/*鼠标放上去变成小手*/
    opacity: 0.3;/*初始透明度,通过js修改透明度,来修改其高亮*/
}

效果如图:

javascript 轮播图 javascript轮播图制作_javascript_03

第四步;通过写js来改变图片的left值,使其动态显示。

js:
1、使左右两个图片居中,根据图片的高度,(图片高度-箭头高度)/2

// 设置左右按钮居中
    lfspan.style.top=(parseInt(pop.offsetHeight)-60)/2+'px';
    rfspan.style.top=(parseInt(pop.offsetHeight)-60)/2+'px';

2、根据图片个数,创建小圆点的个数

// 跟随图片的个数,动态设置圆点的个数
    newsbigdiv=document.createElement('div');
    newsbigdiv.className='newsbigdiv';
    pop.appendChild(newsbigdiv);
    // 循环创建子div,给每个子div一个class样式,加一个索引
    for(var i=0;i<lengthLi;i++){
        newsdiv=document.createElement('div');
        newsbigdiv.appendChild(newsdiv);
        newsdiv.className="newsdiv";
        newsdiv.setAttribute('index',i);//给每个子div设置一个索引值
    }
    // 获取圆点div个数,让其左偏移,居中显示
    var divsv = newsbigdiv.querySelectorAll('div');
    newsbigdiv.style.left=(content_width-divsv.length*60)/2+'px';
    // 默认第一个为高亮
    divsv[0].style.opacity=1;

3、改变left值使图片位置发生变换
做法:
num为0 的时候left为0(第一张图) num为1的时候left为负的图片宽度(第二张图) num为2的时候left为负的2倍图片宽度(第三张图)

// 设置全局累加器,判断动到哪一张图片**************
    var num=0;

javascript 轮播图 javascript轮播图制作_css_04

具体代码:(因为是向左移动,所以left为负值(负号别忘了加)根据num的值的变化,来改变图片的left值)

function change(){
        // 把所有圆点样式透明设置为0.3
        for(var j=0;j<lengthLi;j++){
            divsv[j].style.opacity=0.3;
        }
        // 给当前索引为num的图片改变圆点高亮显示
        divsv[num].style.opacity=1;
        indexUl.style.left=-num*content_width+'px';
    }

4、给两个箭头绑定点击事件

lfspan.onclick=function(){
        num--;
        if(num==-1){
            num=lengthLi-1;
        }
        change();
    }
    rfspan.onclick=function(){
        num++;
        if(num==lengthLi){
            num=0;
        }
        change();
    }

5、给下面的圆点绑定点击事件

for(var i=0;i<lengthLi;i++){
 divsv[i].οnclick=function(){
 num=this.getAttribute(‘index’);
 change();
 }
 }

6、设置计时器(第一个参数为,右点击函数,第二个参数为几秒执行一次)

timer=setInterval(rfspan.onclick,TIME);

7、鼠标移入移出事件(移入图片计时器停止轮播结束,移出图片计时器开始轮播继续)

// 当鼠标放在图片上时,清除定时器
    pop.onmouseover=function(){
        clearInterval(timer);
    }
    // 鼠标离开定时器时,开启定时器
    pop.onmouseout=function(){
        timer=setInterval(rfspan.onclick,TIME);
    }

js详细代码:

var indexUl = document.querySelector(".imgdiv>ul");
// li标签
var indexLi=indexUl.querySelectorAll("li");   
var lengthLi =indexLi.length;
// 最大的div
var pop = document.querySelector(".imgdiv");
var lfspan=pop.querySelector('.lf');
var rfspan=pop.querySelector('.rf');
// 设置左右按钮居中
lfspan.style.top=(parseInt(pop.offsetHeight)-60)/2+'px';
rfspan.style.top=(parseInt(pop.offsetHeight)-60)/2+'px';
// 初始化,获得显示框的宽度
var content_width=parseInt(pop.offsetWidth);

const TIME=2000;
var timer;

// 设置全局累加器,判断动到哪一张图片**************
var num=0;
// 跟随图片的个数,动态设置圆点的个数
newsbigdiv=document.createElement('div');
newsbigdiv.className='newsbigdiv';
pop.appendChild(newsbigdiv);
// 循环创建子div,给每个子div一个class样式,加一个索引
for(var i=0;i<lengthLi;i++){
    newsdiv=document.createElement('div');
    newsbigdiv.appendChild(newsdiv);
    newsdiv.className="newsdiv";
    newsdiv.setAttribute('index',i);//给每个子div设置一个索引值
}
// 获取圆点div个数,让其左偏移,居中显示
var divsv = newsbigdiv.querySelectorAll('div');
newsbigdiv.style.left=(content_width-divsv.length*60)/2+'px';
// 默认第一个为高亮
divsv[0].style.opacity=1;


function change(){
    // 把所有圆点样式透明设置为0.3
    for(var j=0;j<lengthLi;j++){
        divsv[j].style.opacity=0.3;
    }
    // 给当前索引为num的图片改变圆点高亮显示
    divsv[num].style.opacity=1;
    indexUl.style.left=-num*content_width+'px';
}

for(var i=0;i<lengthLi;i++){
    divsv[i].onclick=function(){
        num=this.getAttribute('index');
        change();
    }
}
lfspan.onclick=function(){
    num--;
    if(num==-1){
        num=lengthLi-1;
    }
    change();
}
rfspan.onclick=function(){
    num++;
    if(num==lengthLi){
        num=0;
    }
    change();
}

timer=setInterval(rfspan.onclick,TIME);

// 当鼠标放在图片上时,清除定时器
pop.onmouseover=function(){
    clearInterval(timer);
}
// 鼠标离开定时器时,开启定时器
pop.onmouseout=function(){
    timer=setInterval(rfspan.onclick,TIME);
}

。。。。。。。。。。。。轮播图完成。。。。。。。。。。。

待优化:不能从最后一张直接动画成第一张,第一张不能直接动画成最后一张

具体实现

比如四张图片轮播,在第一张图片的前面有第四张图片,在第四张图片的后面有第一张图片

用数字表示 4(1 2 3 4)1

javascript 轮播图 javascript轮播图制作_javascript 轮播图_05