使用纯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. 《Opencv 3 计算机视觉 python语言实现》· 第二遍 —— 读后笔记

    概览 代码实战 https://github.com/xinghalo/ml-in-action/tree/master/book-opencv

  2. redis key的过期时间

    设置redis key的生存过期时间 Redis 有四个不同的命令可以用于设置键的生存时间(键可以存在多久)或过期时间(键什么时候会被删除) : EXPlRE 命令用于将键key 的生存时间设置为tt ...

  3. 第31节:Java基础-类与对象

    前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...

  4. 对于python setup.py install安装的包如何卸载

    easy_install 安装 卸载命令 easy_install -m package-name setup.py安装 帮助你纪录安装细节方便你卸载 python setup.py install ...

  5. centos6.6 安装adb环境

    a.安装JDK环境 centos linux JAVA(openjdk)软件包名 1.java-1.7.0-openjdk (OpenJDK Runtime Environment) 2.java-1 ...

  6. 通过清华大学镜像下载Android源码并编译源码

    之前看源码都是在Windows下用SourceInsight看,虽然达到了研究源码的效果,但终究还是有遗憾...趁着周末,准备在Ubuntu虚拟机上下载编译源码. 之前下源码时,有了解一些Androi ...

  7. MySQL 设计规范

    一.数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名 ...

  8. Shell脚本 | 健壮性测试之空指针检查

    通过 "adb shell am start" 遍历安卓应用所有的 Activity,可以检查是否存在空指针的情况. 以下为梳理后的测试流程: 通过 apktool 反编译 apk ...

  9. iOS开发(1):设置APP的图标与启动图 | iOS图标的尺寸 | LaunchScreen的使用

    每个APP都应该有自己的图标跟启动图. 这里介绍怎么设置iOS的APP的图标跟启动图. (1)图标 小程的xcode是10.0版本,设置图标的入口如下: 点击入口后,进到设置页面,如下: 可以看到有很 ...

  10. got & plt

    got plt类似与Windows PE文件中IAT(Import Address Table). 要使的代码地址无关,基本思想就是把与地址相关的部分放到数据段里面. ELF的做法是在数据段里面建立一 ...