JS——【案例】图片轮播图(自动轮播/手动点击/悬停显示)[技术栈:html、css、JavaScript]

news2025/1/12 18:52:13

1、效果:

在这里插入图片描述

2、需求:

在这里插入图片描述

3、代码实现:

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>图片轮播图(自动/手动)</title>
  <style>
    * {
      margin: 0;
      padding: 0;
      box-sizing: border-box;
    }

    li {
      list-style: none;
    }

    .main {
      width: 700px;
      margin: auto;
      background: #000;
    }

    .slides {
      height: 320px;
      position: relative;
    }

    .slides ul li {
      /* display: none; */
      position: absolute;
      top: 0;
      left: 0;
      opacity: 0;
      /* 这里实现淡入淡出的关键 */
      transition: all .3s;
    }


    .slides li.active {
      /* display: block; */
      opacity: 1;
    }

    .slides .extra {
      width: 700px;
      height: 53px;
      line-height: 53px;
      position: absolute;
      bottom: 0px;
      background-color: rgba(0, 0, 0, 0.8);
      z-index: 10;
    }

    .slides .extra h3 {
      width: 82%;
      margin: 0;
      margin-right: 20px;
      padding-left: 20px;
      color: #98E404;
      font-size: 28px;
      float: left;
      font-weight: 500;
      font-family: "Microsoft Yahei", Tahoma, Geneva;
    }

    .slides .extra a {
      width: 30px;
      height: 29px;
      display: block;
      float: left;
      margin-top: 12px;
      margin-right: 3px;
      background-image: url(./assets/icon_focus_switch.png);
    }

    .slides .extra .prev {
      background-position: 0 0;
    }

    .slides .extra .prev:hover {
      background-position: -30px 0;
    }

    .slides .extra .next {
      background-position: -60px 0;
    }

    .slides .extra .next:hover {
      background-position: -90px 0;
    }

    .indicator {
      padding: 10px 0;
    }

    .indicator ul {
      list-style-type: none;
      margin: 0 0 0 4px;
      padding: 0;
      overflow: hidden;
    }

    .indicator ul li {
      position: relative;
      float: left;
      width: 60px;
      margin: 0 4px 0 5px;
      text-align: center;

      cursor: pointer;
    }

    .indicator li img {
      display: block;
      border: 0;
      text-align: center;
      width: 60px;
    }

    .indicator li .mask {
      width: 60px;
      height: 60px;
      position: absolute;
      top: 0;
      left: 0;
      background-color: rgba(0, 0, 0, 0.4);
    }

    .indicator li .border {
      display: none;
      width: 54px;
      position: absolute;
      bottom: 0;
      left: 0;
      z-index: 20;
      border: 3px solid #98E404;
    }

    /* li里面的mask 和 border 刚开始都是显示的 */
    /* 我们写一个样式css */
    .indicator .active .mask {
      display: none;
    }

    .indicator .active .border {
      display: block;
    }
  </style>
</head>

<body>
  <div class="main">
    <div class="slides">
      <ul>
        <li class="active"><a href="#"><img src="./assets/b_01.jpg" alt="第1张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_02.jpg" alt="第2张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_03.jpg" alt="第3张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_04.jpg" alt="第4张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_05.jpg" alt="第5张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_06.jpg" alt="第6张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_07.jpg" alt="第7张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_08.jpg" alt="第8张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_09.jpg" alt="第9张图的描述信息"></a></li>
        <li><a href="#"><img src="./assets/b_10.jpg" alt="第9张图的描述信息"></a></li>
      </ul>

      <div class="extra">
        <h3>第1张图的描述信息</h3>
        <a class="prev" href="javascript:;"></a>
        <a class="next" href="javascript:;"></a>
      </div>
    </div>
    <div class="indicator">
      <ul>
        <li class="active">
          <img src="assets/s_01.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_02.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_03.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_04.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_05.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_06.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_07.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_08.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_09.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
        <li>
          <img src="assets/s_10.jpg">
          <span class="mask"></span>
          <span class="border"></span>
        </li>
      </ul>
    </div>
  </div>

</body>
<script>

  let lis = document.querySelectorAll('.indicator li') //获取元素(小图片小li)
  let piclis = document.querySelectorAll('.slides ul li') //大图片中小li
  let text = document.querySelector('.extra h3') //获取当前图片描述信息元素
  let next = document.querySelector('.next') //获取点击按钮所在位置元素
  let prev = document.querySelector('.prev') //获取点击按钮所在位置元素
  let main= document.querySelector('.main') //获取大盒子元素
  //需求1:
  //鼠标经过图片,当前图片高亮,其余图片变暗;——>移除、添加类
  for (let i = 0; i < lis.length; i++) {  
    lis[i].addEventListener('mouseenter',function(){ //给元素绑定事件
      document.querySelector('.indicator .active').classList.remove('active') //选出高亮的图片移除类
      this.classList.add('active')  //再为当前图片添加类

  //需求2:
  //大图片跟随小图片变化(若想要过渡的效果,可使用opacity(不透明度)效果,css淡入淡出效果,也是添加移除类实现)
  //大图片显示隐藏,实则也是((大图片盒子中小li的))添加移除类
  document.querySelector('.slides ul .active').classList.remove('active') //选出唯一active,删除类
  piclis[i].classList.add('active') //对应序号的li添加active类
  //图片描述信息跟随改变
  text.innerHTML = `${i + 1}张图的描述信息`

  //鼠标经过哪个小li 他的索引号就是i
  index = i 

    })

  }

  //需求3:点击按钮播放效果(右侧按钮):(与鼠标经过无关,应放在for外面;
  //但上下一张图片会受鼠标经过的图片影响,故又放在鼠标经过事件后面)
  let index = 0 //定义记录图片索引的全局变量
  next.addEventListener('click',function(){
    index++
    //每次点击大、小图片都要随之变化
    //小图片
    if(index > 9){
      index = 0
    }   //可写成index % lis.length
    common()//调用显示大小图片函数

  })

    //需求4:点击按钮播放效果(左侧按钮)
    //同理左侧按钮只需吧右侧按钮改成减- 即可 
    prev.addEventListener('click',function(){
    index--
    //每次点击大、小图片都要随之变化
    //小图片
    if(index < 0){
      index = lis.length - 1
    }  
    common()//调用显示大小图片函数

  })

  //需求5:
  //把左右侧按钮大量相同的操作代码封装成函数调用即可
  function common(){  //显示大小图片函数
    document.querySelector('.indicator .active').classList.remove('active') //选出高亮的图片移除类
    lis[index].classList.add('active') //添加类
    //大图片
    document.querySelector('.slides ul .active').classList.remove('active') //选出唯一active,删除类
    piclis[index].classList.add('active') //对应序号的li添加active类
    //图片描述信息跟随改变
    text.innerHTML = `${index + 1}张图的描述信息`
  }

  //需求6:
  // 定时器,自动播放;其实相当于点击了右侧按钮,此时调用right.click()
  let timer = setInterval(function(){
    //自动调用右侧按钮的点击事件
    next.click()
  },1000)

  //需求7:
  // 鼠标经过定时器停止(此处设置经过大盒子都停止)
  main.addEventListener('mouseenter',function(){
    clearInterval(timer)
  })
  //  鼠标离开时定时器开始
  main.addEventListener('mouseleave',function(){
    timer = setInterval(function(){ //此处不能重新let定义,函数内定义为局部变量定时器停止找不到此定时器
    //自动调用右侧按钮的点击事件
    next.click()
  },1000)
  })
  
</script>

</html>

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

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

相关文章

【飞桨Paddle】RTSP视频流和PP-Human实时行人分析

PP-Human是基于飞桨深度学习框架的业界首个开源的实时行人分析工具&#xff0c;支持图片/单镜头视频/多镜头视频多种输入方式&#xff0c;功能覆盖多目标跟踪、属性识别和行为分析&#xff0c;兼容图片、视频、在线视频流多种数据格式输入。 环境准备 环境要求&#xff1a; Pa…

蓝牙耳机哪款音质最好?公认音质好的蓝牙耳机品牌

耳机作为日常生活的调剂品&#xff0c;从性能到外观&#xff0c;再到音质让我对真无线蓝牙耳机的综合性能惊艳&#xff0c;蓝牙技术的成熟开启了无线传输模式&#xff0c;面对琳琅满目的无线蓝牙耳机&#xff0c;很多人一时之间无从下手&#xff0c;不知道口碑最好的蓝牙耳机是…

【空间/通道注意模型:Nest连接:IVIF】

NestFuse: An Infrared and Visible Image Fusion Architecture Based on Nest Connection and Spatial/Channel Attention Models &#xff08;NestFuse: 基于Nest连接和空间/通道注意模型的红外和可见光图像融合架构&#xff09; 我们提出了一种新颖的红外和可见光图像融合…

分布式技术——分布式事务原理与实战

摘要 分布式事务是分布式系统中非常重要的一部分&#xff0c;最典型的例子是银行转账和扣款&#xff0c;A 和 B 的账户信息在不同的服务器上&#xff0c;A 给 B 转账 100 元&#xff0c;要完成这个操作&#xff0c;需要两个步骤&#xff0c;从 A 的账户上扣款&#xff0c;以及…

sqli-labs/Less-36

这一关和上一关一样都是get请求形式的 我们首先判断一下注入类型是否为数字型 输入如下 id1 and 12 正常回显了 说明属于字符型 然后判断是单引还是双引 输入1 回显如下 不好 遇到转义了 需要宽字节注入帮助逃逸才行 于是将注入语句改成了1%df 回显如下 出现报错信息 从…

聊聊Spring Cloud Gateway 动态路由及通过Apollo的实现

在之前我们了解的Spring Cloud Gateway配置路由方式有两种方式 1.通过配置文件 spring:cloud:gateway:routes:- id: testpredicates:- Path/ms/test/*filters:- StripPrefix2uri: http://localhost:9000 2.通过JavaBean Beanpublic RouteLocator routeLocator(RouteLocatorB…

最新科目一攻略(新规)

一、*新规题 1、学法减分学习和满分教育 学法减分学习网上学习3日内累计满30分钟且考试合格&#xff0c;一次扣减1分现场学习满1小时且考试合格&#xff0c;一次扣减2分参加组织的交通安全公益活动的&#xff0c;满1小时&#xff0c;一次扣减1分【易考】饮酒后受过处罚&#xf…

[内排序]八大经典排序合集

文章目录1 排序的基本概念1.1 什么是排序1.2 排序的稳定性1.3 内排序和外排序2 插入排序2.1 直接插入排序1. 排序思路2. 直接插入排序实例3. 排序算法4. 算法分析5. 折半插入排序 / 二分插入排序5.1 排序思路5.2 排序算法5.3 算法分析2.2 希尔排序1. 排序思路2. 希尔排序实例3.…

免费查题接口

免费查题接口 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转&a…

NodeJs实战-待办列表(7)-connect组件简化代码

NodeJs实战-待办列表7-connect组件简化代码什么是connectconnect demo 程序conenct 应用到服务端验证添加完成什么是connect connect demo 程序 安装 conncet、connect-query 组件 npm install connect npm install connect-query编写 demo 程序&#xff0c;保存到 test_conn…

阿里高工内产的 SpringBoot 实战派手册仅发布一天霸榜Github

近年来&#xff0c;Spring Boot 是整个Java社区中最有影响力的项目之一&#xff0c;常常被人看作是Java EE( Java Platform Enterprise Edition )开发的颠覆者&#xff0c;它将逐渐替代传统SSM ( Java EE互联网轻量级框架整合开发——Spring MvCSpringMyBatis&#xff09;架构。…

低代码平台的核心价值与优势

数字化时代的到来&#xff0c;迫使企业跳出舒适圈&#xff0c;坚定地踏上数字化转型的征程。不断飙升的用户需求&#xff0c;加上专业开发人员的显著缺口&#xff0c;让我们不得不承认&#xff0c;过去几十年的应用开发方式已经无法满足需求。低代码革命已经悄然开始&#xff0…

智慧防汛解决方案-最新全套文件

智慧防汛解决方案-最新全套文件一、建设背景行业痛点&#xff1a;1、家底不清&#xff0c;责权不分2、状态不明难以监管3、内外业脱节4、主观防涝二、建设思路面临的挑战&#xff1a;三、建设方案四、获取 - 智慧防汛全套最新解决方案合集一、建设背景 随着城市的快速发展&…

数据库的一级、二级、三级封锁协议

0、内容补充 X锁&#xff08;排他锁、写锁&#xff09; S锁&#xff08;共享锁、读锁&#xff09; 一、一级封锁协议 一级封锁协议是指&#xff0c;事务T在修改数据R之前必须先对其加X锁&#xff0c;直到事务结束才释放。事务结束包括正常结束&#xff08;COMMIT&#xff09;…

Kotlin Flow啊,你将流向何方?

前言 前边一系列的协程文章铺垫了很久&#xff0c;终于要分析Flow了。如果说协程是Kotlin的精华&#xff0c;那么Flow就是协程的精髓。 通过本篇文章&#xff0c;你将了解到&#xff1a; 什么是流&#xff1f;为什么引进Flow?Fow常见的操作为什么说Flow是冷流? 1. 什么是流 …

你必须要了解的国产数据库——OceanBase

文章目录前言1、什么是OceanBase&#xff1f;2、OceanBase名字的由来3、OceanBase 发展历程4、OceanBase优势5、OceanBase的核心特性6、应用场景7、未来展望前言 一直以来&#xff0c;外国企业在数据库领域保持高市占率&#xff0c;主流的数据库系统大多数都是使用外国的产品。…

读文章笔记-OSSFS-DD

读文章笔记-OSSFS-DD文章代码文章主要贡献内容公式(5)(6)的详细推倒对比其他7种算法算法思考文章 Online Scalable Streaming Feature Selection via Dynamic Decision 代码 https://github.com/doodzhou/OSFS 文章主要贡献 将特征分成选择&#xff0c;丢弃和延迟。提出基…

《第一行代码》核心知识点:Android的脸面之UI控件

《第一行代码》核心知识点&#xff1a;Android的脸面之UI控件前言三、Android的脸面之UI控件3.1 常用控件介绍3.1.1 TextView3.1.2 Button3.1.3 EditText3.1.4 ImageView3.1.5 ProgressBar3.1.6 AlertDialog3.1.7 ProgressDialog3.2 四种基本布局介绍3.2.1 线性布局3.2.2 相对布…

更强悍 更智能!飞凌嵌入式FET3588-C核心板震撼发布!

为提升AIoT领域终端设备的处理能力以及智能化程度&#xff0c;飞凌嵌入式与瑞芯微强强联手&#xff0c;正式推出FET3588-C核心板&#xff01; 1、国芯之光 品质之选 FET3588-C核心板基于Rockchip新一代旗舰RK3588处理器开发设计&#xff0c;采用先进的8nm制程工艺&#xff0c; …

【软考软件评测师】第三十一章 操作系统综合知识

【软考软件评测师】第三十一章 操作系统综合知识 第三十一章 操作系统综合知识【软考软件评测师】第三十一章 操作系统综合知识第一部分 知识点集锦1.嵌入式操作系统1&#xff09;可裁剪性2&#xff09;实时性3&#xff09;统一的接口4&#xff09;弱交互性5&#xff09;更好的…