css轮播图_JavaScript实现简易轮播图

## 看了不会算我输

轮播图效果如下:

87796212e4ad1ea67789a56d8d4eb0d0.png

**轮播图实现方式:通过定位的方式,改变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代码都不需要动**

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

b7e6ba132eef22228e6ed4519cccba78.png

第三步:写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修改透明度,来修改其高亮*/
}

效果如图:

40f7e97a1084a19ca2fb39e65145f6e6.png

第四步;通过写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;

d63c6fdebacf23976406958086b39c79.png

具体代码:(因为是向左移动,所以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].onclick=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

697f52ed9575382b25faa8fae82f157a.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值