手搓js轮播图_JavaScript进阶

手搓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样式根据自己的需求自行改动
图片大小根据自己的图片自行改动

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

执行npm的时候报权限问题的解决方案

我们在执行npm操作的过程中&#xff0c;会出现以下权限问题&#xff0c;解决方案: 管理员身份 运行cmd 切换目录到要执行命令的文件下 再进行npm操作即可

openGauss学习笔记-129 openGauss 数据库管理-参数设置-查看参数值

文章目录 openGauss学习笔记-129 openGauss 数据库管理-参数设置-查看参数值129.1 操作步骤129.2 示例 openGauss学习笔记-129 openGauss 数据库管理-参数设置-查看参数值 openGauss安装后&#xff0c;有一套默认的运行参数&#xff0c;为了使openGauss与业务的配合度更高&…

轿车5+1汽车变速器变速箱同步器操纵机构机械结构设计CAD汽车工程

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;汽车变速器 获取完整论文报告说明书工程源文件 变速器工程图 操纵机构3D图 一、机械式变速器的概述及其方案的确定 1.1 变速器的功用和要求 变速器的功用是根据汽车在不同的行驶条件下提出的要求&#xff0c;改变发动机…

【paddlepaddle】

安装paddlepaddle 报错 ImportError: /home/ubuntu/miniconda3/envs/paddle_gan/bin/../lib/libstdc.so.6: version GLIBCXX_3.4.30 not found (required by /home/ubuntu/miniconda3/envs/paddle_gan/lib/python3.8/site-packages/paddle/fluid/libpaddle.so) 替换 /home/ubu…

【日常总结】Swagger-ui 导入 showdoc (优雅升级Swagger 2 升至 3.0)

一、场景 环境&#xff1a; 二、存在问题 三、解决方案 四、实战 - Swagger 2 升至 3.0 &#xff08;Open API 3.0&#xff09; Stage 1&#xff1a;引入Maven依赖 Stage 2&#xff1a;Swagger 配置类 Stage 3&#xff1a;访问 Swagger 3.0 Stage 4&#xff1a;获取 js…

使用sonar对webgoat进行静态扫描

安装sonar并配置 docker安装sonarqube&#xff0c;sonarQube静态代码扫描 - Joson6350 - 博客园 (cnblogs.com) 对webgoat进行sonar扫描 扫描结果 bugs Change this condition so that it does not always evaluate to "false" 意思是这里的else if语句不会执行…

3.9-Dockerfile实战

这一节介绍怎么将python程序打包成一个image&#xff0c;然后运行为一个container。 首先&#xff0c;创建/home/python/目录 mkdir /home/python/ 然后创建app.py文件。 vim app.py app.py文件的内容如下&#xff1a; from flask import Flaskapp Flask(__name__)app.route(…

【Linux】 find命令使用

find find命令是一种通过条件匹配在指定目录下查找对应文件或者目录的工具。匹配的条件可以是文件名称、类型、大小、权限属性、时间戳等。find命令还可以配合相关命令对匹配到的文件作出后续处理。 语法 find [路径...] [表达式] [path...]为需要查找文件所指定的路径。如果…

linux 开发板以太网通过Ubuntu上外网方法

在开发板嵌入式设备&#xff0c;有一个mgbe网卡&#xff0c;用网线与连接soc的网卡&#xff0c;和外接网卡&#xff0c;将网卡usb接口插入电脑&#xff0c;选择接入到Ubuntu系统 在Ubuntu将能识别到这个外接网卡&#xff0c;这样就可以通过Ubuntu和soc通讯了&#xff0c; 如下…

澳洲的猫罐头怎么样呢?几款我自己亲自喂养过的优质猫罐头推荐

一款优质的猫罐头&#xff0c;必须满足三个要点&#xff1a;完整又均衡的营养配方、新鲜又优质的原料、以及科学可靠的生产工艺。 猫罐头的三个要素&#xff0c;一个都不能少。配方不均衡&#xff0c;营养就不足&#xff1b;原料不新鲜&#xff0c;生产出来的猫罐头就不优质&a…

composer切换全局镜像源的方法

composer 默认配置中的镜像地址为国外的&#xff0c;在下载一些依赖包的时候会感觉很慢。当然国内也有很多composer镜像地址的&#xff0c;比如阿里云&#xff0c;腾讯云等。下面的博文73so博客就和大家说说&#xff0c;如何将composer的默认镜像改为国内镜像源的方法。 compo…

JAVA项目测试----用户管理系统

一)项目简介: 用户管理系统是依据于前后端分离来实现的&#xff0c;是基于Spring SpringBoot Spring MVC&#xff0c;SpringAOP&#xff0c;MyBatis等框架来实现的一个用户管理网站&#xff0c;并且已经部署到了云服务器上, 目前的用户管理系统实现了超级管理员的注册功能&…

云工作流 CloudFlow 重磅发布,流程式开发让云上应用构建更简单

云布道师 为了让企业和开发者更快速、便捷地进行云上开发&#xff0c;阿里云重磅发布云工作流&#xff08;CloudFlow&#xff09;&#xff0c;它是一款强大的面向开发者的流程编排开发工具&#xff0c;全托管、高并发、高可用&#xff0c;帮助用户简化和自动化复杂的云上业务流…

【字符编码系列二】GB2312编码

说明 GB2312是第一个汉字编码国家标准 GB 2312 标准由中国国家标准总局 1980 年发布&#xff0c;GB 即国标&#xff0c;共收录 6763 个汉字&#xff0c;其中一级汉字 3755 个&#xff0c;二级汉字 3008 个。 GB 2312 的出现&#xff0c;基本满足了汉字的计算机处理需要&#x…

手机弱网测试工具:Charles

我们在测试app的时候&#xff0c;需要测试弱网情况下的一些场景&#xff0c;那么使用Charles如何设置弱网呢&#xff0c;请看以下步骤&#xff1a; 前提条件&#xff1a; 手机和电脑要在同一局域网内 Charles连接手机抓包 一、打开Charles&#xff0c;点击代理&#xff0c;…

Prometheus监控mysql nginx tomcat 黑盒监控

部署consul_exporter https://github.com/prometheus/consul_exporter/releases/download/v0.9.0/consul_exporter-0.9.0.linux-amd64.tar.gz 注册 ootubuntu20:~# cat consul_export.json rootubuntu20:~# cat consul_export.json {"services": [{"id"…

LR学习笔记——基本面板

文章目录 面板介绍色彩调整区域明暗调整区域纹理及质感色彩饱和 面板介绍 面板如上图所示 基本可分为几个板块&#xff1a;色彩、明暗、纹理及质感、色彩饱和 色彩调整区域 色温&#xff1a;由蓝色和黄色控制色调&#xff1a;由绿色和洋红控制 互补色&#xff1a;蓝色对黄色&…

Leetcode2938. 区分黑球与白球

Every day a Leetcode 题目来源&#xff1a;2938. 区分黑球与白球 解法1&#xff1a;贪心 把 ‘0’ 挪到相应的位置。 类似于冒泡排序的思想&#xff0c;把 ‘0’ 挪到相应的位置。 示例&#xff1a; 代码&#xff1a; /** lc appleetcode.cn id2938 langcpp** [2938] 区…

【CSH 入门基础 9 -- 输出 csh 脚本中每一句命令】

文章目录 输出csh脚本中每一句命令 输出csh脚本中每一句命令 在 csh 或 tcsh 脚本中&#xff0c;如果你想要输出脚本中的每一句执行&#xff0c;你可以在脚本的开头使用 -v&#xff08;verbose&#xff09;选项。这个选项会使得 shell 在执行命令前先打印出来。 要在脚本中使…