手把手带你实现一个简单的轮播图

news2024/12/28 5:16:06

轮播图现有成熟的插件非常多,但做为一名学习中的想要成为前端开发的小伙伴们来说,自己动手实现一个轮播图,还是很锻炼的,实现完成后,也是很有成就感的。下面,我们来实现一个简单的轮播图吧。

目录

1 HTML + CSS3布局

2 为什么要多放一个图片?

3 滚动实现

3.1 初始化变量

3.2 初始化页面元素

3.3 3秒自动滚动一次

3.4 点击按钮到达目标图片


1 HTML + CSS3布局

轮播图中,HTML布局有那么几个重要点:

  1. 外层的div元素,要设定要宽高,并且overflow:hidden;意思就是轮播图,其实是几张图片横排起来的,会非常长,所以需要将提前设定好的宽高以外的内容限制住。不能超出这个范围,超出就得让用户看不见。不过前端嘛,经常干这种事,怎么把元素隐藏起来。其实是有的,但不能让用户看见。
  2. 里层有一个div元素(或者其他ul元素也行),重点就是装这些横排起来的非常多的图片元素,这个里层的div元素呢,是可以很长的。外层的父元素已经overflow:hidden了,放心,多余的是看不见的。
  3. 让这些图片元素横排起来。不过轮播图嘛,有可点击的,有不可点击的。这一小节,我们先来实现一个纯图片的,不可点击的。什么是可点击的?你看那些正经网站,谁纯展示一个轮播图啊,那么大那么重要的区域,肯定是得诱导用户去点击你这个非常有价值的轮播图啊。
<div id="box-t">
	<div class="box-imgs" id="boxImgs" style="left:0;">
		<img class="tup" src="../images/1.jpg" alt="" />
		<img class="tup" src="../images/2.jpg" alt="" />
		<img class="tup" src="../images/3.jpg" alt="" />
		<img class="tup" src="../images/4.jpg" alt="" />
		<img class="tup" src="../images/5.jpg" alt="" />
		<img class="tup" src="../images/1.jpg" alt="" />
	</div>
    		
    <div class="box-t-y">
        <p class="box-t-x" index="1" onclick="handleBtns(0)"></p>
        <p class="box-t-x" index="2" onclick="handleBtns(1)"></p>
        <p class="box-t-x" index="3" onclick="handleBtns(2)"></p>
        <p class="box-t-x" index="4" onclick="handleBtns(3)"></p>
        <p class="box-t-x" index="5" onclick="handleBtns(4)"></p>
    </div>
</div>
#box-t{
	overflow: hidden;
	position: relative;   /*设置相对定位*/
	height: 400px;
}
.box-imgs {
	position: absolute;
	left: 0;
	top: 0;
	display: flex;
	width: 6000px;
	height: 400px;
}
#box-t img{
	width:1000px;
	height:400px;
}
.tup{
	display:block;
}
.box-t-y{
	position:absolute;  /*给按钮添加绝对定位*/
    right:45%;
    bottom:0;     /*下边距为0*/
}
.box-t-x{
    width:20px;
    height:20px;
    display: inline-block;  /*不独占一行的块级元素*/
    opacity:0.7;           /*设置透明度*/
    border:1px solid #fff;  /*边框为1像素白色实线*/
    border-radius:10px;     /*实现椭圆效果*/
    margin-right:10px;
    cursor: pointer;
}
.box-t-x:hover, .box-t-x-hover {
	background: #FC9;
}

2 为什么要多放一个图片?

本来轮播图组件中是5张图片轮播的,为什么要多放一张,看HTML元素里是6张图片元素呢?

 这是因为第5张图片播放完了以后,其实该播放第一张图片了。但如果只有5张图片的话,什么时候播放第一张图片,这需要一个时机。第5张播放完了,按理说应该继续并且顺序的播放第一张,但第一张如果在最左边的话,直接跳动到第一张,或者滚动很长,从第5张到第1张,怎么弄都很不好看。

这个时候,放第6张图片,而第6张图片存放的就是第一张图片。这样让轮播图组件顺滑的从第5张滚动到第6张,但用户看来,这其实是顺滑的滚动到了第一张图片上。当轮播图滚动到了第6张图片后,因为有3秒的等待期,这个时候,再悄么声的把图片换为第一张,用户其实是无感知的。

3 滚动实现

3.1 初始化变量

let intervalTimer = null; // 初始化定义滚动定时
let scrollIndex = 0;
let boxImgs = document.getElementById('boxImgs');
let btns = document.querySelectorAll('.box-t-x');

滚动,比如几秒滚动一次,比如每次滚动需要多久的时间,比如电脑刷新频率是一秒多少次才能不显得卡,这些都需要一定的定时任务来完成。

然后既然是轮播,那么一定随时需要知道当前滚动到第几张了,下面的按钮是第一个当前需要高亮显示。这些变量都做一个初始化。

3.2 初始化页面元素

// 初始化页面元素
function initImgs() {
   scrollIndex = 0;
   boxImgs.style.left = `0`;
   btns.forEach((item) => {
      item.className = 'box-t-x';
   })
   btns[0].className = 'box-t-x box-t-x-hover';
}
initImgs();

说是轮播图在滚动,其实是子div距离左边的距离,一直在发生变化。而且父元素已经使用了overflow:hidden。这样一来,不管是左边超出,或者是右边超出,用户都是看不到的。但这个长长的元素已经超出去了。

那么我们初始化的时候呢,设定这个子div距离左边的距离为0,意思就是初始化的时候,默认是第一张图片显示,而且图片的宽度和最外层div的宽度保持一致,这样一张图就能占满整个区域了,用户看见的就是一张图一个区域。

然后我们给底部按钮初始化一下,给第1个按钮加个选中样式,让用户知道,当前是第一张。

3.3 3秒自动滚动一次

// 3秒自动滚动
function autoScroll() {
   intervalTimer = setInterval(() => {
      let onecIndex = 1;
      let onecScroll = setInterval(() => {
         boxImgs.style.left = `-${(scrollIndex*1000) + 100*onecIndex}px`;
         if (onecIndex >= 10) {
            window.clearInterval(onecScroll);
            onecScroll = null;

            // 一次移动结束后
            scrollIndex++;
            if (scrollIndex >= 5) {
               initImgs();
            } else {
               // 底部按钮选中改变
               btns.forEach((item) => {
                  item.className = 'box-t-x';
               })
               btns[scrollIndex].className = 'box-t-x box-t-x-hover';
            }
         }
         onecIndex++;
      }, 50)

   }, 3000)
}
autoScroll();

这里采用了3秒自动滚动一次的方式,我们让之前初始化的变量scrollIndex自动累加,当要超出图片长度的时候,再将这个值恢复为0。

3.4 点击按钮到达目标图片

function handleBtns(index) {
   // 如果是点击当前的,那么无效
   if (index === scrollIndex) {
      return;
   }
   // 停止自动滚动
   window.clearInterval(intervalTimer);
   intervalTimer = null;
   // 给选中按钮加样式
   btns.forEach((item) => {
      item.className = 'box-t-x';
   })
   btns[index].className = 'box-t-x box-t-x-hover';


   let boxImgsLeft = Number(boxImgs.style.left.slice(0, -2));
   let toLeft = -index*1000;
   let scrollLeftAbs = Math.abs(toLeft - boxImgsLeft);
   // 需要频繁移动的次数
   let scrollNum = scrollLeftAbs/100;

   let onecIndex = 1;
   let onecScroll = setInterval(() => {
      // 向左滚动
      if (index > scrollIndex) {
         let newLeft = boxImgsLeft - 100*onecIndex;
         boxImgs.style.left = `${newLeft}px`;
      }
      // 向右滚动
      if (index < scrollIndex) {
         let newLeft = boxImgsLeft + 100*onecIndex;
         boxImgs.style.left = `${newLeft}px`;
      }
      if (onecIndex >= scrollNum) {
         scrollIndex = index;
         window.clearInterval(onecScroll);
         onecScroll = null;

         autoScroll();
      }
      onecIndex++;
   }, 50)
}

当点击按钮的时候,我们需要做如下判断:

  1. 如果点中的按钮和当前图片是同一张,那么就是无效的;
  2. 如果点中的按钮索引呢,比当前图片的索引大,索引是啥?就是当前是第几张,从0开始算。如果点中的索引大,那么就让轮播图继续向左滑动;
  3. 如果点中的按钮索引值,比当前图片索引值小,那么我们就让他向反方向滑动。

 

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

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

相关文章

DIY一个PE启动盘

原文&#xff1a;https://blog.c12th.cn/archives/18.html 前言 有天&#xff0c;朋友问我有没有带集成软件的U盘启动盘。我也是很久没有弄启动盘了&#xff0c;有次在逛b站时无意中看到还有可以DIY的启动盘&#xff0c;于是就教程就来了… 该两种方法&#xff0c;已在三台实体…

SCADA软件地毯式介绍,你想知道的都在这里.

很多小伙伴对SCADA很陌生&#xff0c;殊不知这个可是智慧工业制造的大脑和中枢神经&#xff0c;很多指令的发出&#xff0c;监控状态的现实都得通过这个系统&#xff0c;本文详解介绍一下什么是SCADA&#xff0c;重大作用&#xff0c;其在工业制造中的位置&#xff0c;以及市面…

停车场控制机系统哪家好?捷顺捷曜分体式车场控制机有哪些功能亮点?

停车场控制机为现代城市提供了许多便利和好处。首先&#xff0c;它能够自动记录车辆进出的时间&#xff0c;便于车主和管理人员进行费用计算。其次&#xff0c;通过车牌识别技术&#xff0c;提高了车辆进出的效率&#xff0c;减少了排队等待时间。此外&#xff0c;控制机还可以…

【Pepper机器人开发与应用】二、Pepper机器人图形化开发:医疗服务机器人程序设计

‍‍&#x1f3e1;博客主页&#xff1a; virobotics(仪酷智能)&#xff1a;LabVIEW深度学习、人工智能博主 &#x1f4d1;上期文章&#xff1a;『【Pepper机器人开发与应用】一、教你如何使用图形化开发软件高效开发pepper机器人&#xff08;Pepper SDK for LabVIEW&#xff09…

MFC开发 解决:VSstudio2019 无法打开afxwin.h 或 安装afxwin.h

在进行MFC开发的学习中&#xff0c;在win10系统下使用vs studio2019进行mfc开发&#xff0c;出现的标题的问题 首先&#xff0c;如果你以及安装过了afxwin.h相关环境 那么按照如下步骤 首先 打开工程的属性 在 高级——MFC的使用——选择在共享DLL中使用MFC 如下 …

JVM 基本组成

一、为什么要学习 JVM &#xff1f; 1. “ ⾯试造⽕箭&#xff0c;⼯作拧螺丝” &#xff0c; JVM 属于⾯试官特别喜欢提问的知识点&#xff1b; 2. 未来在⼯作场景中&#xff0c;也许你会遇到以下场景&#xff1a; 线上系统突然宕机&#xff0c;系统⽆法访问&#xff0c;甚⾄直…

【AICFD教程】汽车外气动仿真,小白学CFD的入门案例

【视频教程】 【教程】汽车外气动仿真&#xff0c;小白学CFD的入门案例 【文字教程】 1. 案例背景 1.1 学习目标 本案例针对某汽车仿真模型&#xff0c;在车速为40m/s时进行了汽车外流场的数值模拟。 本案例教程旨在演示AICFD中以下场景与功能的操作&#xff1a; a. 单域外…

JavaScript和promise——0_1 promise

文章目录 是什么&#xff1f;未来值回调和未来值在回调环境下这么和未来值交互&#xff1f;群居的未来值其他的解决方案 这样写可以实现目标效果。可是&#xff0c;这样写优雅吗&#xff1f; 英雄登场关键词&#xff1a;then关键词&#xff1a;回调 为什么promise不需要start函…

在等保2.0框架下,如何进行有效的物联网设备安全培训和意识提升?

在等保2.0框架下&#xff0c;进行有效的物联网设备安全培训和意识提升&#xff0c;可以从以下几个方面入手&#xff1a; 1. 分层次培训内容设计&#xff1a; • 基础知识普及&#xff1a;涵盖物联网的定义、特点及其面临的安全威胁和攻击手段&#xff0c;让员工理解物联网安全…

技巧|手机上看SwanLab实验的两种方法

什么是SwanLab? SwanLab是一个深度学习实验管理与训练可视化工具&#xff0c;由西安电子科技大学创业团队打造&#xff0c;融合了Weights & Biases与Tensorboard的特点&#xff0c;可以记录整个实验的超参数、指标、训练环境、Python版本等&#xff0c;并可视化图表&…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] A先生的货运计划(200分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 📎在线评测链接 A先生的货运计划(200分) 🌍 评测功能需要 订阅专栏 后私信…

科普童话投稿

《科普童话》杂志是由国家新闻出版总署批准、黑龙江省教育厅主管、黑龙江省语言文字报刊社主办的正规期刊。《科普童话》以培养科学素养与创新探索精神为办刊宗旨&#xff0c;以科学与艺术统一为编辑方针&#xff0c;以科学教育、教育科学作为自己的出发点&#xff0c;致力于对…

揭秘网络盗版游戏产业链,守护游戏安全 | 天堂1私服非法牟利,涉嫌洗黑钱!

近年来&#xff0c;网络盗版游戏现象日益猖獗&#xff0c;尤其是天堂1私服。这些盗版游戏不仅非法牟利&#xff0c;还存在偷税漏税、诱导消费等违法行为。本文将揭示这一产业链的真相&#xff0c;提醒广大游戏玩家保持警惕&#xff0c;并向相关部门举报&#xff0c;共同维护互联…

安卓软件自动运行插件的开发源代码介绍!

随着移动互联网的快速发展&#xff0c;安卓操作系统凭借其开放性和灵活性&#xff0c;成为了众多开发者们的首选平台&#xff0c;在安卓应用的开发中&#xff0c;为了实现各种复杂的功能&#xff0c;插件化技术逐渐受到青睐。 其中&#xff0c;自动运行插件作为一种能够实现应…

MT8766安卓4G核心板_MTK联发科PCBA方案开发

MT8766是联发科四核4G模块方案&#xff0c;安卓一体板。 采用台积电 12 nm FinFET 制程工艺&#xff0c;4*A53架构&#xff0c;Android 9.0操作系统&#xff0c;搭载2.0GHz 的 Arm NEON 引擎。提供了支持最新 OpenOS 及其要求苛刻的应用程序所需的处理能力&#xff0c;专为具有…

可提供实习证明/实习鉴定报告,企业项目试岗实训开营啦

在数字化转型的浪潮中&#xff0c;大数据和人工智能等前沿技术已成为推动经济发展和科技进步的关键动力。当前&#xff0c;全球各行各业都在积极推进数字化转型&#xff0c;不仅为经济增长注入新活力&#xff0c;也对人才市场结构产生了深刻影响&#xff0c;尤其是对数字化人才…

CCS环形低角度光源用于细微凹凸、损伤、刻印字符的成像——LDR2-LA1系列

机器视觉系统中&#xff0c;光源起着重要作用&#xff0c;不同类型的光源应用也不同&#xff0c;选择合适的光源成像效果非常明显。今天我们一起来看看CCS光源——工业用环形低角度光源LDR2-LA1系列&#xff0c;可对被测物体近距离使用。 LDR2-LA1 特点 1、从被测物体的最近距…

数据可视化实验四:Pyecharts数据可视化

目录 一、使用PyEcharts绘制全国肺炎确诊人数分布图 1.1 柱状图 1.1.2 代码实现 1.1.2 绘制结果 1.2 饼状图 1.2.1 代码实现 1.2.2 绘制结果 1.3 使用over lap实现图形叠加 1.3.1 代码实现 1.3.2 绘制结果 1.4 地图绘制-Map 1.4.1 代码实现 1.4.2 绘制结果 1.5 地…

【ai】如何在ollama中随意使用hugging face上的gguf开源模型

【背景】 ollama的pull命令可以直接pull ollama列表中现有的模型&#xff0c;但是ollama可以直接pull的模型大都是英语偏好&#xff08;llama2有直接可以pull的chinese版本&#xff09;&#xff0c;而hugging face上则有大量多语种训练的模型&#xff0c;如果能直接使用huggin…

如何使用GPT?初学者的指南

ChatGPT是一个非常先进的AI工具&#xff0c;它使用GPT-4架构&#xff0c;能够生成自然的语言回应。它的多功能性和理解复杂指令的能力&#xff0c;使得很多人用它来回答各种问题&#xff0c;就像用Google一样输入关键词。不过&#xff0c;ChatGPT还能做更多事情&#xff0c;下面…