js原生写一个小小轮播案例

先上示例:

在这里插入图片描述

附上代码

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

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link rel="stylesheet" href="css/index.css">
  <script src="js/index.js"></script>
  <title>轮播图</title>
</head>

<body>
  <div class="container">
    <!-- 左侧按钮 -->
    <a href="#" class="arrow-l">&lt;</a>
    <!-- 右侧按钮 -->
    <a href="#" class="arrow-r">&gt;</a>
    <ul class="foucs">
      <li><a href="#"><img src="images/2.jpg" alt=""></a></li>
      <li><a href="#"><img src="images/3.jpg" alt=""></a></li>
      <li><a href="#"><img src="images/4.jpg" alt=""></a></li>
      <li><a href="#"><img src="images/6.jpg" alt=""></a></li>
    </ul>
    <ol class="circle">
    </ol>
  </div>

</body>

</html>
  1. js
document.addEventListener("DOMContentLoaded", carousel);

function carousel() {
  var container = document.querySelector(".container"),
    ul = document.getElementsByTagName('ul')[0],
    ol = document.getElementsByTagName('ol')[0],
    la = document.querySelector(".arrow-l"),
    ra = document.querySelector(".arrow-r"),
    len = ul.children.length,
    num = 0,
    flag = true,
    foucsWidth = container.offsetWidth;

  // 1.左右按钮显示隐藏
  container.addEventListener("mouseenter", lrblock);
  la.addEventListener("mouseenter", laenter);
  ra.addEventListener("mouseenter", laenter);
  container.addEventListener("mouseleave", lrnone);
  la.addEventListener("mouseleave", laleave);
  ra.addEventListener("mouseleave", laleave);
  function lrblock() {
    la.style.display = "block";
    ra.style.display = "block";
    clearInterval(autoPlay)
  }
  function lrnone() {
    la.style.display = "none";
    ra.style.display = "none";
    autoPlay = setInterval(function () {
      // 手动调用点击事件
      ra.click();
    }, 2000)
  }
  function laenter() {
    this.style.color = "red";
  }
  function laleave() {
    this.style.color = "#fff";
  }
  // 2.动态生成小圆点
  for (var i = 0; i < len; i++) {
    var li = document.createElement('li');
    li.setAttribute('index', i);
    ol.appendChild(li);
    ol.children[0].className = 'current';
    li.addEventListener('click', function () {
      for (var i = 0; i < ol.children.length; i++) {
        ol.children[i].className = ''
      }
      this.className = 'current';
      //3. 点击小圆点,移动图片 ul移动
      var index = this.getAttribute('index');
      num = index;
      animate(ul, -index * foucsWidth);
    })
  };
  // 4. 点击右侧按钮控制图片
  ra.addEventListener('click', function () {
    if (flag) {
      flag = false;
      num++;
      if (num === len) {
        ul.style.left = 0;
        num = 0;
      }
      animate(ul, - num * foucsWidth, function () {
        flag = true
      });
      // 5. 小圆点和图片对应
      for (var i = 0; i < len; i++) {
        ol.children[i].className = '';
      }
      ol.children[num].className = 'current';
    }
  })
  // 5. 点击左侧按钮控制图片
  la.addEventListener('click', function () {
    if (flag) {
      flag = false;
      num--;
      if (num < 0) {
        ul.style.left = (len - 1) * foucsWidth;
        num = len - 1;
      }
      animate(ul, - num * foucsWidth, function () {
        flag = true
      });
      // 5. 小圆点和图片对应
      for (var i = 0; i < len; i++) {
        ol.children[i].className = '';
      }
      ol.children[num].className = 'current';
    }

  })
  //  6. 自动播放
  var autoPlay = setInterval(function () {
    // 手动调用点击事件
    ra.click();
  }, 2000)
  // 动画函数
  function animate(obj, target, callback) {
    var timer = setInterval(function () {
      var step = (target - obj.offsetLeft) / 10;
      step = step > 0 ? Math.ceil(step) : Math.floor(step)
      if (obj.offsetLeft === target) {
        clearInterval(timer);
        callback && callback()
      }
      obj.style.left = obj.offsetLeft + step + 'px';
    }, 10)
  }
}
  1. css
* {
  margin: 0;
  padding: 0;
  list-style: none;
}
a {
  text-decoration: none;
}
.container {
  width: 800px;
  height: 400px;
  position: relative;
  left: 50px;
  top: 50px;
  overflow: hidden;
  background-color: brown;
  color: #fff;
  font-size: 20px;
}
.arrow-l,
.arrow-r {
  width: 60px;
  height: 50px;
  display: none;
  border-radius: 25px;
  position: absolute;
  top: calc(50% - 50px);
  z-index: 2;
  background-color: rgb(125, 148, 168, 0.5);
  text-align: center;
  line-height: 50px;
  color: #fff;
  font-size: 30px;
  font-weight: bold;
}
.arrow-l {
  left: -20px;
}
.arrow-r {
  right: -20px;
}
ul.foucs {
  width: 10000px;
  height: 100%;
  position: absolute;
  left: 0;
  top: 0;
}
ul.foucs li {
  float: left;
}
ul.foucs li,
ul.foucs li img {
  width: 800px;
  height: 100%;
}
ol.circle {
  height: 30px;
  position: absolute;
  bottom: 0px;
  left: 40%;
  z-index: 2;
}
ol.circle li {
  width: 20px;
  height: 20px;
  border-radius: 10px;
  float: left;
  margin: 0 5px;
  background-color: #fff;
}
ol.circle li.current {
  background-color: blue;
}

  1. 主要文件结构
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/601866.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

陪诊系统|陪诊小程序成品|陪诊系统功能

随着人们对健康的日益关注以及医疗技术的不断进步&#xff0c;陪诊小程序应运而生&#xff0c;通过提供陪同就医、医疗服务和健康管理等功能为患者和家庭成员提供了更多的便利和选择。本文将分析陪诊小程序的关键功能&#xff0c;以便更好地理解其在医疗领域的作用。 在陪诊小程…

SpringBoot过滤器简单构建详细教程以及与拦截器区别解释

作用范围&#xff1a;过滤器基于Servlet规范&#xff0c;作用于更广泛的层面&#xff0c;不仅限于Spring MVC&#xff0c;它可以拦截进入Web应用的所有请求&#xff0c;包括静态资源请求。过滤器可以对请求和响应的内容进行预处理和后处理。实现方式&#xff1a;过滤器需要实现…

iPhone 数据恢复软件 – 恢复丢失的 iPhone 数据

恢复丢失的 iPhone 数据&#xff0c;奇客数据恢复iPhone版。如今的 iPhone 用户在他们的设备上存储了大量数据&#xff0c;从照片和与亲人的文本对话到商业和医疗信息。其中一些是保密的&#xff1b;其中大部分内容都是非常个人化的&#xff1b;而且大多数一旦丢失就无法替代。…

4G水电燃气表定时拍照云端识别抄表仪器

通信方式&#xff1a;4G全网通 通信频段&#xff1a;B1/B3/B5/B8/B34/B38/B39/B40/B41 传输速率&#xff1a;最大10Mbps(DL)/最大5Mbps(UL) 传输功率&#xff1a;≤23dBm2dB 图片尺寸&#xff1a;640*480 JPG 图片大小&#xff1a;10~20K 光源条件&#xff1a;自带补光&a…

很好的Baidu Comate,使我的编码效率飞起!

文章目录 背景及简单介绍Baidu Comate安装功能演示总结 &#x1f381;写在前面&#xff1a; 观众老爷们好呀&#xff0c;这里是前端小刘不怕牛牛频道&#xff0c;今天牛牛在论坛发现了一款便捷实用的智能编程助手&#xff0c;就是百度推出的Baidu Comate。下面是Baidu Comate评…

html--互动星空

<!doctype html> <html> <head> <meta charset"utf-8"> <title>互动星空</title><style> html,body {margin:0;overflow:hidden;width:100%;height:100%;cursor:none;background:black;background:linear-gradient(to bot…

CSS-背景属性

目录 背景属性 background-color (背景颜色 ) background-image (背景图片 ) background-repeat (背景图平铺方式 ) no-repeat 不平铺 repeat-x 水平方向平铺 repeat-y 垂直方向平铺 repeat 平铺 background-position (背景图位置) background-size (背景缩…

Apple 添加了 13 英寸 iPad Air

劈啪&#xff01;苹果推出的新款 iPad Air&#xff0c;将所有梦想变为现实&#xff01;它配备了强大的后置 12MP 摄像头和前置 12MP 摄像头&#xff0c;令您的拍摄体验更加出色。苹果还加入了 Apple Pencil 悬停功能&#xff0c;让您的创作更加灵活。 这款 iPad Air 不仅速度加…

antd vue pro (vue 2.x) 多页签详细操作

antd vue pro 多页签配置操作&#xff0c;具体操作如下。 1.引入 tagviews文件 在 store/modules 中创建 tagviews.js &#xff0c;复制一下代码到文件中保存 const state {visitedViews: [],cachedViews: [] }const mutations {ADD_VISITED_VIEW: (state, view) > {if …

相交链表(数据结构)

160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/intersection-of-two-linked-lists/description/ 题目 解决思路 1&#xff0c;找到相交的点 相交链表的关键也就是找到相交的点&#xff0c;所以我们需要首先判断有没有相交的节点&#…

多模态路径:利用其他模态的无关数据改进变压器(CVPR 2024)

<Multimodal Pathway: Improve Transformers with Irrelevant Data from Other Modalities> 论文地址&#xff1a;https://arxiv.org/abs/2401.14405 项目网页&#xff1a;https://ailab-cvc.github.io/M2PT/ 开源代码&#xff1a;https://github.com/AILab-CVC/M2PT 讲…

还有谁不想薅云渲染的羊毛?五种云渲染优惠知道就是省到

不管你是效果图设计师还是动画设计师&#xff0c;在面对紧急或大量的渲染任务时&#xff0c;总会有云渲染的需要。然而&#xff0c;现在的云渲染越来越贵&#xff0c;我们该如何尽可能地节约成本完成渲染任务呢&#xff1f;本文将为你介绍云渲染的五种优惠形式&#xff0c;看完…

spring bean生命周期全部过程

Spring Bean的生命周期包括以下全部过程&#xff1a; 实例化&#xff1a;在Spring容器启动时&#xff0c;根据配置文件或注解等信息创建Bean的实例。属性赋值&#xff1a;如果Bean有属性需要进行初始化&#xff0c;Spring容器会自动为这些属性进行赋值。自定义初始化方法&…

Vue.js【路由】

初识路由 提到路由&#xff08;Route&#xff09;&#xff0c;一般我们会联想到网络中常见的路由器&#xff08;Router&#xff09;&#xff0c;那么路由和路由器之间有什么关联呢&#xff1f;路由是指路由器从一个接口接收到数据&#xff0c;根据数据的目的地址将数据定向传送…

【Java笔记】多线程:一些有关中断的理解

文章目录 线程中断的作用线程的等待状态WAITINGTIMED_WAITING 线程从等待中恢复 java.lang.Thread中断实现相关方法中断标识interrupted 一些小练习Thread.interrupt() 只唤醒线程并修改中断标识sleep() 清除中断状态标识 Reference 线程中断的作用 线程中断可以使一个线程从等…

无处不在的AI:被科技巨头盯上的Agent智能体的崭新时代

&#x1f97d;一.Agent AI智能体 Agent AI 智能体是一种基于人工智能技术的智能代理&#xff0c;它可以自主地执行任务、与环境进行交互&#xff0c;并根据环境的变化做出决策。 OpenAI将AI Agent定义为以大语言模型&#xff08;LLM&#xff09;为大脑驱动具有自主理解、感知、…

关于电商API接口【满足高并发大批量请求】||电商API接口入门指南

简介&#xff1a; API&#xff08;应用程序编程接口&#xff09;是一种让不同软件之间进行通信的方式。在电子商务中&#xff0c;电商API接口可以用于获取商品信息、下单、支付等等。本篇文章将介绍电商API接口的入门知识&#xff0c;并提供示例代码以帮助你快速上手。 一、了解…

言出身随!人情世故:利益交换与人脉的重要性——早读(逆天打工人爬取热门微信文章解读)

巴黎输了&#xff0c;看了比赛还得加班 引言Python 代码第一篇 洞见 认知越高的人&#xff0c;越懂得感恩第二篇 冯站长之家 2024年5月8日&#xff08;周三&#xff09;三分钟新闻早餐结尾 智慧赋予我决策的明灯 勇气则是我行动的盾牌 在细雨中骑行 是我以智慧选择的道路 用勇气…

Foxmail邮箱API发送邮件失败的原因有哪些?

Foxmail邮箱API发送邮件的注意事项&#xff1f;如何用API发信&#xff1f; 在使用Foxmail邮箱API发送邮件时&#xff0c;有时会遇到发送失败的情况。这种情况可能由多种原因造成&#xff0c;下面AokSend就来详细探讨一下Foxmail邮箱API发送邮件失败的可能原因。 Foxmail邮箱A…

Ubuntu18.04 安装 anconda

anaconda官网 bash Anaconda3-2021.11-Linux-x86_64.sh一直回车&#xff0c;输入yes 选择安装目录 是否希望更新shell配置文件以自动初始化conda