告别踩坑!jQuery轮播 fadeIn/fadeOut 闪屏,老版本兼容最优解

简介: 在使用jQuery 1.11.3时,轮播图快速切换易导致动画堆积,影响体验。通过在`fadeIn()`前添加`stop(true)`方法,可清除正在排队的动画,避免延迟播放,提升交互流畅度。

问题描述

如果你的项目中使用了老版本的jquery1.11.3,你一定会有这样的情况!

当我们快速在轮播图上面移动切换按钮的时候, 会等待队列中的动画执行完毕,这样就会导致很多动画压在队里中,即便是我们鼠标移开,不动,也会等待队列里面的动画执行完毕的等待情况, 破坏用户体验!

代码如下:

HTML结构

<div id="pic">
    <ul>
        <li class="show"><img src="img/1.jpg" alt=""/></li>
        <li><img src="img/2.jpg" alt=""/></li>
        <li><img src="img/3.jpg" alt=""/></li>
        <li><img src="img/4.jpg" alt=""/></li>
        <li><img src="img/5.jpg" alt=""/></li>
        <li><img src="img/6.jpg" alt=""/></li>
        <li><img src="img/7.jpg" alt=""/></li>
    </ul>
    <ol>
        <li class="now"></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ol>
    <a href="javascript:;" id="prev"></a> <a href="javascript:;" id="next"></a> 
</div>

CSS样式

* {
   
    padding: 0px;
    margin: 0px;
}
ul, ol {
   
    list-style: none;
}
a {
   
    text-decoration: none;
}

img{
   

}

#pic, #pic>ul, #pic>ul>li {
   
    width: 590px;
    height: 470px;
}

#pic {
   
    border: 1px solid #ccc;
    margin: 350px auto;
    position: relative;
}


#pic>ul {
   
    position: absolute;
    top: 0px;
    left: 0px;
}

#pic>ul>li {
   
    position: absolute;
    top: 0px;
    left: 0px;
    display: none;
}

/*显示 类*/
#pic>ul>li.show {
   
    display: block;
}


#pic>ul>li>img{
   
    width: 590px;
    height: 470px;
}


#pic>ol {
   
    position: absolute;
    bottom: 10px;
    left: 100px;
    width: 200px;
    height: 20px;
    z-index: 2;
}
#pic>ol>li {
   
    width: 12px;
    height: 12px;
    border-radius: 50%;
    border: 1px solid #fee;
    display: inline-block;
    cursor:pointer;
    margin-left: 10px;
}


#pic>ol>li.now {
   
    background: #fff;
}
#pic>a {
   
    width: 50px;
    height: 50px;
    z-index: 3;
    display: block;
    position: absolute;
    cursor:pointer;
    top: 200px;
}
#pic>a#prev {
   
    left: 0;
    background: url(img/pref.png) no-repeat center;
}
#pic>a#next {
   
    right: 0;
    background: url(img/next.png) no-repeat center;
}

jquery代码

$(document).ready(function() {
   

    function common(){
   
        $("#pic ol li").eq(num).addClass("now").siblings().removeClass("now");
        $("#pic ul li").eq(num).fadeIn().siblings().fadeOut();
    }
    var num=0;
    var timer=null;

    $("#pic ol li").mouseover(function(){
   
        clearInterval(timer);
        var leng=$("#pic ol li").length;
        for(var i=0;i<leng;i++){
   
            num=$(this).index();
            common();
        }
    });
    function play(){
   
        clearInterval(timer);
        timer=setInterval(function(){
   
            num++;
            if(num==$("#pic ul li").length){
   
                num=0;
            }
            common();
        },1000)
    }
    play();
    $("#pic").hover(function(){
   
        clearInterval(timer);
    },function(){
   
        play();
    })
    $("#prev").click(function(){
   
        num--;
        if(num<0){
   
            num=$("#pic ul li").length;
        }
        common();
    })
    $("#next").click(function(){
   
        num++;
        if(num==$("#pic ul li").length){
   
            num=0;
        }
        common();
    })
});

效果如图

代码分析

看到问题了吧~

因为fadeIn()方法显示图片不是及时显示,当用户鼠标悬浮在切换按钮上迅速切换时,

上一张图片有可能在鼠标悬浮在下一个按钮上时再显示, 那么如果移动速度快了,就会出现这样的问题!

解决方案

这时候,我们可以在fadeIn()fadeout()方法前使用stop()方法来停止动画!

stop方法jquery中用于控制页面动画效果的方法, 运行之后立刻结束当前页面上的动画效果!

具体大家可以API参考文档说明

如图

文档上的描述为停止所有在指定元素上正在运行的动画

jquery1.11.3版本stop()方法有两个参数 : [clearQueue],[gotoEnd] 值为布尔值

参数1: 意思是是否清空动画序列,也就是stop的是当前元素的动画效果, 还是停止后面附带的所有动画效果!

设置false为跳过当前动画效果,执行下一个动画效果

设置true为停止所有动画效果!

根据我们这里场景需求,这里我们应该设置为true

参数2 否将当前动画效果执行到最后 , 也就是让当前正在执行的动画立即完成!!

根据我们这里的场景需求,可以不用设置, 如果你设置为true动画看起来非常生硬, 因为是动画执行之后的效果

所以正确修改之后的jquery代码如下

$(document).ready(function() {
   

    function common(){
   
      $("#pic ol li").eq(num).addClass("now").siblings().removeClass("now");
      $("#pic ul li").eq(num).stop(true).fadeIn().siblings().fadeOut();
    }
    var num=0;
    var timer=null;

    $("#pic ol li").mouseover(function(){
   
        clearInterval(timer);
        var leng=$("#pic ol li").length;
        for(var i=0;i<leng;i++){
   
           num=$(this).index();
           common();
        }
    });
    function play(){
   
       clearInterval(timer);
       timer=setInterval(function(){
   
       num++;
       if(num==$("#pic ul li").length){
   
          num=0;
       }
       common();
      },1000)
    }
    play();
    $("#pic").hover(function(){
   
     clearInterval(timer);
  },function(){
   
     play();
  })
    $("#prev").click(function(){
   
       num--;
       if(num<0){
   
         num=$("#pic ul li").length;
      }
      common();
    })
    $("#next").click(function(){
   
       num++;
       if(num==$("#pic ul li").length){
   
         num=0;
      }
      common();
    })
});

这里其实就给fadeIn前面加stop方法就可以了,fadeOut可以不加~

如图

这样我们快速移动切换的时候,就不会出现等待队列中的动画执行完的情况了~

相关文章
|
人工智能
阿里云语音AI这个appkey怎么找
阿里云语音AI这个appkey怎么找?
3184 1
|
2月前
|
Web App开发 Windows
【这玩意气死人了】如何关闭恶心的UC浏览器开机自动启动 解决方案在这里
UC浏览器或网盘开机自启令人困扰。可通过任务管理器“启动”选项卡禁用,或使用注册表编辑器删除`HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run`中含“UC”的项,彻底关闭自启动。
1106 8
【这玩意气死人了】如何关闭恶心的UC浏览器开机自动启动 解决方案在这里
|
2月前
|
Web App开发 安全
Chrome浏览器自动拦截某些下载内容 解决方案
Chrome下载文件常因安全机制被拦截。可通过设置允许不安全内容解决:在地址栏输入`chrome://settings/content/insecureContent`,添加`[*.]com`等域名,即可免手动确认下载。建议按需添加,兼顾安全与便利。(239字)
1077 3
Chrome浏览器自动拦截某些下载内容 解决方案
|
2月前
|
数据安全/隐私保护 iOS开发 网络架构
保姆级教程: 超强体验iPhone 隔空传送文件到Win11 设置共享文件夹就是这样简单轻松!
无需任何第三方软件, iPhone直接就能“隔空投送数据文件到”Windows系统
474 0
保姆级教程: 超强体验iPhone 隔空传送文件到Win11 设置共享文件夹就是这样简单轻松!
|
2月前
|
SQL 关系型数据库 MySQL
MySQL 复盘多表关联(1对1、1对多、多对多) 帮你打通任督二脉
本文详解数据库中1对1、1对多、多对多关系。通过用户与身份证、班级与学生、学生与课程等实例,结合SQL建表与查询语句,深入讲解外键、唯一约束、中间表等关键概念,帮助理解数据表间的关联机制及实际应用。
234 0
MySQL 复盘多表关联(1对1、1对多、多对多) 帮你打通任督二脉
|
4天前
|
人工智能 JavaScript 机器人
|
11月前
|
前端开发 JavaScript
新手博主狂喜!用SimpleMemory一键生成高逼格博客,访客量翻了5倍的秘密在这
`SimpleMemory Theme Extension` 是一款专为博客园设计的前端美化插件,基于 `SimpleMemory` 主题开发,功能强大且易用。使用前需在博客园后台开通 JS 权限,下载最新版插件(v2.1.4)后,按照步骤配置选项、皮肤和代码。将插件中的 CSS 代码粘贴至自定义样式,并添加基础配置脚本即可完成设置,实现美观的博客效果。更多高级参数将在后续教程中详解。
214 10
新手博主狂喜!用SimpleMemory一键生成高逼格博客,访客量翻了5倍的秘密在这
|
11月前
|
JavaScript 前端开发 容器
粘性定位Position:sticky已死?
粘性定位(`sticky`)是CSS3新增的一种定位方式,结合了相对定位(`relative`)和固定定位(`fixed`)的特点。当页面滚动时,元素在跨越特定阈值前表现为相对定位,之后则固定在指定位置。它常用于导航菜单等需要吸附效果的场景。 **特点:** - 需配合`top`、`right`、`bottom`或`left`属性使用。 - 相对于父元素定位,而非整个视窗(与`fixed`区别)。 - 兼容性:低版本浏览器可能不支持。 通过案例可见,`sticky`可简化以往需JS实现的效果,但实际应用需考虑浏览器兼容性问题。
340 6
粘性定位Position:sticky已死?
|
11月前
|
前端开发 JavaScript 开发者
这个被忽略的CSS:hover隐藏用法,让交互设计师都跪了
本文详细介绍了CSS中的伪类选择器`:hover`及其应用。`:hover`用于定义鼠标悬停在元素上时的样式,常见于超链接、按钮等交互场景。文章通过多个实例演示了`:hover`不仅可控制当前元素,还能影响其子元素或后代元素,但通常不适用于兄弟元素。此外,还分享了如何避免`:hover`导致的布局抖动问题,如提前设置透明边框。最后,结合实际案例展示了如何利用`:hover`实现复杂的交互效果,例如三级菜单,帮助开发者更好地掌握这一实用技巧。
678 1
这个被忽略的CSS:hover隐藏用法,让交互设计师都跪了

热门文章

最新文章