html 轮播图效果

news2024/11/26 11:02:27

轮播效果:

1、鼠标没有移入到banner,自动轮播

在这里插入图片描述

2、鼠标移入:取消自动轮播、移除开始自动轮播

在这里插入图片描述

3、点击指示点开始轮播到对应位置

在这里插入图片描述

4、点击前一个后一个按钮,轮播到上一个下一个图片

在这里插入图片描述

注意

最后一个图片无缝滚动,就是先克隆第一个图片,把它放到最后面。
当轮播到最后视觉最后一个图片下一个图片理想应该是播放第一个,但是这样直接到第一个会很生硬,所以在最后克隆了第一个图片,这样就会平滑的从视觉效果过度到第一个,再次播放下一个图的时候则使用xx.style.left = 0属性快速切为第一个(无动画效果)

轮播图.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>
    <!-- 加载动画 -->
    <script src="js/animate.js"></script>
    <script src="js/banner.js"></script>
    <style>
        *{
            margin: 0;
        }
        .box{
            width: 100vw;
            height: 100vh;
            padding-top:20px ;
            background-color: aliceblue;
            box-sizing: border-box  ;
        }
        .box .ul-box{
            position: relative;
            margin: auto;
            width: 450px;
            height: 230px;
            overflow: hidden;
            /* background-color: #ff00aa; */
        }
        .ul-box #img-ul{
            position: absolute;
            width: 400%;
             /* 去除li样式 */
             list-style: none; /* 移除列表项前的符号 */
            padding-left: 0;
            margin: 0
        }
        .ul-box #img-ul li{
            background-color: rgb(202, 214, 225);
            /* opacity: 0.2; */
            width: 450px;
            height: 230px;
            float: left;
           
        }
        .ul-box #img-ul li img{
            width: 450px;
            height: 230px;
        }
        #dot-ul{
            position: absolute;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%);
            display: flex;
            background-color: rgb(232, 234, 234);
            opacity: 0.8;
            list-style: none; /* 移除列表项前的符号 */
            padding-left: 0;
            margin: 0;
            border-radius: 12px;
            
        }
        #dot-ul li{
            margin: 5px;
            height:10px;
            width: 10px;
            border: 1px solid #ffffff;
            border-radius: 50%;
        }
        .active{
            background-color: #ffffff;
        }
        .un-active{
            background-color: none;
        }
        /* 按钮 */
        #left-btn,#right-btn{
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
            background-color: aliceblue;
            opacity: 0.5;
            border-radius: 5px;
            color: rgb(66, 66, 56);
            padding: 2px;
        }
        #left-btn{
            left: 0;
        }
        #right-btn{
            right: 0;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="ul-box" id="ul-box">
            
            <ul id="img-ul">
                <li>
                    <img src="./imgs/1.png">
                </li>
                <li> <img src="./imgs/2.png"></li>
                <li> <img src="./imgs/3.png"></li>
            </ul>
            <ul id="dot-ul">
                <!-- <li class="active" > </li><li > </li><li > </li> -->
            </ul>
            <div id="left-btn"><</div>
            <div id="right-btn">></div>
        </div>
    </div>
</body>
</html>

js文件夹下banner.js

window.addEventListener('load', () => {
  let timeGap = 20
  let allTime = 500
  let picWidth = 450
  let playTimer = null //自动播放
  let palyTime = 2000 + allTime
  let currentIndex = 0 //当前播放
  // 包裹盒子
  let ulBox = document.getElementById('ul-box')
  // 获取ul
  let imgUlEl = document.getElementById('img-ul')
  // 获取img ul下的li个数
  let imgLiElList = imgUlEl.getElementsByTagName('li')
  // 指示点 ul
  let dotUlEl = document.getElementById('dot-ul')
  // 创建知识点 li
  for (let i = 0; i < imgLiElList.length; i++) {
    // 创建元素
    let liEl = document.createElement('li')
    liEl.id = 'dotli-' + i
    dotUlEl.appendChild(liEl)
  }
  // 克隆第一个图片
  if (imgLiElList.length) {
    let firstPicEl = imgLiElList[0]
    let cloneEl = firstPicEl.cloneNode(true)
    imgUlEl.appendChild(cloneEl)
  }
  // 获取指示点 li列表
  let dotLiEllist = dotUlEl.getElementsByTagName('li')
  //修改dot状态
  function changeDot() {
    for (let j = 0; j < dotLiEllist.length; j++) {
      let itemEl = dotLiEllist[j]
      itemEl.className = 'un-active'
    }
    if (currentIndex >= dotLiEllist.length) {
      // 如果是最后一个克隆的照片则默认指示点是第一个
      dotLiEllist[0].className = 'active'
    } else {
      dotLiEllist[currentIndex].className = 'active'
    }
  }
  //   第一个设置原点激活样式
  currentIndex = 0
  changeDot()
  //   指示点添加点击事件
  for (let i = 0; i < dotLiEllist.length; i++) {
    let elI = dotLiEllist[i]
    elI.addEventListener('click', () => {
      // 修改当前状态
      currentIndex = i
      //修改dot状态
      changeDot()
      // 计算需要移动的距离
      let distance = -picWidth * i
      console.log(distance)
      animate(imgUlEl, distance, timeGap, allTime)
    })
  }
  //   鼠标移动去除自动播放
  ulBox.addEventListener('mouseover', () => {
    console.log('mouseover')
    if (playTimer) {
      clearTimeout(playTimer)
    }
  })
  //   鼠标移除自动播放
  ulBox.addEventListener('mouseleave', () => {
    console.log('mouseleave')
    autoPlay()
  })

  // 自动播放图片
  function autoPlay() {
    playTimer = setTimeout(() => {
      if (currentIndex == dotLiEllist.length) {
        currentIndex = 0
        imgUlEl.style.left = 0
      }
      currentIndex++
      //判断是否是最后一个图片
      animate(imgUlEl, -picWidth * currentIndex, timeGap, allTime, () => {
        //修改dot状态
        changeDot()
        if (playTimer) {
          clearTimeout(playTimer)
        }
        autoPlay()
      })
    }, palyTime)
  }
  //调用自动播放
  autoPlay()
  // 按钮添加点击事件
  let btnLeft = document.getElementById('left-btn')
  let btnRight = document.getElementById('right-btn')
  btnLeft.style.cursor = 'grab'
  btnRight.style.cursor = 'grab'
  btnLeft.addEventListener('click', () => {
    if (currentIndex > 0) {
      currentIndex--
      animate(imgUlEl, -picWidth * currentIndex, timeGap, allTime)
      changeDot()
    }
  })
  btnRight.addEventListener('click', () => {
    // 滑动到最后一个克隆的照片
    if (currentIndex == dotLiEllist.length) {
      currentIndex = 1
      imgUlEl.style.left = 0
    } else {
      currentIndex++
    }
    animate(imgUlEl, -picWidth * currentIndex, timeGap, allTime)
    changeDot()
  })
})

js文件夹下animate.js

// 给元素添加动画效果
// targetPosition 目标位置
// timeGap 每次移动时间间隔
// allTime 花费多久移动完
// callBack 回调函数
function animate(el, targetPosition, timeGap = 100, allTime = 1000, callBack) {
  let offsetX = el.offsetLeft
  //需要移动位置
  let distance = targetPosition - offsetX
  //   每隔一段时间移动一段距离
  let moveCount = allTime / timeGap // 总共移动多少次
  let moveDistance = distance / moveCount //每次移动多少距离
  let timer = setInterval(() => {
    // console.log(moveCount, moveDistance)
    offsetX = el.offsetLeft //相对父元素的距离
    el.style.left = offsetX + moveDistance + 'px'
    moveCount-- //移动次数减少
    distance = distance - moveDistance //总共需要移动的距离
    if (moveCount <= 0) {
      //防止没有计算完
      el.style.left = targetPosition + 'px'
      // 执行回调
      callBack ? callBack() : ''
      clearInterval(timer)
    }
  }, timeGap)
}

图片资源

放到imgs文件夹下即可,对应命名为1.png、2.png、3.png即可

纯属参考,可能会存在很多bug

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

动态量化:大模型在端侧CPU快速推理方案

作为一款高性能的推理引擎框架&#xff0c;MNN高度关注Transformer模型在移动端的部署并持续探索优化大模型在端侧的推理方案。本文介绍权重量化的模型在MNN CPU后端的推理方案&#xff1a;动态量化。动态量化指在运行时对浮点型feature map数据进行8bit量化&#xff0c;然后与…

(gersemi) CMake 格式化工具

文章目录 &#x1f9ee;介绍&#x1f9ee;安装&#x1f9ee;使用&#x1f5f3;️模式 modes&#x1f5f3;️样式配置 config ⭐END&#x1f31f;help&#x1f31f;交流方式 &#x1f9ee;介绍 BlankSpruce/gersemi: A formatter to make your CMake code the real treasure A f…

Leetcode 最长公共前缀

java solution class Solution {public String longestCommonPrefix(String[] strs) {if(strs null || strs.length 0) {return "";}//用第一个字符串作为模板,利用indexOf()方法匹配,由右至左逐渐缩短第一个字符串的长度String prefix strs[0];for(int i 1; i …

【Java】反射概述与详解

目录 引言 一、概述 二、获取Class对象 三、反射获取构造方法 代码示例&#xff1a; 四、反射获取成员变量 代码示例&#xff1a; 五、反射获取成员方法 代码示例&#xff1a; 结语 引言 Java中的反射&#xff08;Reflection&#xff09;是一种强大的机制&#…

热门的四款PDF合并工具大比拼!!!

在现代的数字化办公环境中&#xff0c;PDF文件已经成为了一种重要的文件格式&#xff0c;用于保存和共享各种类型的文档。然而&#xff0c;有时候我们需要将多个PDF文件合并成一个文件&#xff0c;这时候就离不开好用的PDF合并工具了。选择一个好的PDF合并工具是一个长期的投资…

Python基于OpenCV的实时疲劳检测

2.检测方法 1&#xff09;方法 与用于计算眨眼的传统图像处理方法不同&#xff0c;该方法通常涉及以下几种组合&#xff1a; 1、眼睛定位。 2、阈值找到眼睛的白色。 3、确定眼睛的“白色”区域是否消失了一段时间&#xff08;表示眨眼&#xff09;。 相反&#xff0c;眼睛长…

【Power Query】List.Select 筛选列表

List.Select 筛选列表 ——在列表中返回满足条件的元素 List.Select(列表,判断条件) 不是列表的可以转成列表再筛选&#xff0c;例如 Record.ToList 不同场景的判断条件参考写法 (1)单条件筛选 列表中小于50的数字 List.Select({1,99,8,98,5},each _<50) (2)多条件筛…

红黑树(Java数据结构)

前言&#xff1a; 红黑树的学习需要大家对二叉搜索树与AVL树有深刻的理解&#xff0c;如果话没有看过我对二叉搜索树与AVL树的讲解的铁子们可以先看看上一篇文章&#xff1a;二叉搜索树与AVL树(java数据结构)-CSDN博客 红黑树&#xff1a; 什么是红黑树&#xff1f; 红黑树&a…

CenterTrack算法详解

背景&#xff1a; 早期追踪器在缺乏强的低水平线索下&#xff0c;容易失败检测后跟踪的模型依赖于检测器&#xff0c;且需要一个单独的阶段匹配关联策略的时间长 简介&#xff1a; 基于点的跟踪思想&#xff0c;通过预测目标的中心点来进行跟踪&#xff0c;同时实现检测与跟…

LLM在Reranker任务上的最佳实践?A simple experiment report(with code)

知乎&#xff1a;车中草同学(已授权)链接&#xff1a;https://zhuanlan.zhihu.com/p/987727357 引言 在BERT时代&#xff0c;对于Reranker任务&#xff0c;我们使用encoder-only的BERT为基座&#xff0c;拼接query和doc输入到BERT中去&#xff0c;在使用CLS的向量通过一个MLP&a…

身份证识别JAVA+OPENCV+OCR

一、相关的地址 https://github.com/tesseract-ocr/tessdata Releases - OpenCV opencv要装好&#xff0c;我装的是4.5.3的&#xff0c;最新版的没试过。 tessdata就下载了需要用的。好像还有best和fast的版本&#xff0c;我试了一下报错&#xff0c;不知道是不是版本不支持…

华为配置 之 远程管理配置

目录 简介&#xff1a; 知识点&#xff1a; Telnet远程管理 &#xff08;1&#xff09;配置接口IP并确保R1和R2处于同一个网段 &#xff08;2&#xff09;使用password认证模式远程登录 &#xff08;3&#xff09;使用AAA认证模式远程登录 SSH远程管理 &#xff08;1&a…

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;idea 源码获取&#xf…

【deathStarBench】2.安装k8s集群

安装docker 通过以下命令安装docker&#xff1a; sudo yum install docker-ce-26.1.4 docker-ce-cli-26.1.4 containerd.io随后通过查看docker --version&#xff0c;可以确定是否安装的版本一样 启动docker systemctl start docker && systemctl enable docker.se…

《纳瓦尔宝典:财富和幸福指南》读书随笔

最近在罗胖的得到听书中听到一本书&#xff0c;感觉很有启发&#xff0c;书的名字叫《纳瓦尔宝典》&#xff0c;从书名上看给人的感觉应该财富知识类、鸡汤爆棚哪类。纳瓦尔&#xff0c;这个名字之前确实没有听说过&#xff0c;用一句话介绍一下&#xff0c;一个印度裔的硅谷中…

【LeetCode】修炼之路-0006-Zigzag Conversion (Z 字形变换)【python】

题目 The string “PAYPALISHIRING” is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line: “PAHNAPLSIIGYIR” …

荣耀电脑管家-系统重装之查询设备序列号

winr输入cmd&#xff0c;再命令行中输入 wmic bios get serialnumber 如下所示

代码随想录算法训练营第六天|454四数相加II、 383赎金信、15三数之和、18四数之和

day06 1. 454四数相加II 首先定义 一个unordered_map&#xff0c;key放a和b两数之和&#xff0c;value 放a和b两数之和出现的次数。遍历大A和大B数组&#xff0c;统计两个数组元素之和&#xff0c;和出现的次数&#xff0c;放到map中。定义int变量count&#xff0c;用来统计 …

YAML格式校验API:免费工具的使用指南

YAML&#xff08;YAML Ain’t Markup Language&#xff09;是一种人类可读的数据序列化格式&#xff0c;广泛用于配置文件、数据交换等场景。由于其简洁的语法和良好的可读性&#xff0c;YAML 在开发和运维领域中越来越受到欢迎。然而&#xff0c;在使用 YAML 时&#xff0c;格…

Xcode文件默认存储位置-使用c++file保存文件默认路径以及设置为路径为当前项目路径

Xcode文件默认存储位置-使用cfile保存文件默认路径以及设置为路径为当前项目路径 1.概述 使用Xcode工具开发时候&#xff0c;遇到C调用file创建文件后&#xff0c;在当前项目中找不到文件路径。这是由于xcode会将文件保存到默认设置的路径。下面是查看文件默认存储路径和修改…