前端入门 原生js实现轮播图 - 基础版

前端必备技能——轮播图(原生代码+插件) 今天咱就是让你不仅自己能写出轮播图代码,还能用插件插入轮播图 阅读详情

前言

工作以来,现在的前端基本就是会用工具就行,不管是vue还是react,他们都有很多的库,确实方便了开发,也提高了工作效率。但是工具用久了,可能连一些基本的前端都搞忘了,因为太久没有写了。
轮播图是前端入门的必经之路,单论轮播图来说,就有很多种实现方式,今天就写一个最基础的实现方式。

效果图

Video_2024-07-18_221949

实现

直接上代码
###HTML

<div class="wrapper">
    <div class="container">
      <!-- 轮播内容 -->
      <div class="content bg_1 action">1</div>
      <div class="content bg_2">2</div>
      <div class="content bg_3">3</div>
      <div class="content bg_4">4</div>
      <!-- 前后翻页 -->
      <div class="prev">&lt;</div>
      <div class="next">&gt;</div>
      <!-- 提示 -->
      <div class="circle">
        <span class="active"></span>
        <span></span>
        <span></span>
        <span></span>
      </div>
    </div>
  </div>

###CSS

<style>
    * {
      padding: 0;
      margin: 0;
    }

    .wrapper {
      width: 100%;
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .container {
      width: 960px;
      height: 360px;
      position: relative;
    }

    .content {
      width: 100%;
      height: 100%;
      color: #fff;
      text-align: center;
      line-height: 360px;
      font-size: 36px;
      font-weight: bold;
      position: absolute;
      top: 0;
      left: 0;
      opacity: 0;
      transition: opacity .3s linear;
    }

    .action {
      opacity: 1;
    }

    .bg_1 {
      background-color: slateblue;
    }

    .bg_2 {
      background-color: salmon;
    }

    .bg_3 {
      background-color: seagreen;
    }

    .bg_4 {
      background-color: skyblue;
    }

    .prev,
    .next {
      width: 24px;
      height: 24px;
      color: #fff;
      font-size: 14px;
      font-weight: 700;
      padding: 10px;
      border-radius: 50%;
      cursor: pointer;
      text-align: center;
      background-color: rgba(0, 0, 0, .3);
      position: absolute;
      top: 50%;
    }

    .prev {
      left: 24px;
    }

    .next {
      right: 24px;
    }

    .circle {
      width: 100%;
      padding: 10px 0;
      display: flex;
      justify-content: center;
      align-items: center;
      position: absolute;
      bottom: 24px;
    }

    .circle span {
      display: inline-flex;
      width: 24px;
      height: 24px;
      background-color: #f3f5f7;
      border-radius: 12px;
      margin: 0 8px;
      cursor: pointer;
      transition: width .3s linear;
    }

    .circle .active {
      width: 48px;
      background-color: yellowgreen;
    }
  </style>

###JavaScript

 <script>
    let timer = 0;
    // 定义当前值
    let curIndex = 0;
    // 获取需要操作的dom元素
    const doms = {
      cDoms: document.querySelectorAll('.content'),
      pDom: document.querySelector('.prev'),
      nDom: document.querySelector('.next'),
      sDoms: document.querySelectorAll('.circle span'),
    }

    doms.pDom.addEventListener('click', () => {
      // stopMove();
      curIndex--
      if (curIndex < 0) {
        curIndex = 3;
      }
      filterIndex(curIndex)
    })

    doms.nDom.addEventListener('click', () => {
      // stopMove();
      curIndex++
      if (curIndex > 3) {
        curIndex = 0;
      }
      filterIndex(curIndex)
    })

    doms.sDoms.forEach((item, index) => {
      item.addEventListener('click', () => {
        curIndex = index
        filterIndex(index)
      })
    })

    // filterIndex
    function filterIndex(curIndex) {
      doms.cDoms.forEach((item, index) => {
        if (curIndex === index) {
          item.classList.add('action')
        } else {
          item.classList.remove('action')
        }
      });
      doms.sDoms.forEach((item, index) => {
        if (curIndex === index) {
          item.classList.add('active')
        } else {
          item.classList.remove('active')
        }
      })
    }

    function startMove() {
      if (timer) clearInterval(timer);
      timer = setInterval(() => {
        curIndex++
        if (curIndex > 3) {
          curIndex = 0;
        }
        filterIndex(curIndex)
      }, 2000)
    }

    function stopMove() {
      clearInterval(timer);
    }

    startMove()

    filterIndex(curIndex)
  </script>

以上便是一个基础版的轮播的HTML、CSS、Javascript的代码。该轮播图是通过定位在一起,然后通过 opacity: 0; 来控制显示当前页。也可以将 opacity: 0; 换成 display: none、z-index等来实现,然后通过 transition: opacity .3s linear; 实现过度,显得没有那么生硬。filterIndex()这个方法接收一个索引值,也就是当前需要显示的值。 如果想要轮播自己动起来,可以调用 startMove() 这个方法,这个方法通过 setInterval 实现。

总结

实现轮播图的方式多种多样,可以根据具体的需求、性能等方面考虑,然后选择合适的方法实现。以上是一个入门级的基本版本,适合新手练习。如果想练习更多高级轮播图,可以尝试无缝轮播。后面我也会自己写一下无缝轮播的实现。
最后上源码

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

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>轮播图</title>
  <style>
    * {
      padding: 0;
      margin: 0;
    }

    .wrapper {
      width: 100%;
      height: 100vh;
      display: flex;
      justify-content: center;
      align-items: center;
    }

    .container {
      width: 960px;
      height: 360px;
      position: relative;
    }

    .content {
      width: 100%;
      height: 100%;
      color: #fff;
      text-align: center;
      line-height: 360px;
      font-size: 36px;
      font-weight: bold;
      position: absolute;
      top: 0;
      left: 0;
      opacity: 0;
      transition: opacity .3s linear;
    }

    .action {
      opacity: 1;
    }

    .bg_1 {
      background-color: slateblue;
    }

    .bg_2 {
      background-color: salmon;
    }

    .bg_3 {
      background-color: seagreen;
    }

    .bg_4 {
      background-color: skyblue;
    }

    .prev,
    .next {
      width: 24px;
      height: 24px;
      color: #fff;
      font-size: 14px;
      font-weight: 700;
      padding: 10px;
      border-radius: 50%;
      cursor: pointer;
      text-align: center;
      background-color: rgba(0, 0, 0, .3);
      position: absolute;
      top: 50%;
    }

    .prev {
      left: 24px;
    }

    .next {
      right: 24px;
    }

    .circle {
      width: 100%;
      padding: 10px 0;
      display: flex;
      justify-content: center;
      align-items: center;
      position: absolute;
      bottom: 24px;
    }

    .circle span {
      display: inline-flex;
      width: 24px;
      height: 24px;
      background-color: #f3f5f7;
      border-radius: 12px;
      margin: 0 8px;
      cursor: pointer;
      transition: width .3s linear;
    }

    .circle .active {
      width: 48px;
      background-color: yellowgreen;
    }
  </style>
</head>

<body>
  <div class="wrapper">
    <div class="container">
      <!-- 轮播内容 -->
      <div class="content bg_1 action">1</div>
      <div class="content bg_2">2</div>
      <div class="content bg_3">3</div>
      <div class="content bg_4">4</div>
      <!-- 前后翻页 -->
      <div class="prev">&lt;</div>
      <div class="next">&gt;</div>
      <!-- 提示 -->
      <div class="circle">
        <span class="active"></span>
        <span></span>
        <span></span>
        <span></span>
      </div>
    </div>
  </div>

  <script>
    let timer = 0;
    // 定义当前值
    let curIndex = 0;
    // 获取需要操作的dom元素
    const doms = {
      cDoms: document.querySelectorAll('.content'),
      pDom: document.querySelector('.prev'),
      nDom: document.querySelector('.next'),
      sDoms: document.querySelectorAll('.circle span'),
    }

    doms.pDom.addEventListener('click', () => {
      // stopMove();
      curIndex--
      if (curIndex < 0) {
        curIndex = 3;
      }
      filterIndex(curIndex)
    })

    doms.nDom.addEventListener('click', () => {
      // stopMove();
      curIndex++
      if (curIndex > 3) {
        curIndex = 0;
      }
      filterIndex(curIndex)
    })

    doms.sDoms.forEach((item, index) => {
      item.addEventListener('click', () => {
        curIndex = index
        filterIndex(index)
      })
    })

    // filterIndex
    function filterIndex(curIndex) {
      doms.cDoms.forEach((item, index) => {
        if (curIndex === index) {
          item.classList.add('action')
        } else {
          item.classList.remove('action')
        }
      });
      doms.sDoms.forEach((item, index) => {
        if (curIndex === index) {
          item.classList.add('active')
        } else {
          item.classList.remove('active')
        }
      })
    }

    function startMove() {
      if (timer) clearInterval(timer);
      timer = setInterval(() => {
        curIndex++
        if (curIndex > 3) {
          curIndex = 0;
        }
        filterIndex(curIndex)
      }, 2000)
    }

    function stopMove() {
      clearInterval(timer);
    }

    startMove()

    filterIndex(curIndex)
  </script>
    
</body>

</html>
【前端知识之JS】JS原生手写轮播图 本系列主要整理前端面试中需要掌握的知识点。本节介绍如何用原生JS手写轮播图。 阅读详情

相关推荐

原生JS实现轮播图 方法总结

原生JS实现轮播图 方法总结: 方法一: 利用绝对定位偏移量的改变来实现 方法二: 利用 display/opacity/visibility状态切换来实现 方法三 利用 z-index 属性来实现 ...

路漫漫其修远兮,吾将上下而求索。 5674

使用JS来实现轮播图的效果

第一步我们先获取三个元素,toggle()是一个方法调用,我是把左边和右边的写在一个方法,显示更加美观,,然后呢我们执行右侧按钮业务,还是先获取右侧按钮,然后定义一个信息量i=0。3,最后讲一个功能,这里我们依旧是在定时器上面声明一个变量,因为我们定时器也是有一直在懂,所以我们来这块设定一个点击事件。但是当我们轮播图到了最后一个,需要往返第一个,这时候我们需要判断,如果到了素组下标为8的时候,我们就得返回第一个。第一个是鼠标经过停止事件,第二个是开始事件,这样呢我们一个完整的轮播图就做出来了。

weixin_64965154的博客 7842

前端组件之轮播图

前端组件之轮播图 继续更新组件的文章,今天来说说轮播图组件。相信这个组件应该在各大网站都能经常见到,大家面试的时候可能也会被问到轮播图的原理和实现。 所以,下面来说说说我自己实现的时候的一些心得!~ 上面图这个就是京东的一个轮播图.我们就模仿类似的做一个轮播图。 原理 将图片在一行中平铺,然后计算偏移量再利用定时器实现定时轮播。 需求分析 功能分析 要实现这个效果,首先需要分析一下。轮播图最重要...

weixin_38343158的博客 1882

使用js实现轮播图效果的几种方法

使用js实现轮播图效果的几种方法 我们在各种网页中经常见到轮播图的效果,接下来我们用几种不同的方法来实现这个效果,当然方法不同所实现的效果也有所差异; 先封装一个move函数用来实现图片的移动: function move(ele,json,callback){ clearInterval(ele.t); ele.t = setInterval(() => { ...

weixin_45195822的博客 1084

原生js——轮播图、焦点图的实现

原生js轮播图、网页轮播图的实现 1.Demo展示: 2 . Html布局: &amp;amp;amp;amp;amp;amp;amp;lt;div class=&amp;amp;amp;amp;amp;amp;quot;main&amp;amp;amp;amp;amp;amp;quot;&amp;amp;amp;amp;amp;amp;amp;gt; &amp;amp;amp;amp;amp;amp;amp;lt;div id=&amp

代码小宝宝的博客 909

使用MKL+Eigen求解稀疏矩阵方程组

问题:求解Ax=b的解,其中,A为大型稀疏矩阵,长和宽分别为1500^2。 一般思路: (1)A为对称正定矩阵,对A使用cholesky分解。 (2)A为对称不定矩阵,使用LDL‘分解,即: PAP'=LDL' 其中,L为单位下三角矩阵,D由阶数为1或者2的对角块构成,P是置换矩阵。 (3)不对称矩阵:LU分解。 (4)长方形矩阵(长...

薛晓伟 3446

前端必备技能——轮播图(原生代码+插件),前端开发项目

确认插件实现的功能去官网。

2401_84093248的博客 2488

【漆学军】MT4进阶到MT5速成之路(2)获取持仓

MT5在持仓获取上,要比MT4复杂些,分两部分,获取持仓和挂单采用了不同的方法。 一、获取持仓中的buy和sell单 int b=0;//获取buy单个数 int s=0;//获取sell单个数 double lot_total_buy=0;//获取持仓中buy单的总手数 double lot_total_sell=0;//获取持仓中sell单的总手数 for(int i=0; i<PositionsTotal(); i++) { ulong ticket=Positi

漆学军的编程笔记 1627

原生 JS 实现无缝轮播图(进阶版)

上一篇有讲到原生 JS 实现无缝轮播图基础版;这一篇主要实现进阶版,包括左右按钮点击功能以及指示灯功能。

杏子 2万+

若依RuoYi文件上传漏洞实战:如何安全配置/profile/upload路径(附避坑指南)

本文深入解析若依RuoYi框架中/profile/upload路径的文件上传漏洞,提供详细的安全配置方案和实战指南。通过权限修正、输入验证强化和存储隔离等多层防御策略,有效防范未授权访问和恶意文件上传风险,保障系统安全。

pink的博客 781

安川机器人SOCKET 通讯

命令 功能 参数 示例 返回 SelectJob 选择程序 JobName LineNo SelectJob TEST 0 #SelectJob,Ok StartJob 启动程序 JobName StartJob TEST #StartJob,Ok Pause 暂停当前程序 - Pause #Pause,Ok Continue 继续当前程序 - Continue #Continue,Ok ServoOn 伺服上电 - ServoOn #ServoOn,Ok ServoOf...

记录学习内容 8288

Js原生实现无缝滑动轮播图(完整功能)

实现轮播图是前端学习的一门必修课,也是用来训练js能力。今天我用原生js写了个轮播图,包含无缝衔接、指示器、左右控制器等功能,跟大家分享。先看看效果图: 1. 设计html+css部分 结构很简单,图片部分用ul作容器(本人习惯ul,你们也可以div),flex布局让里面的li排成一排,因为我们要做的是滑动效果而不是简单显隐。注意,要在最后另外多一个li存放第一张图,这是为了后面实现无缝轮播。 ...

sxjit的博客 1万+

MS1826A HDMI 多功能视频处理器 HDMI4进1出画面分割芯片

基本介绍 MS1826A 是一款多功能视频处理器,包含 4 路独立 HDMI 音视频输入通道、1 路 HDMI 音视 频输出通道以及 1 路独立可配置为输入或者输出的 SPDIF、I2S 音频信号。支持 4 个独立的字库定 制型 OSD;可处理隔行和逐行视频或者图形输入信号;有四路独立视频播放引擎可支持视频多路 播放。该产品提供了高质量的视频输出,有解隔行输入、视频增强,以及帧率转换的处理能力。 功能特征 视频输入输出  四路独立 HDMI 输入通道  一路 HDMI 输出通道  最高支持 4K@3

qq_45645383的博客 1783

原生js实现动态轮播图

用html+css和简单的js代码,实现一个有个有导航栏的轮播图。 Lis技术

CHENJIANCONG66的博客 2799

北斗导航 | raPPPid软件功能模块详解

raPPPid(Rapid Precise Point Positioning with integer ambiguity resolution,快速精密单点定位与整周模糊度解算)是由维也纳工业大学(TU Wien)大地测量与地理信息系开发的MATLAB开源PPP软件包。它是VieVS(Vienna VLBI and Satellite Software,维也纳VLBI与卫星软件)的PPP模块,由Marcus Franz Glaner和Robert Weber主导开发。

尘世冰封的专栏 589

5、快速入门

点击启动实例按钮,并设计一个business key,每个实例会有一个business key, 业务主键,也相当于一个流程实例唯一key,一般会与一次业务强相关,比如一个订单号 ,此处取为shopping_1;付款程序完成后会流转到物流发货任务,此时java工程的相应订阅会收到任务,并进入断点,且读到到toWhere变量。单击shopping可以进入实时流程图的执行图,此时流程流转到第一个任务,需要业务系统完成此任务,并通知引擎。添加类,分别订阅流程中的加入购物车任务和物流发货任务。

leyoliu的博客 3505

原生js编写3D轮播图

原生js编写3D版轮播图 在日常开发中,为了开发的快捷性基本上都是把UI组件中的组件拿过来用即可,但是有时可能无法实现我们的需求,这时我们就需要去造轮子。 今天我们用原生的js和css3以及html来编写一个3D轮播图,如下: 第一步,编写轮播图的大致结构 使用html把创建轮播图结构 <div id="box"> <!-- 创建轮播图中图片的容器,注意图片的存放位置 --> <div class="item item1"> <img src="./1.

留白声的博客 1852

​非线性分析-增加位移量可能出现下面错误。虽然求解无法在所有时间点完成,但在某些点上仍能够求解部分结果。请参阅“帮助系统”中的故障排除,以了解更多信息详情。由于受约束,规划求解引擎无法收敛

基于收敛状态拆分载荷步‌:在已收敛的载荷步基础上,将未收敛的关键区域拆分为更细的子步,比如在载荷突变点前设置5~10个子步,逐步加载。替换冲突约束为弱约束‌:若存在约束冲突,将刚性约束替换为弱弹簧约束(刚度设为1e-6~1e-4),既限制刚体位移,又不影响结构的变形自由度,命令流:SPRING, NODE, K, 1e-6。部分区域约束完整,但存在未被约束的刚体自由度,或约束类型与大变形/接触逻辑冲突,比如某部件的位移约束在初始阶段有效,但大变形后约束位置脱离实际受力点,导致求解器在该阶段无法收敛。

qq_15963745的博客 149

原生js封装轮播图

工作原因,好久没更新博客了,今天来个用原生js写轮播图, 上代码 class Banner { constructor(props = {}) { if (!(props?.root instanceof HTMLElement)) { throw "root是必选dom节点"; } // 状态 this.state = {}; // 参数 this.props = { type: "move", height: 600

yh604005215的博客 4444

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

怎么用原生js写轮播图

目前用js原生写轮播图的攻城狮已经很少了,用的都是框架,便捷,速度 但对于初学者来说也是挺重要的,需要了解原生js轮播图的过程, 那么我今天就给大家写一下用原生js写轮播图的步骤 1、首先把需要轮播的图片放到页面 html代码 <div class="all" id='box'> <div class="screen"> <...

攻城狮-张小白的博客 2513

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

用原生JS写轮播图

今天我们来用原生JS写一个左右滚动的轮播图 HTML结构 <div class="all" id='box'> <!-- 显示图片的区域 --> <div class="screen"> <ul> <li><img src="images/1....

weixin_44827568的博客 2230

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

原生JS实现轮播图的几种方式

三种原生JS轮播图实现思路

莫邪莫急的博客 7553

原生JavaScript实现响应式Web轮播图:从基础到高级动画

本文介绍了如何使用原生JavaScript实现Web轮播图动画效果。从HTML基础结构搭建、CSS样式设计到JavaScript核心功能实现,详细讲解了DOM元素获取、轮播动画函数、事件监听和自动播放等关键技术点。文章还提供了响应式处理方案和高级功能扩展思路,如CSS过渡增强和淡入淡出效果。通过完整的代码示例,开发者可以快速掌握创建流畅、交互性强的轮播图组件的方法,适用于各种网页展示场景。

独立开发者阿乐 — AI 搜索优化(GEO)· 全栈开发 · 站点增长实战 1022

原生js以及react框架实现轮播图

摘要:轮播图实现原理是通过父容器限定展示区域(overflow:hidden),子容器用flex横向排列图片,通过动态调整translateX值实现平滑滚动。原生JS通过DOM获取元素,计算图片宽度作为位移单位,用点击事件触发transform属性改变。React实现用useRef获取DOM节点,useState存储位移状态,useEffect监听状态变化更新transform,核心原理与JS一致但采用React Hooks替代DOM操作。两种方式都通过控制translateX实现图片轮播效果。

A6516565189的博客 728

原生JS 实现轮播图效果

根据传入的图片数量在页面的底部呈现轮播图的图片数量和当前为第几张图片,点击相应的圆圈则可以跳转至其他图片;左右两个按钮同样可以实现图片的切换,如果当前为第一张或者最后一张图片,点击左移或者右移按钮即可完成循环操作,从第一张图片跳转至最后一张图片,且切换图片的效果还在。...

强风吹拂 1040

原生js轮播图

这是我的第一篇博客,本来是想写以下原生js的学习笔记的,但是今天刚好学习了一下原生轮播图的写法,并自己做了一些改变,就将它作为我的第一个博客写出来吧!!!话不多说,让我们开始!!! 在这里我准备的是四张图片的轮播,当然更多图片的轮播也是可以的,只需要改一下代码的数字即可。 我们要想一下,轮播我们需要的是什么?首先是承载图片的一个容器;其实是图片以什么样的方式进行轮播,在这里我选取的是将图片排成一列...

前端爱好者的博客 1394
上一篇: 三张图片轻松配置wampServer让局域网用户都可以访问
下一篇: 前端实用小技巧之巧用小三角形
@9yue
博客等级 码龄8年 60粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值