js实现轮播图功能

news/2024/7/5 1:47:10

代码:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>路人女主无缝轮播图片</title>
</head>

<body>
    <div class="box" id="box">
        <ul>
            <li><img src="images/xia1.png"></li>
            <li><img src="images/xia2.png"></li>
            <li><img src="images/xia3.png"></li>
            <li><img src="images/xia4.png"></li>
            <li><img src="images/xia5.png"></li>
            <li><img src="images/xia6.png"></li>
            <li><img src="images/xia7.png"></li>
            <li><img src="images/xia8.png"></li>
        </ul>
        <ol>
        </ol>
    </div>
    <div class="content">
        <p>1.鼠标离开图片开始自动轮播,鼠标放在图片上停止自动轮播。</p>
        <p>2.通过小圆圈可以控制要显示的图片</p>
    </div>
</body>

</html>

<style type="text/css">
* {
    margin: 0;
    padding: 0;
}

.box {
    width: 1280px;
    height: 720px;
    margin: 50px auto;
    position: relative;
    overflow: hidden;
}

.box ul {
    width: 900%;
    position: absolute;
    top: 0;
    left: 0;
}

.box li {
    list-style: none;
    vertical-align: top;
    float: left;
}

.box ol {
    list-style: none;
    position: absolute;
    bottom: 10px;
    left: 50%;
    margin-left: 0;
}

.box ol li {
    width: 30px;
    height: 30px;
    border: 1px solid #ccc;
    border-radius: 50%;
    background-color: #fff;
    line-height: 30px;
    text-align: center;
    margin-left: 10px;
    cursor: pointer;
}

.box ol li.current {
    background-color: #ff0;
}
.content {
    width: 1280px;
    margin: 0 auto;
    text-align: center;
}
</style>
<script type="text/javascript">
window.onload = function() {
    var box = document.getElementById("box");
    var ul = box.children[0];
    var ol = box.children[1];
    var ulLis = ul.children;
    //1.封装 轮播函数
    function animate(obj, target) { // 第一个参数 要运动的盒子 第二个参数 要位移的距离
        clearInterval(obj.timer); //运行计时器 先停止计时器
        var speed = obj.offsetLeft > target ? -1280 : 1280; //计算 步长 与 位移方向
        obj.timer = setInterval(function() { // obj.timer 为全局变量
            if (obj.offsetLeft == target) {
                clearInterval(obj.timer);
            } else {
                obj.style.left = obj.offsetLeft + speed + "px";
            }
        }, 30)
    }
    //封装 轮播函数

    //2.复制第一张图做无缝轮播 克隆节点 lis[0].cloneNode(true);  true 深克隆
    ul.appendChild(ulLis[0].cloneNode(true)); // 向父节点追加子节点 复制完成
    //3.动态生成ol里的li
    for (i = 0; i < ulLis.length-1; i++) {   //利用for循环来添加li 因为之前克隆了一个节点 所以长度减一
        var li = document.createElement("li");  //创建节点 li
        li.innerHTML = i + 1;                  //创建节点li 的内容
        ol.appendChild(li);                    // ol 插入 li
    }
    ol.style.marginLeft = -ol.offsetWidth/2 + "px";  //ol动态居中
    //4.ol li的动画部分
    var olLis = ol.children;
    olLis[0].className = "current";       
    for (var i = 0; i < olLis.length; i++) {
        olLis[i].index = i;    // 赋予索引号
        olLis[i].onmouseover = function () {    
            for (var j = 0; j < olLis.length; j++) {  //清除所以li的class
                olLis[j].className = "";
            }
            this.className = "current";  //利用this 修改调用函数的li的类名
            animate(ul,-this.index*box.offsetWidth);//利用this.index调用索引号
            key = square = this.index; //鼠标经过ol li时 统一控制轮播的值
        }
    }
    //5.自动轮播部分 autoplay 图片和ol li一起自动轮播
    var timer = null; //全局定义计时器
    var key = 0; // 利用key值控制自动轮播 key=位移了几张图片
    var square = 0; //利用square控制ol li自动轮播 
    timer = setInterval(autoplay,2000); //定义autoplay函数 方便调用
    //5.1图片自动轮播部分
    function autoplay () {
        key++;                   //key=ulLis.length-1时,已经轮播到最后一张图即为第一张图此时square = 0
        if (key>=ulLis.length) { //key=ulLis.length时,
            key = 1;             //应该从第一张图轮播到第二张图所以 令 key = 1
            ul.style.left = 0;   //图片从最右拉到最左
        }
        animate(ul,-key*box.offsetWidth);
    //5.2ol li自动轮播部分
        square++;
        square = square >= olLis.length ? 0:square;
        for (var i = 0; i < olLis.length; i++) {
            olLis[i].className = ""
        }
        olLis[square].className = "current";
    }
    //6.鼠标经过box盒子时,停止自动轮班。鼠标离开时开启自动轮播
    box.onmouseover = function () {
        clearInterval(timer);    
    }
    box.onmouseout = function () {
        timer = setInterval(autoplay,2000); //调用autoplay函数
    }
}   
</script>

 

运行效果:


http://lihuaxi.xjx100.cn/news/244530.html

相关文章

Xamarin SimplerCursorAdapter 适配器(三)

SimplerCursorAdapter的使用步骤&#xff1a; 1、根据需要定义ListView每行所实现的布局。 2、实现数据表的查询操作&#xff0c;获取ICursor对象。 3、根据SimplerCursorAdapter对象。 4、将ListView绑定到SimplerCursorAdapter上…

Spark shuffle调优

Spark shuffle是什么Shuffle在Spark中即是把父RDD中的KV对按照Key重新分区&#xff0c;从而得到一个新的RDD。也就是说原本同属于父RDD同一个分区的数据需要进入到子RDD的不同的分区。现在的spark版本默认使用的是sortshuffle;shuffle在哪里产生shuffle在spark的算子中产生,也就…

在SpringBoot项目中使用redis简单用法(一)

基本准备 首先肯定是需要将Redis的包和Redis链接配置好 这里以maven作为项目构建工具&#xff0c;所以直接在POM文件中引入的Redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-r…

一个经典例子让你彻彻底底理解java回调机制

以前不理解什么叫回调&#xff0c;天天听人家说加一个回调方法啥的&#xff0c;心里想我草&#xff0c;什么叫回调方法啊&#xff1f;然后自己就在网上找啊找啊找&#xff0c;找了很多也不是很明白&#xff0c;现在知道了&#xff0c;所谓回调&#xff1a;就是A类中调用B类中的…

微信公众号开发(一)

1.登录开发公众平台 https://mp.weixin.qq.com/ 2.注册填好相关信息登录后 3.设置域名 首先介绍一款在线调试工具https://natapp.cn 注册登录后先购买vip隧道&#xff0c;然后购买二级域名 购买域名 然后下载客户端&#xff0c;使用教程参考https://natapp.cn/article/nata…

Add Digits

题干就是给一个非负整数&#xff0c;把各位数加起来&#xff0c;若超过一位&#xff0c;则继续把各位加起来&#xff0c;直到和是一位数。 example&#xff1a; 39->12->3 坦白说我是看了第三个提示意识到的&#xff0c;所以说要找规律&#xff0c;先要暴力列举。 int ad…

EXTJS之Ext.util.Observable自定义事件

暂时还不会用Ext.mixin.Observable&#xff0c; 催悲的测试了近两个小时。这TMD的语法差距也太大了啊。。 在新版EXTJS里&#xff0c;已去除了addEvents。 弄个出来&#xff0c;大概知道下吧。 ?123456789101112131415161718192021222324252627282930313233343536373839404142…

实例规格 ECS (共享计算型)和 (通用型-原独享)性能上有什么区别? ...

实例规格 ECS (共享计算型)和 (通用型-原独享)性能上有什么区别? 实例规格 共享计算型 和 通用型(原独享), 如果同样是2核4G 或者4核8G ; 性能上有什么差异/差距大吗? 内存型比通用性性能好些&#xff0c;而且CPU和内存配比&#xff1a; 通用型为1&#xff1a;2&…