前端入门 原生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

MySQL 优化 - index_merge 导致查询偶发变慢

今天遇到了一个有意思的问题,线上数据库 CPU 出现了偶发的抖动。定位到原因是一条查询语句偶发变慢造成的,随后通过调整表中的索引解决。优化器通过某种机制检测到 index_merge 能带来性能提升,某些情况下不会带来提升,反而会耗费更长的时间,属于优化器的缺陷,可以通过调整表中的索引来解决。

分享既学习 1255

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

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

2401_84093248的博客 2488

Codex 命令行高效操作指南

本文详细介绍了Codex命令行工具的高效使用方法,包括安装配置、核心参数解析和实战技巧。通过`codex complete`、`codex explain`等指令,开发者可以快速生成代码、调试错误和重构项目,显著提升开发效率。特别推荐使用`--temperature`和`--max-tokens`参数优化生成结果。

weixin_29201313的博客 532

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

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

杏子 2万+

关键词‖旋变传感器

旋转变压器(以下简称旋变)安装在永磁同步驱动电机的非传动端,其作用是检测转子的位置和速度。目前,通常采采用结构简单、坚固耐用、环境适应性好的磁阻式旋变作为位置传感器。

m0_72345077的博客 2155

手把手教你用RTL8306MB搭建小型网络交换机:从原理到实战

本文详细介绍了如何使用RTL8306MB交换芯片从零搭建小型网络交换机的全过程。内容涵盖芯片原理分析、核心硬件电路设计(包括电源、时钟、RMII接口连接要点)、驱动开发与SMI通信实现,以及从物理链路到交换功能的系统调试实战。重点解析了将MAC5配置为RMII PHY模式与CPU对接的关键步骤和常见错误,帮助嵌入式开发者深入理解网络交换原理并完成实践。

weixin_29274969的博客 193

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

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

sxjit的博客 1万+

通用抓取算法AnyGrasp(Graspnet)——本地部署并测试自定义输入数据

背景:GraspNet在数据采集方面,首先将相机固定到机械臂末端,对同一个场景拍摄256个不同的角度,同时场景中的每个物体都会提前采集好3D模型,之后将其投射到仿真环境中,在仿真环境中,对抓取位姿进行打标签,如此完成数据的采集。在运行官方的测试示例时,使用的是路径下的输入数据,可以分析下。color.png(输入):rgb图像(输出):输出的生成抓取位姿的图像depth.png(输入):和当前rgb图像对应的深度图像(保存格式是单通道uint16)meta.mat。

boss-dog 1330

原生js实现动态轮播图

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

CHENJIANCONG66的博客 2799

财务数字化——解读美的战略规划之财务组织体系建设【附全文阅读】

本文提出适用于集团企业的财务管控方案,面向财务负责人、HR及战略规划人员。方案整合四种管控模式,结合500强案例,构建"职能定位-架构设计-权责划分-人才发展"体系,涵盖财务五大模块。通过明确总部与事业部权责边界,提供组织架构等实操框架,旨在平衡财务管控与业务支持,提升效率与风控能力,满足集团财务体系规范化建设需求。

cdfunlove的博客 664

YOLOv11改进-卷积-引入小波卷积WTConv 解决多尺度小目标问题

1.首先,WTConv利用二维Haar小波变换对输入图像进行多级分解。低频分量 (LL):捕捉图像的低频信息,如整体形状或轮廓。水平高频分量 (LH):捕捉图像中的水平边缘信息。垂直高频分量 (HL):捕捉图像中的垂直边缘信息。对角线高频分量 (HH):捕捉图像的对角线细节。在每一级的小波变换中,图像被下采样(空间分辨率减半),但频率信息得到了更细的分解。递归地执行小波变换(称为多级分解)可以得到不同尺度下的频率分量。

qq_64693987的博客 1万+

原生js编写3D轮播图

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

留白声的博客 1852

使用Qt Creator自带的Qt Designer构造UI界面流程总结

在本文中,我们将总结使用Qt Creator自带的Qt Designer构造UI界面的流程。在对话框中,您可以选择一个控件的信号,然后将其连接到另一个控件的槽。例如,您可以将按钮的点击信号连接到一个槽函数,以响应按钮的点击事件。右键单击窗口设计器中的空白区域,选择适当的布局管理器,如水平布局、垂直布局或网格布局。在Qt Designer中,您可以使用各种预定义的UI控件来设计应用程序的界面。现在,您可以在应用程序的源代码中使用生成的UI界面。在您的源文件中,包含相应的头文件,然后创建一个UI界面的实例。

cl6789的博客 1394

原生js封装轮播图

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

yh604005215的博客 4444

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

怎么用原生js写轮播图

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

攻城狮-张小白的博客 2513

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

用原生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、付费专栏及课程。

余额充值