手搓js轮播图_JavaScript进阶

news2024/11/16 13:47:49

手搓js轮播图

  • 逻辑解析
    • html结构
    • 图片切换方法
    • 圆点导航切换效果
    • 左右箭头点击切换
    • 圆点导航点击切换
    • 自动播放,介入暂停
  • 完整代码

逻辑解析

css的样式我就不再进行讲述,如果有需求可以评论区告诉我,我再出一篇文章进行详细讲解

js轮播图最主要的核心逻辑就是在于如何进行切换和自动切换播放(虽然听起来像废话,但是)
请添加图片描述
请添加图片描述


那么接下来步入正题
请添加图片描述


html结构

这里以五张300px的图片为例,你可能会疑惑为什么放了六张?
因为最后第五张到头之后切换回第一张的时候,我门要在第五张后面放一张第一张的图片。
目的防止切换效果突兀,看起来像是循环连续的,而不是跨查(拟声词)直接奔回第一张

<body>
    <div class="lunbo-outer">
        <ul id="lunbolist">
            <li><img src="./img/A1.jpg" alt="" title="1"></li>
            <li><img src="./img/A2.jpg" alt="" title="2"></li>
            <li><img src="./img/A3.jpg" alt="" title="3"></li>
            <li><img src="./img/A4.jpg" alt="" title="4"></li>
            <li><img src="./img/A5.jpg" alt="" title="5"></li>
            <li><img src="./img/A1.jpg" alt="" title="6"></li>
        </ul>

        <div class="lunbodian">
            <span title="1"></span><span title="2"></span><span title="3"></span><span title="4"></span><span title="5"></span>
        </div>
        <p class="zuoqie"><</p>
        <p class="youqie">></p>
    </div>
</body>

实际结构就像下面的图片,就好比你从你家窗户向外看行驶的火车(先假设你家旁边有条火车轨道),你通过窗户之能看到一节一节的火车车厢在切换,而不是整条火车。
在这里插入图片描述

图片切换方法

先获取相应的文档节点,这里要清楚DOM对应的html结构,不然后面的逻辑处理会有点绕

var lunboOuter = document.querySelector('.lunbo-outer');
var lunbolist = document.getElementById('lunbolist');
var zuoqie = document.querySelector('.zuoqie');
var youqie = document.querySelector('.youqie');
var lunbodianspan = document.querySelector('.lunbodian').children;
var spanindex=0;

然后就是js方法,具体含义直接看代码注释

		//图片向右切换效果函数
		function move(){
			//1500是5张300px的图片,负值是因为火车向前走,它的left是负值
            if(lunbolist.offsetLeft<=-1500){ 
                lunbolist.style.left='0px';  
            }
            //根据list的left属性值得知现在播放的是第几张
            var afterleft=lunbolist.offsetLeft;
            if (afterleft/-300>=4) {
            	//>=4表示现在是播放的第五张,下一张就是第一张
            	//spanmove()方法是切换图片下方的导航点,第一个点索引是0
                spanmove(0);
            }else{
            	//否则切换下一个点
                spanmove(afterleft/-300+1);
            }
            //利用定时器制作切换动画,每10毫秒移动4个像素
            var timer=setInterval(function(){
                lunbolist.style.left = lunbolist.offsetLeft-4 + 'px';
                
                //如果切换到位了,就停止
                if(afterleft-lunbolist.offsetLeft>=300){
                    clearInterval(timer);
                }
            },10)
        }
        
        //图片向左切换效果函数同理
        function unmove(){
            if(lunbolist.offsetLeft>=0){
                lunbolist.style.left='-1500px';
            }
            var afterleft=lunbolist.offsetLeft;
            if (afterleft/-300<=0) {
                spanmove(4);
            }else{
                spanmove(afterleft/-300-1);
            }
            var timer=setInterval(function(){
                lunbolist.style.left = lunbolist.offsetLeft+4 + 'px';
                
                if(afterleft-lunbolist.offsetLeft<=-300){
                    clearInterval(timer);
                   
                }
            },10)
            
        }

圆点导航切换效果

这里用的方法是先一致后特殊,先让它们都一个颜色,然后判断该谁了就让谁特殊色

        //小圆点切换效果
        function spanmove(index){
            for (let i = 0; i < lunbodianspan.length; i++) {
            	//这里的颜色与css保持一致
                lunbodianspan[i].style.backgroundColor = 'rgba(43, 43, 43, 0.4)';
            }
            lunbodianspan[index].style.backgroundColor = 'white';
        }

左右箭头点击切换

为了使得切换有序,这里增加一个限制条件,只能在切换到位完成的情况下才可以切换,否则在切换动画过程中不可以进行切换操作

        //点击左右箭头切换效果
        youqie.onclick=function(){
            if(lunbolist.offsetLeft%300==0){
                move();
            }
            
        }
        zuoqie.onclick=function(){
            if(lunbolist.offsetLeft%300==0){
                unmove();
            }
            
        }

圆点导航点击切换

点第几个点播放第几张图片

        //为小圆点绑定点击切换效果
        for(let i=0;i<lunbodianspan.length;i++){
            
            lunbodianspan[i].onclick=function(){
                lunbolist.style.left=-i*300+'px';
                spanmove(i);
            }
        }

自动播放,介入暂停

鼠标移入的时候大概率表示用户有要操作播放的“嫌疑”,所以暂定自动播放,把操作权给用户,当用户把鼠标移走的时候再开始自动播放。

        //自动轮播效果
        var timerone=setInterval(move,2200);
        lunboOuter.onmouseenter=function(){
            clearInterval(timerone);
        }
        lunboOuter.onmouseleave=function(){
            timerone=setInterval(move,2200);
        }

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轮播模板</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        li{
            list-style: none;
        }
        .lunbo-outer{
            width: 300px;
            height: 300px;
            overflow: hidden;
            margin: 100px auto;
            position: relative;
        }
        #lunbolist{
            width: 1800px;
            height: 300px;
            display: flex;
            position: absolute;
        }
        #lunbolist li{
            width: 300px;
            height: 300px;
        }
        #lunbolist li img{
            width: 100%;
            height: 100%;
        }
        .lunbodian{
            position: absolute;
            bottom: 10px;
            right: calc(50% - 50px);
        }
        .lunbodian span{
            display: inline-block;
            width: 10px;
            height: 10px;
            background-color: rgba(43, 43, 43, 0.4);
            border-radius: 50%;
            margin: 0 4px
        }
        .lunbodian span:nth-child(1){
            background-color: rgb(255, 255, 255);
        }
        .lunbodian span:hover{
            background-color: rgb(255, 255, 255);
        }
        .zuoqie, .youqie{
            width: 20px;
            height: 50px;
            background-color: rgba(22, 22, 22, 0.6);
            position: absolute;
            line-height: 50px;
            text-align: center;
            cursor: pointer;
            color: white;
        }
        .zuoqie:hover, .youqie:hover{
            background-color: darkgray;
        }
        .zuoqie{
            top: 135px;
        }
        .youqie{
            top: 135px;
            right: 0;
        }
    </style>
</head>
<body>
    <div class="lunbo-outer">
        <ul id="lunbolist">
            <li><img src="./img/A1.jpg" alt="" title="1"></li>
            <li><img src="./img/A2.jpg" alt="" title="2"></li>
            <li><img src="./img/A3.jpg" alt="" title="3"></li>
            <li><img src="./img/A4.jpg" alt="" title="4"></li>
            <li><img src="./img/A5.jpg" alt="" title="5"></li>
            <li><img src="./img/A1.jpg" alt="" title="6"></li>
        </ul>

        <div class="lunbodian">
            <span title="1"></span><span title="2"></span><span title="3"></span><span title="4"></span><span title="5"></span>
        </div>
        <p class="zuoqie"><</p>
        <p class="youqie">></p>
    </div>
    <script>
        var lunboOuter = document.querySelector('.lunbo-outer');
        var lunbolist = document.getElementById('lunbolist');
        var zuoqie = document.querySelector('.zuoqie');
        var youqie = document.querySelector('.youqie');
        var lunbodianspan = document.querySelector('.lunbodian').children;
        var spanindex=0;


        //图片向右切换效果函数
        function move(){
            if(lunbolist.offsetLeft<=-1500){
                lunbolist.style.left='0px';
            }
            var afterleft=lunbolist.offsetLeft;
            if (afterleft/-300>=4) {
                spanmove(0);
            }else{
                spanmove(afterleft/-300+1);
            }
            var timer=setInterval(function(){
                lunbolist.style.left = lunbolist.offsetLeft-4 + 'px';
                
                if(afterleft-lunbolist.offsetLeft>=300){
                    clearInterval(timer);
                }
            },10)
        }
        //图片向左切换效果函数
        function unmove(){
            if(lunbolist.offsetLeft>=0){
                lunbolist.style.left='-1500px';
            }
            var afterleft=lunbolist.offsetLeft;
            if (afterleft/-300<=0) {
                spanmove(4);
            }else{
                spanmove(afterleft/-300-1);
            }
            var timer=setInterval(function(){
                lunbolist.style.left = lunbolist.offsetLeft+4 + 'px';
                
                if(afterleft-lunbolist.offsetLeft<=-300){
                    clearInterval(timer);
                    
                }
            },10)
            
        }
        //小圆点切换效果
        function spanmove(index){
            for (let i = 0; i < lunbodianspan.length; i++) {
                lunbodianspan[i].style.backgroundColor = 'rgba(43, 43, 43, 0.4)';
            }
            // console.log(index);
            lunbodianspan[index].style.backgroundColor = 'white';
        }
        //点击左右箭头切换效果
        youqie.onclick=function(){
            if(lunbolist.offsetLeft%300==0){
                move();
            }
            
        }
        zuoqie.onclick=function(){
            if(lunbolist.offsetLeft%300==0){
                unmove();
            }
            
        }
        //为小圆点绑定点击切换效果
        for(let i=0;i<lunbodianspan.length;i++){
            // console.log(i);
            lunbodianspan[i].onclick=function(){
                
                lunbolist.style.left=-i*300+'px';
                
                spanmove(i);
            }
        }
        //自动轮播效果
        var timerone=setInterval(move,2200);
        lunboOuter.onmouseenter=function(){
            // console.log(1);
            clearInterval(timerone);
        }
        lunboOuter.onmouseleave=function(){
            // console.log(2);
            timerone=setInterval(move,2200);
        }
    </script>
</body>
</html>

Tips:
css样式根据自己的需求自行改动
图片大小根据自己的图片自行改动

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

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

相关文章

java算法学习索引之字符串问题

一 判断两个字符串是否互为变形词 【题目】给定两个字符串str1和str2&#xff0c;如果str1和str2中出现的字符种类一样且每种字符出现的次数也一样&#xff0c;那么str1与str2互为变形词。请实现函数判断两个字符串是否互为变形词。 public boolean isDeformation(String str1…

SPSS快速聚类

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

React结合antd5实现整个表格编辑

通过react hooks 结合antd的table实现整个表格新增编辑。 引入组件依赖 import React, { useState } from react; import { Table, InputNumber, Button, Space, Input } from antd;定义数据 const originData [{ key: 1, name: 白银会员, value: 0, equity: 0, reward: 0…

全球首款容器计算产品重磅发布,激活上云用云新范式

云布道师 10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;阿里云云原生应用平台负责人丁宇宣布&#xff0c;阿里云容器计算服务 ACS 正式发布&#xff01;ACS 将大幅降低企业和开发者用云门槛&#xff0c;真正将 Serverless 理念大规模落地。 容器计算服务 ACS&#xff0c…

零代码编程:用ChatGPT将SRT字幕文件批量转为Word文本文档

一个文件夹中有多个srt视频字幕文件&#xff0c;srt文件里面有很多时间轴&#xff1a; 现在想将其批量转为word文档&#xff0c;去掉里面与字符无关的时间轴&#xff0c;在ChatGPT中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个批量将SRT字幕文件转为…

jbase仪器接口设计

jbase的计划有借助虚拟M来实现连仪器&#xff0c;之前陆续写了些TCP逻辑&#xff0c;今天终于整理完成了仪器设计。首先用java的cs程序测试TCP的服务和客户端。 javafx的示例加强 package sample;import javafx.application.Application; import javafx.event.EventHandler; …

如何给shopify motion主题的产品系列添加description

一、Description是什么 Description是一种HTML标签类型&#xff0c;通过指定Description的内容&#xff0c;可以帮助搜索引擎以及用户更好的理解当前网页包含的主要了内容。 二、Description有什么作用 1、基本作用&#xff0c;对于网站和网页做一个简单的说明。 2、吸引点击&…

部署单仓库多目录项目

部署单仓库多目录项目 文章目录 部署单仓库多目录项目1.部署单仓库多目录项目2.Shell脚本进行部署单仓库多目录项目2.1 编写Shell脚本2.2 Demo推送代码及测试 3.小结 1.部署单仓库多目录项目 #部署单仓库多目录项目 在开发过程中,研发团队往往会将一个大型项目拆分成几个子目录…

Python 安装win32com失败

今天进行服务器迁移&#xff0c; 中间有用的python调用win32com组件让docx转换成pdf。不出意外的话出意外了&#xff0c;pip安装win32com的时候各种安装不上&#xff0c; 今天处理完问题之后&#xff0c;记录一下&#xff0c;与人方便与己方便。 在cmd上面&#xff0c;一开始…

opencv-图像平滑

高斯平滑 高斯平滑即采用高斯卷积核对图像矩阵进行卷积操作。高斯卷积核是一个近似服从高斯分布的矩阵&#xff0c;随着距离中心点的距离增加&#xff0c;其值变小。这样进行平滑处理时&#xff0c;图像矩阵中锚点处像素值权重大&#xff0c;边缘处像素值权重小。 import cv2 …

C语言入门——第十七课

一、二分查询 1.概念 二分查询又被称为二分查找&#xff0c;是一种在有序数组或序列中快速查找到对应元素的一种方法。每次查找范围缩小至原来的一半。 ①前提条件 数组和列表必须有序&#xff0c;否则无法进行二分查找。 ②初始化 确定查找数组和列表的左边界&#xff0…

js ::after简单实战

::after的作用是在元素后面再加个XXX样式 工作中遇到了一个表格&#xff0c;鼠标指到单元格要有个整行编辑态的效果&#xff0c;下面写个简单的demo 有人可能会说了&#xff0c;直接修改某个单元格的hover样式不就行了嘛&#xff0c;问题是如果鼠标指到单元格和单元格直接的…

自己动手打包构建编译cri-dockerd

1.背景 本机是 armv7l架构cpu&#xff0c;发现官方文档中竟然没有&#xff0c;因此需要自己编译下&#xff1b; [rootcontainer0 ~]# uname -a Linux container0 5.4.206-v7l.1.el7 #1 SMP Mon Jul 25 14:13:29 UTC 2022 armv7l armv7l armv7l GNU/Linux2.打包/构建/编译 gi…

Linux—简介安装常用命令系统中软件安装项目部署

目录 1. 前言1.1 什么是Linux1.2 为什么要学Linux1.3 学完Linux能干什么 2. Linux简介2.1 主流操作系统2.2 Linux发展历史2.3 Linux系统版本 3. Linux安装3.1 安装方式介绍3.2 安装VMware3.3 安装Linux3.4 网卡设置3.5 安装SSH连接工具3.5.1 SSH连接工具介绍3.5.2 FinalShell安…

北醒携全球首款256线车规量产激光雷达亮相广州国际车展

11月17日&#xff0c;北醒携全球首款256线车规量产激光雷达亮相广州国际车展。在车展期间&#xff0c;北醒还公布了与广州花都区人民政府达成投资合作&#xff0c;获滴滴自动驾驶投资以及与捷普联合打造的全球首条量产256线级别车规激光雷达的生产线即将贯通的等多条利好信息&a…

如何提高图片转excel的效果?(软件选择篇)

在日常的工作中&#xff0c;我们常常会遇到一些财务报表类的图片需要转换成可编辑的excel&#xff0c;但是&#xff0c;受各种条件的限制&#xff0c;常常只能通过手工录入这种原始的方式来实现&#xff0c;随着人工智能、深度学习以及网络技术的发展&#xff0c;这种原始的录入…

【C++】泛型编程 ⑩ ( 类模板的运算符重载 - 函数实现 写在类外部的同一个 cpp 代码中 | 类模板 的 外部友元函数二次编译问题 )

文章目录 一、类模板 - 函数声明与函数实现分离1、类模板 外部 实现 构造函数2、类模板 外部 实现 普通函数3、类模板 外部 实现 友元函数( 1 ) 错误示例及分析 - 类模板 的 外部友元函数 二次编译 问题( 2 ) 正确写法 二、代码示例 - 函数声明与函数实现分离1、代码示例2、执行…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

logic-flow 使用过程中遇到的bug - 拖动节点到画布的时候,鼠标松开,节点不落在画布,仍旧跟着鼠标走

背景&#xff1a; 插件&#xff1a;logicFlow 用途&#xff1a;画流程图 bug表现&#xff1a; 初始化的样子&#xff1a; bug的样子&#xff1a; 拖动第一个节点的时候&#xff0c;一切正常&#xff08;无论哪个节点作为第一个节点&#xff0c;都是正常的&#xff0c;但是拖动…

C语言回文数(1106:回文数(函数专题))

题目描述 一个正整数&#xff0c;如果从左向 右读&#xff08;称之为正序数&#xff09;和从右向左读&#xff08;称之为倒序数&#xff09;是一样的&#xff0c;这样的数就叫回文数。输入两个整数m和n&#xff08;m<n)&#xff0c;输出区间[m&#xff0c;n]之间的回文数。 …