使用纯html和JavaScript实现焦点轮播图特效,本来之前用setInterval()函数写的一个简单的循环轮播图,但是出现了两个问题:
 
1. 当网页被切换时,也就是网页失去焦点时,计时器函数还在进行,但是图片轮播特效没有执行,当网页被切回来,重新获得焦点时,轮播图就会将之前累积的动画缓存一次性执行。结果轮播图就以飞快的速度进行循环,然后就是空白页面,整个轮播图区域的顺序完全混乱。
 
2. 当快速点击next或pre按钮时,当前图片的动画还没完成就开始下一张图片的动画,轮播图的速度和顺序也会完全混乱,最后变成空白页面。
 
为了解决这两个问题我在网上搜了许多相关的资料,有人提到用window.onblur()和window.onfocus()来控制当网页失去焦点时清除计时器,网页重新获得焦点再声明一个新的计时器。但是可能是我写的代码问题吧,如果这样写的话原先设置的鼠标移入移出事件就不起作用了,点击按钮时图片的切换会和轮播图的自动切换产生冲突。
 
然后继续在网上找有没有解决办法,后来看到其他人用setTimeOut()函数写的轮播图效果,于是重新写了一下代码部分,并且加入一个判断当前图片切换动画是否完成的变量,让轮播图只有当前一个动画完成时才能触发后一张图片的切换动画。加入这个判断条件后,网页失去焦点时也不会有动画累计了,就算网页切换也不会产生顺序混乱的问题。
 
具体代码如下:
 var pic=document.getElementById("pic1");
var next=document.getElementById("next");
var pre=document.getElementById("pre");
var ad = document.getElementById("ad1");
var cirBtns=ad.getElementsByTagName("span"); var index=1;
var animated=false; pre.onclick=function () {
if (index===1){
index=3;
} else{
index-=1;
}
if (!animated){
animate(1000);
}
showBtns();
} next.onclick=function () {
if (index===3){
index=1;
} else{
index+=1;
}
if (!animated){
animate(-1000);
}
showBtns();
} function animate(offset) {
animated=true;
var newLeft=pic.offsetLeft+offset;
var time=300;
var interval=5;
var speed=offset/(time/interval); function go() {
if((speed<0 && pic.offsetLeft>newLeft)||(speed>0 && pic.offsetLeft<newLeft)){
pic.style.left=pic.offsetLeft+speed+"px";
setTimeout(go,interval);
} else {
animated=false;
pic.style.left=newLeft+"px";
if (newLeft <= -4000) {
pic.style.left = "-1000px";
} else if (newLeft >= 0) {
pic.style.left = "-3000px"
}
}
}
go();
} function showBtns() {
for(var i=0;i<cirBtns.length;i++){
var button=cirBtns[i];
if(button.className === "on"){
button.className="";
break;
}
}
cirBtns[index-1].className="on";
} for(var i=0;i<cirBtns.length;i++){
var button=cirBtns[i];
button.onclick=function () {
if(this.className==="on"){
return;
}
var myIndex=parseInt(this.getAttribute("index"));
var offset=-1000*(myIndex-index);
if(!animated){
animate(offset);
}
index=myIndex;
showBtns();
}
} var autoTimer;
function autoPlay() {
autoTimer=setInterval(function () { next.onclick(); },3000);
}
function autoStop() { clearInterval(autoTimer); }
ad.onmouseover=autoStop;
ad.onmouseout=autoPlay; autoPlay();

【20190123】JavaScript-轮播图特效中出现的问题的更多相关文章

  1. 【JavaScript】固定布局轮播图特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. 2、原生js实现轮播图特效

    很多很多网站经常会用到一个特效,那就是轮播图,对于日新月异的前端技术来说其实就是一个框架一个接口的事,但轮播的原理是什么?用最原始的javascript来写又是怎样的呢?本人是一枚菜鸟,这篇文章就当做 ...

  3. 练习:javascript轮播图效果

    javascript轮播自动播放切换滑过停止,上一页/下一页 <!DOCTYPE html> <html lang="en"> <head> & ...

  4. 【jQuery】百分比自适应屏幕轮播图特效

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. JavaScript 轮播图

    这是我自己做的一个轮播图,大家可以看看 ,我还没进行优化.有改进的地方可以私聊 布局什么的你们自己搞定吧 <div class="slider" id="circl ...

  6. JavaScript轮播图

    需求: 鼠标移动到下标页码时,也转换到相对应的图片: 多张图片可以自动轮播: 鼠标移动至图片时,停止自动轮播: 可以手动左右调节: <!DOCTYPE html> <html lan ...

  7. JS实现轮播图特效(带二级导航)

    按照国际惯例先放效果图 index.html <!DOCTYPE html> <html lang="en"> <head> <meta ...

  8. 超详细的原生JavaScript轮播图(幻灯片)的制作

    本次轮播图的制作主要分为3个部分,分别是:设置定时器自动轮播:点击左右切换按钮轮播:下方点击按钮轮播.具体实现步骤如下: (效果图) html部分代码如下: <div class="s ...

  9. jQuery插件slides实现无缝轮播图特效

    初始化插件: slides是一款基于jQuery无缝轮播图插件,支持图内元素动画,可以自定义动画类型 1 2 3 4 5 6 7 8 9 10 $(".slideInner").s ...

随机推荐

  1. SVM理解

    https://blog.csdn.net/feilong_csdn/article/details/62427148

  2. 9.indicate、xutils、json

    json数据  页签详情页数据   public class TabData { public int retcode; public TabDetail data;//不是数组的话类型就是这个 pu ...

  3. Redis集群环境使用的是redis4.0.x的版本,在用java客户端jedisCluster启动集群做数据处理时报java.lang.NumberFormatException: For input string: "7003@17003"问题解决

    java.lang.NumberFormatException: For input string: "7003@17003" at java.lang.NumberFormatE ...

  4. 第九节:详细讲解Java中的泛型,多线程,网络编程

    前言 大家好,给大家带来详细讲解Java中的泛型,多线程,网络编程的概述,希望你们喜欢 泛型 泛型格式:ArrayList list= new ArrayList(); ArrayList list= ...

  5. [CocoaPods]入门

    什么是CocoaPods? CocoaPods管理Xcode项目的库依赖项. 项目的依赖项在名为Podfile的单个文本文件中指定.CocoaPods将解析库之间的依赖关系,获取生成的源代码,然后在X ...

  6. Swift5 语言指南(五) 基本运算符

    一个运营商是一个特殊的符号,或者你使用来检查,更改或合并值的短语.例如,加法运算符(+)添加两个数字,如,和逻辑AND运算符()组合两个布尔值,如.let i = 1 + 2&&if  ...

  7. java相关技术问答(二)

    String为什么是final的 首先是为了安全性,final表示不可变,不可被继承,不能修改其方法保证安全 在多线程环境下,final类型的String保证线程安全 String支持字符串常量池,相 ...

  8. vscode 编辑器常用快捷键

    最近,打算换个编辑器,而 vscode 是一个不错的选择.大部分快捷键和 sublime 还是很像的,但有些也不一样.特此整理一份小笔记. 参考: vscode: Visual Studio Code ...

  9. PHP之高性能I/O框架:Libevent(三)

    Swoole Swoole里也提供了一些直接操作底层epoll/kqueue事件循环的接口,可将其他扩展创建的socket.PHP代码中stream/socket扩展创建的socket等加入到Swoo ...

  10. Docker 本地导入镜像/保存镜像/载入镜像/删除镜像

    1.Docker导入本地镜像 有时候我们自己在本地或者其它小伙伴电脑上拷贝了一份镜像,有了这个镜像之后,我们可以把本地的镜像导入,使用docker import 命令. 例如这里下载了一个 aliba ...