一、所用到的知识点

1.DOM操作

2.定时器

3.事件运用

4.Js动画

5.函数递归

6.无限滚动大法

二、结构和样式

<div id="banner" class="banner">
    <ul id="list-banner" class="list-banner fn-clear" style="left:-624px;">  
            <li><a href="#"><img src="data:images/banner4.jpg" width="624" height="200" alt="" title="" /></a></li>
            <li><a href="#"><img src="data:images/banner1.jpg" width="624" height="200" alt="" title="" /></a></li>
            <li><a href="#"><img src="data:images/banner2.jpg" width="624" height="200" alt="" title="" /></a></li>
            <li><a href="#"><img src="data:images/banner3.jpg" width="624" height="200" alt="" title="" /></a></li>
            <li><a href="#"><img src="data:images/banner4.jpg" width="624" height="200" alt="" title="" /></a></li>
            <li><a href="#"><img src="data:images/banner1.jpg" width="624" height="200" alt="" title="" /></a></li>
    </ul>
    <div class="list-num-wp">
        <div id="list-num" class="list-num fn-clear">
            <a href="#" class="hover"></a>
            <a href="#"></a>
            <a href="#"></a>
            <a href="#"></a>
        </div>
    </div>
    <div class="left">
        <a id="left" href="#"></a>
    </div>
    <div class="right">
        <a id="right" href="#"></a>
    </div>
</div>

.banner{position:relative;width:624px;height:200px;overflow:hidden;}
.banner .list-banner{position:absolute;width:5000px;}
.banner .list-banner li{float:left;width:624px;height:200px;}
.banner .list-num-wp{position:absolute;bottom:7px;width:624px;height:11px;}
.banner .list-num{width:100px;margin:0 auto;}
.banner .list-num a{display:inline;float:left;width:11px;height:11px;margin:0 7px; background:url(../images/list-num.png) no-repeat;}
.banner .list-num a:hover{background:url(../images/list-num-hover.png));}
.banner .list-num a.hover{background:url(../images/list-num-hover.png);}
.banner .left a{display:block;position:absolute;width:49px;height:49px;top:75px;left:4px;background:url(../images/arrow.gif) 0 0;filter: Alpha(opacity=50);-moz-opacity:.5;opacity:0.5;}
.banner .right a{display:block;position:absolute;width:49px;height:49px;top:75px;right:4px;background:url(../images/arrow.gif) 0 -49px;filter: Alpha(opacity=50);-moz-opacity:.5;opacity:0.5;}

三、脚本思路

1.先左右按钮功能

window.onload=function(){
    var prev=document.getElementById("left");
    var next=document.getElementById("right");
    var list_banner=document.getElementById("list-banner");
    next.onclick=function(){
        list_banner.style.left=parseInt(list_banner.style.left)-624+'px';    //注:html上的ul要加行间样式left:0;,否则这里动不起来
    }
    prev.onclick=function(){
        list_banner.style.left=parseInt(list_banner.style.left)+624+'px';    
    }
}

2.左右按钮点击的两句话很像,封装成函数

function animate(offset){
        list_banner.style.left=parseInt(list_banner.style.left)+offset+'px';
    }
    next.onclick=function(){
        animate(-624);
    }
    prev.onclick=function(){
        animate(624);
    }

3.无限滚动

①假图的做法

即图片为412341,小于最后一张位置的时候,回到第一张的位置,大于  第一张位置的时候,拉到最后一张的位置

function animate(offset){
    var newLeft=parseInt(list_banner.style.left)+offset;
    list_banner.style.left=newLeft+'px';
    if(newLeft<-2496){
        list_banner.style.left=-624+"px";
    }
    if(newLeft>-624){
        list_banner.style.left=-2496+"px";
    }
}

4.小圆点跟着左右按钮切换

var index=1;
function showDot(){
    for(var i=0;i<list_num.length;i++){
        list_num[i].className="";
    }
    list_num[index-1].className="hover";
}
next.onclick=function(){
    animate(-624);
    index++;
    if(index>4){
        index=1;
    }
    showDot();
}
prev.onclick=function(){
    animate(624);
    index--;
    if(index<1){
        index=4;
    }
    showDot();
}

5.点击小圆点图片滚动及小圆点切换

for(var i=0;i<list_num.length;i++){
    list_num[i].onclick=function(){
        if(this.className=="hover"){
            return;
        }
        var myIndex=parseInt(this.getAttribute("index"));
        var offset=-624*(myIndex-index);
        index=myIndex;
        animate(offset);
        showDot();
    }
}

①点自己的时候不执行下列代码

②<div class="list-num-wp">
        <div id="list-num" class="list-num fn-clear">
            <a index="1" href="#" class="hover"></a>
            <a index="2" href="#"></a>
            <a index="3" href="#"></a>
            <a index="4" href="#"></a>
        </div>
    </div>

关键是要取到点击的是第几张图片,不能直接var myIndex=this.index;因为index是自定义属性,dom自带属性可以通过点来获取,自定义属性不行,.getAttribute()既可以获取自定义属性,又可以获取dom自带属性

③更新index值,index=myIndex;

6.动画函数(有一个渐变的运动过程)

function animate(offset){
        animated=true;
        var newLeft=parseInt(list_banner.style.left)+offset;
        var time=300;          //位移总时间
        var interval=30;       //位移间隔时间
        var speed=offset/(time/interval);       //每次移动距离
        speed=speed>0?Math.ceil(speed):Math.floor(speed);        //可能存在小数,取整
        function go(){
            if((speed < 0 && parseInt(list_banner.style.left)>newLeft)||(speed>0&&parseInt(list_banner.style.left)<newLeft)){      //newLeft目标值
                list_banner.style.left=parseInt(list_banner.style.left)+speed+'px';
                setTimeout(go,interval);   //不止做一次运动(go函数),每隔30毫秒前进一下
            }
            else{
                animated=false;
                list_banner.style.left=newLeft+'px';
                if(newLeft<-2496){
                    list_banner.style.left=-624+"px";
                }
                if(newLeft>-624){
                    list_banner.style.left=-2496+"px";
                }
            }
        }
        go();
    }
    next.onclick=function(){
        if(!animated){
            index++;
        }
        if(index>4){
            index=1;
        }
        showDot();
        if(!animated){
            animate(-624);
        }
    }
    prev.onclick=function(){
        if(!animated){
            index--;
        }
        if(index<1){
            index=4;
        }
        showDot();
        if(!animated){
            animate(624);
        }
    }
    
    for(var i=0;i<list_num.length;i++){
        list_num[i].onclick=function(){
            if(this.className=="hover"){
                return;
            }
            var myIndex=parseInt(this.getAttribute("index"));
            var offset=-624*(myIndex-index);
            index=myIndex;
            showDot();
            if(!animated){
                animate(offset);
            }
        }
    }

①一个函数不停地在一个条件后调用自身,这种做法就叫做递归,这里通过递归可以实现animate这个函数的动画效果

②不停点就意味着不停调用animate函数,可能会造成卡顿,图片乱刷,需要优化,引进变量animated

7.自动播放

function autoplay(){
        timer=setInterval(function(){
            next.onclick();
        },1000)
    }
    function stopautoplay(){
        clearInterval(timer);
    }

banner.onmouseover=stopautoplay;
    banner.onmouseout=autoplay;
    autoplay();

setTimeout只执行一次,之前一直执行,是因为递归

setInterval是每隔多少时间

8.假图的优化

实际运用中,图片肯定是按顺序存放,所以假图最好通过js来生成,而不是本身写在html上

var img_first=list_banner.getElementsByTagName("li")[0];
    var img_last=list_banner.getElementsByTagName("li")[3];
    list_banner.appendChild(img_first.cloneNode(true));
    list_banner.insertBefore(img_last.cloneNode(true),list_banner.getElementsByTagName("li")[0]);

appendChild是将新的节点添加到目标的最后一个子节点之后

insertBefore是将新的节点添加到已存在的子节点之前

cloneNode方法,true表示深克隆,false表示浅克隆,深克隆是将标签和标签里的内容都复制过来,而浅克隆不复制内容

[Js]焦点图轮播效果的更多相关文章

  1. JS、JQ实现焦点图轮播效果

    JS实现焦点图轮播效果 效果图: 代码如下,复制即可使用: (不过里面的图片路径需要自己改成自己的图片路径,否则是没有图片显示的哦) <!DOCTYPE html> <html> ...

  2. JS实现焦点图轮播效果

    大家平时逛淘宝网的时候,在首页就能看到焦点图轮播的效果,就是这个样子的: PS:想起每每打开淘宝,总会被这个玩意先夺眼球,偶尔还去点进去溜溜,幸好我定力好,总能控制住自己的购买欲望,为自己不用剁手感到 ...

  3. [Jquery]焦点图轮播效果

    $(function(){    var $next=$(".right");    var $prev=$(".left");    var $list_nu ...

  4. jQuery制作焦点图(轮播图)

    焦点图(轮播图) 案例 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http:/ ...

  5. 原生JavaScript实现焦点图轮播

    不管是高校的网站还是电商的页面,焦点图的切换和轮播应该是一项不可或缺的应用.今天把焦点图轮播制作的技术要点做下笔记,以供日后查看. 一.结构层(HTML) 焦点图的HTML结构很简单,就是一个父容器( ...

  6. JavaScript基础 -- 焦点图轮播(转载)

    首先将HTML结构搭建好: <div id="container"> <div id="list" style="left: -60 ...

  7. 基于jQuery游戏网站焦点图轮播特效

    基于jQuery的一款游戏网站焦点图轮播特效.这是一款带进度条定时切换,带缩略图切换的jQuery网站焦点图代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <cente ...

  8. 用最简单的代码写出banner图轮播效果

    以下视频是由[赵一鸣随笔]博客提供的“用最简单的代码写出banner图轮播效果”. 查看全屏高清视频,请点击链接:http://www.zymseo.com/58.html

  9. html中使用JS实现图片轮播效果

    1.首先是效果图,要在网页中实现下图的轮播效果,有四张图片,每张图片有自己的标题,然后还有右下角的小方框,鼠标悬浮在小方框上,会切换到对应的图片中去. 2.先是HTML中的内容,最外层是轮播图整个的容 ...

随机推荐

  1. Spring读书笔记-----使用Spring容器(二)

    一.使用ApplicationContext 前面介绍了,我们一般不会使用BeanFactory实例作为Spring容器,而是使用ApplicationContext实例作为容器,它增强了BeanFa ...

  2. shiro-web整合

    1.所需要jar <!-- shiro核心包 --> <dependency> <groupId>org.apache.shiro</groupId> ...

  3. commons-logging日志系统

    日志的重要性是随着系统的膨胀而显现的,在一个庞大的系统中查错没有各种日志信息    是寸步难行的.所以在系统加入日志是必须的. 最原始的日志方式,就是在程序的适当地方添加System.out.prin ...

  4. Python学习笔记2—内置函数

    函数的使用 官方文档:https://docs.python.org/2/library/functions.html

  5. Python不同电脑之间传输文件实现类似scp功能不输密码

    SCP vs SFTP 通过paramiko还可以传输文件,如何通过paramiko在计算机之间传输文件,通过阅读官方文档,发现有如下两种方式: sftp = paramiko.SFTPClient. ...

  6. Android最佳性能实践(三)——高性能编码优化

    在前两篇文章当中,我们主要学习了Android内存方面的相关知识,包括如何合理地使用内存,以及当发生内存泄露时如何定位出问题的原因.那么关于内存的知识就讨论到这里,今天开始我们将学习一些性能编码优化的 ...

  7. Android网络编程系列 一 TCP/IP协议族之网际层

    这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 网际层包括:IP.ICMP.IGMP 以及处在网际层实际工作在链路层的 ARP 和 RARP等等协议. 1.IP协议 互联网 ...

  8. active developer path ("") does not exist

    pod update --verbose --no-repo-update 出现的错误. 解决:在终端中修改你的CommandLine Tools的位置: xcode-select -switch / ...

  9. iOS开发之 Xcode 6 创建一个Empty Application

    参考链接http://jingyan.baidu.com/article/2a138328bd73f2074b134f6d.html Xcode 6 正式版如何创建一个Empty Applicatio ...

  10. D3.js 饼状图的制作

    1.数据 有如下数据,需要可视化: var dataset = [ 30 , 10 , 43 , 55 , 13 ]; 这样的值是不能直接绘图的.例如绘制饼状图的一个部分,需要知道一段弧的起始角度和终 ...