图片轮播:

  1. /*广告图片数组*/
  2. var imgs=[
  3. {"i":0,"img":"images/index/banner_01.jpg"},
  4. {"i":1,"img":"images/index/banner_02.jpg"},
  5. {"i":2,"img":"images/index/banner_03.jpg"},
  6. {"i":3,"img":"images/index/banner_04.jpg"},
  7. {"i":4,"img":"images/index/banner_05.jpg"},
  8. ];
  9. var slider={
  10. LIWIDTH:0,//保存每个li的宽度,其实就是#slider的宽
  11. DURATION:1000,//动画的总时间
  12. WAIT:3000,//自动轮播之间的等待时间
  13. timer:null,//保存一次性定时器序号
  14. canAuto:true,//保存是否可以自动轮播
  15. init:function(){
  16. this.LIWIDTH=parseFloat(
  17. $("#slider").css("width")
  18. );
  19. this.updateView();
  20. //为id为indexs的ul添加鼠标进入事件代理,只有不是hover的li才能响应事件
  21. $("#indexs").on("mouseover","li:not(.hover)",
  22. function(e){
  23. //获得目标元素$target
  24. var $target=$(e.target);
  25. //调用move方法,传入要移动的个数:
  26. //目标元素的内容-目标元素的兄弟中class为hover的li的内容
  27. this.move($target.html()
  28. -$target.siblings(".hover").html());
  29. }.bind(this));
  30. //当鼠标进入#slider时,将canAuto改为false
  31. //当鼠标移出#slider时,将canAuto改为true
  32. $("#slider").hover(
  33. function(){this.canAuto=false;}.bind(this),
  34. function(){this.canAuto=true;}.bind(this)
  35. )
  36. this.autoMove();
  37. },
  38. autoMove:function(){//启动自动轮播
  39. //启动一次性定时器:
  40. this.timer=setTimeout(
  41. function(){
  42. if(this.canAuto){
  43. this.move(1);//调用move执行移动一个
  44. }else{
  45. this.autoMove();//继续等待
  46. }
  47. }.bind(this),
  48. this.WAIT
  49. );
  50. },
  51. move:function(n){
  52. clearTimeout(this.timer);//停止一次性定时器
  53. this.timer=null;
  54. $("#imgs").stop(true);//停止动画,防止叠加
  55. if(n<0){//如果n<0,右移,先改数组,再移动
  56. n*=-1;//将n转为正数
  57. imgs=//先删除结尾的n个元素,拼接到开头
  58. imgs.splice(imgs.length-n,n).concat(imgs);
  59. this.updateView();//更新界面
  60. //获得#imgs当前的left,转为浮点数
  61. var left=parseFloat($("#imgs").css("left"));
  62. //修改#imgs的left为left-n*LIWIDTH
  63. $("#imgs").css("left",left-n*this.LIWIDTH);
  64. //启动动画,在DURATION时间内,left移动到0
  65. $("#imgs").animate(
  66. {left:"0"},
  67. this.DURATION,
  68. this.autoMove.bind(this)
  69. );
  70. }else{//否则, 左移,先移动,再改数组
  71. //让#imgs的ul再DURATION事件内,left变为-n*LIWIDTH
  72. $("#imgs").animate(
  73. {left:-n*this.LIWIDTH+"px"},
  74. this.DURATION,
  75. //在动画结束后调用endMove,替换this,传入参数n
  76. this.endMove.bind(this,n)
  77. );
  78. }
  79. },
  80. endMove:function(n){
  81. //删除imgs开头的n个元素,再拼到结尾
  82. imgs=imgs.concat(imgs.splice(0,n))
  83. this.updateView();//更新页面
  84. $("#imgs").css("left",0);//设置#imgs的left为0
  85. this.autoMove();//启动自动轮播
  86. },
  87. updateView:function(){//将数组中的元素更新到页面
  88. //遍历imgs数组中每个对象,同时声明空字符串html
  89. for(var i=0,html="",idxs="";i<imgs.length;i++){
  90. html+="<li><img src='"+imgs[i].img+"'></li>";
  91. idxs+="<li>"+(i+1)+"</li>";
  92. }
  93. //设置id为imgs的内容为html,再设置其宽为LIWIDTH*imgs的元素个数
  94. $("#imgs").html(html)
  95. .css("width",this.LIWIDTH*imgs.length);
  96. //设置id为indexs的内容为idxs
  97. $("#indexs").html(idxs);
  98. //获得#indexs下的和imgs中第一个元素的i属性对应的li,设置其class为hover,选择兄弟中的class为hover的li,清除其class
  99. $("#indexs>li:eq("+imgs[0].i+")")
  100. .addClass("hover")
  101. .siblings(".hover").removeClass("hover");
  102. }
  103. }
  104. slider.init();

电梯:

  1. var elevator={
  2. FHEIGHT:0,//保存楼层的高度
  3. //保存亮灯区域上下边界距文档显示区顶部距离
  4. UPLEVEL:0, DOWNLEVEL:0,
  5. DURATION:1000,//动画持续时间
  6. init:function(){
  7. this.FHEIGHT=//#f1的高+#f1的marginBottom
  8. parseFloat($("#f1").css("height"))+
  9. parseFloat($("#f1").css("marginBottom"));
  10. this.UPLEVEL=//(innerHeight-FHEIGHT)/2
  11. (innerHeight-this.FHEIGHT)/2
  12. this.DOWNLEVEL=//UPLEVEL+FHEIGHT
  13. this.UPLEVEL+this.FHEIGHT;
  14. //为document绑定scroll事件为scroll方法
  15. $(document).scroll(this.scroll.bind(this));
  16. //为#elevator下的ul添加mouseover事件代理,只有li才能响应事件
  17. $("#elevator>ul").on("mouseover","li",
  18. function(e){//target: li a
  19. var $target=$(e.target);//获得目标元素
  20. if(e.target.nodeName=="A"){//如果target是a
  21. $target=$target.parent();//换成其父元素li
  22. }
  23. //$target中显示第2个a,隐藏第1个a
  24. $target.children(":first").hide();
  25. $target.children(":last").show();
  26. }
  27. );
  28. //为#elevator下的ul添加mouseout事件代理,只有li响应事件
  29. $("#elevator>ul").on("mouseout","li",
  30. function(e){
  31. var $target=$(e.target);
  32. if(e.target.nodeName=="A"){//如果target是a
  33. $target=$target.parent();//就改为其父元素
  34. }
  35. //获得$target在ul下的下标
  36. var i=$target.index("#elevator>ul>li");
  37. //查找.floor下的header下的span取第i个
  38. var $span=$(".floor>header>span:eq("+i+")");
  39. //如果span的class没有hover
  40. if(!$span.hasClass("hover")){
  41. //$target中显示第1个a,隐藏第2个a
  42. $target.children(":first").show();
  43. $target.children(":last").hide();
  44. }
  45. }
  46. );
  47. //为#elevator下的ul添加click事件代理,只有li下class为etitle的a才能响应事件
  48. $("#elevator>ul").on("click","li>a.etitle",
  49. function(e){
  50. //停止body上的动画,清空队列
  51. $("body").stop(true);
  52. //获得目标元素的父元素$li
  53. var $li=$(e.target).parent();
  54. //获得$li在所有li中的下标i
  55. var i=$li.index("#elevator>ul>li");
  56. //查找.floor下的header下的span中第i个$span
  57. var $span=
  58. $(".floor>header>span:eq("+i+")");
  59. //启动动画,让body在DURATION时间内,滚动到$span距页面顶部的总距离-UPLEVEL
  60. $("body").animate(
  61. {scrollTop:
  62. $span.offset().top-this.UPLEVEL},
  63. this.DURATION
  64. );
  65. }.bind(this)
  66. );
  67. },
  68. scroll:function(){//响应document的scroll事件
  69. //查找.floor下的header下的span,对每个元素执行:
  70. $(".floor>header>span").each(function(i,elem){
  71. //function(i,elem){i: 下标, elem:当前DOM元素}
  72. //获取当前元素elem距页面顶部的总距离totalTop
  73. var totalTop=$(elem).offset().top;
  74. //获取body滚动过的距离scrollTop
  75. var scrollTop=$("body").scrollTop();
  76. //用totalTop-scrollTop,保存在innerTop
  77. var innerTop=totalTop-scrollTop;
  78. //如果innerTop>UPLEVEL且<=DOWNLEVEL
  79. if(innerTop>this.UPLEVEL
  80. &&innerTop<=this.DOWNLEVEL){
  81. //设置当前元素elem的class为hover
  82. $(elem).addClass("hover");
  83. //对应的li中显示第2个a,隐藏第1个a
  84. $("#elevator>ul>li:eq("+i+")>a:first")
  85. .hide();
  86. $("#elevator>ul>li:eq("+i+")>a:last")
  87. .show();
  88. }else{//否则,就移除当前元素elem的hover类
  89. $(elem).removeClass("hover");
  90. $("#elevator>ul>li:eq("+i+")>a:first")
  91. .show();
  92. $("#elevator>ul>li:eq("+i+")>a:last")
  93. .hide();
  94. }
  95. }.bind(this));
  96. //查找.floor下的header下的span中class为hover的,如果找到,就设置#elevator显示,否则就隐藏
  97. $(".floor>header>span.hover").length>0?
  98. $("#elevator").show():$("#elevator").hide();
  99. }
  100. }
  101. elevator.init();

放大镜:

  1. var zoom={
  2. moved:0,//保存左移的li个数
  3. WIDTH:62,//保存每个li的宽度
  4. OFFSET:20,//保存ul的起始left值
  5. MAX:3,//保存可左移的最多li个数
  6. MSIZE:175,//保存mask的大小
  7. MAXLEFT:175,MAXTOP:175,//保存mask可用的最大坐标
  8. init:function(){
  9. //为id为preview下的h1添加单击事件代理,仅a能响应事件,事件处理函数为move
  10. $("#preview>h1").on(
  11. "click","a",this.move.bind(this));
  12. //为id为icon_list的ul添加鼠标进入事件代理,仅li下的img可响应事件,处理函数为changeImgs
  13. $("#icon_list").on(
  14. "mouseover","li>img",this.changeImgs);
  15. //为id为superMask的div添加hover事件,切换mask的显示和隐藏,再绑定鼠标移动事件为moveMask
  16. $("#superMask").hover(this.toggle,this.toggle)
  17. .mousemove(
  18. this.moveMask.bind(this));
  19. },
  20. moveMask:function(e){
  21. var x=e.offsetX;//获得鼠标相对于父元素的x
  22. var y=e.offsetY;//获得鼠标相对于父元素的y
  23. //计算mask的left: x-MSIZE/2
  24. var left=x-this.MSIZE/2;
  25. //计算mask的top: y-MSIZE/2
  26. var top=y-this.MSIZE/2;
  27. //如果left越界,要改回边界值
  28. left=left<0?0:
  29. left>this.MAXLEFT?this.MAXLEFT:
  30. left;
  31. //如果top越界,要改回边界值
  32. top=top<0?0:
  33. top>this.MAXTOP?this.MAXTOP:
  34. top;
  35. //设置id为mask的元素的left为left,top为top
  36. $("#mask").css({left:left,top:top});
  37. //设置id为largeDiv的背景图片位置:
  38. $("#largeDiv").css(
  39. "backgroundPosition",
  40. -left*16/7+"px "+-top*16/7+"px");
  41. },
  42. toggle:function(){//切换mask的显示和隐藏
  43. $("#mask").toggle();
  44. $("#largeDiv").toggle();
  45. },
  46. move:function(e){//移动一次
  47. var $target=$(e.target);//获得目标元素$target
  48. var btnClass=$target.attr("class");
  49. //如果btnClass中没有disabled
  50. if(btnClass.indexOf("disabled")==-1){
  51. //如果btnClass以forward开头
  52. //将moved+1
  53. //否则
  54. //将moved-1
  55. this.moved+=
  56. btnClass.indexOf("forward")!=-1?1:-1;
  57. //设置id为icon_list的ul的left为-moved*WIDTH+OFFSET
  58. $("#icon_list").css(
  59. "left",-this.moved*this.WIDTH+this.OFFSET);
  60. this.checkA();//检查a的状态:
  61. }
  62. },
  63. checkA:function(){//检查两个a的状态
  64. //查找class属性以backward开头的a,保存在$back
  65. var $back=$("a[class^='backward']");
  66. //查找class属性以forward开头的a,保存在$for
  67. var $for=$("a[class^='forward']");
  68. if(this.moved==0){//如果moved等于0
  69. //设置$back的class为backward_disabled
  70. $back.attr("class","backward_disabled");
  71. }else if(this.moved==this.MAX){
  72. //否则,如果moved等于MAX
  73. //设置$for的class为forward_disabled
  74. $for.attr("class","forward_disabled");
  75. }else{//否则
  76. //$back的class为backward
  77. $back.attr("class","backward");
  78. //$for的class为forward
  79. $for.attr("class","forward");
  80. }
  81. },
  82. changeImgs:function(e){//根据小图片更换中图片
  83. //获得目标元素的src属性,保存在变量src中
  84. var src=$(e.target).attr("src");
  85. //查找src中最后一个.的位置i
  86. var i=src.lastIndexOf(".");
  87. //设置id为mImg的元素的src为:
  88. //src从开头-i 拼上-m 拼上src从i到结尾
  89. $("#mImg").attr(
  90. "src",src.slice(0,i)+"-m"+src.slice(i));
  91. $("#largeDiv").css(
  92. "backgroundImage",
  93. "url("+src.slice(0,i)+"-l"+src.slice(i)+")"
  94. );
  95. }
  96. }
  97. zoom.init();

(O)编写可维护的代码示例(原创)的更多相关文章

  1. 一步步教你编写不可维护的 PHP 代码

    译者注:这是一篇很棒文章,使用有趣的叙述方式,从反面讲解了作为一个优秀的 PHP 工程师,有哪些事情是你不能做的.请注意哦,此篇文章罗列的行为,都是你要尽量避免的. 随着失业率越来越高,很多人意识到保 ...

  2. 如何使用 require.js ,实现js文件的异步加载,避免网页失去响应,管理模块之间的依赖性,便于代码的编写和维护。

    一.为什么要用require.js? 最早的时候,所有Javascript代码都写在一个文件里面,只要加载这一个文件就够了.后来,代码越来越多,一个文件不够了,必须分成多个文件,依次加载.下面的网页代 ...

  3. 《代码不朽:编写可维护软件的10大要则(C#版)》读后感

    本书作者Joost Visser,译者张若飞.本书讲解了编写可维护代码的10个要则,从目录就可以看出这10点分别是: 编写短小的代码单元(15行以内,在大部分情况下还是能实现的,但是当我们使用Linq ...

  4. 如何编写可维护的面向对象JavaScript代码

    能够写出可维护的面向对象JavaScript代 码不仅可以节约金钱,还能让你很受欢迎.不信?有可能你自己或者其他什么人有一天会回来重用你的代码.如果能尽量让这个经历不那么痛苦,就可以节省不少时 间.地 ...

  5. 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  6. 第3章1节《MonkeyRunner源码剖析》脚本编写示例: MonkeyRunner API使用示例(原创)

    天地会珠海分舵注:本来这一系列是准备出一本书的,详情请见早前博文“寻求合作伙伴编写<深入理解 MonkeyRunner>书籍“.但因为诸多原因,没有如愿.所以这里把草稿分享出来,所以错误在 ...

  7. 编写可维护的JavaScript代码(部分)

    平时使用的时VS来进行代码的书写,VS会自动的将代码格式化,所有写了这么久的JS代码,也没有注意到这些点.看了<编写可维护的javascript代码>之后,做了些笔记. var resul ...

  8. 深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点

    深入理解JavaScript系列(1):编写高质量JavaScript代码的基本要点 2011-12-28 23:00 by 汤姆大叔, 139489 阅读, 119 评论, 收藏, 编辑 才华横溢的 ...

  9. 编写可维护的CSS

    在参与规模庞大.历时漫长且参与人数众多的项目时,所有开发者遵守如下规则极为重要: 保持 CSS 便于维护 保持代码清晰易懂 保持代码的可拓展性 为了实现这一目标,我们要采用诸多方法. 本文档第一部分将 ...

随机推荐

  1. 十分钟搞定pandas

    转至:http://www.cnblogs.com/chaosimple/p/4153083.html 本文是对pandas官方网站上<10 Minutes to pandas>的一个简单 ...

  2. tomcat修改上下文path

    server.xml <Host name="localhost" appBase="webapps" unpackWARs="true&quo ...

  3. 03_java基础(九)之综合练习与考核评估

    25.综合练习之车站业务分析 完成步骤: 需求: 以车站业务对车票做增删改查操作 1.建立数据库 2.建立车票表 3.建立java项目结构(model\dao\service\test) 4.创建mo ...

  4. eclipce连接数据库增删改查

    1.在mysql中新建一个名为course的数据库,并在其中新建一个course数据表,包含四个字段,id,name,teacher,classname如图(注意:将id设为自动递增,否则后面新增会出 ...

  5. VSC KeyNote

    [VSC KeyNote] 1.前后跳转. Alt + LeftArrow, Alt + RightArrow 2.缩进问题. vsc默认缩进为4,但js代码里缩进依旧是2. 因为vscode默认启用 ...

  6. Java Timer

    Java Timer 定时类,主要用来执行定时任务 Timer管理所有要执行的定时任务 TimerTask封装好的定时任务 常见的用法 MyTask myTask = new MyTask(); Ti ...

  7. JMeter学习(十五)JMeter测试Java(转载)

    转载自 http://www.cnblogs.com/yangxia-test 目的:对Java程序进行测试 目录 一.核心步骤 二.实例 三.JMeter Java Sampler介绍 四.自带Ja ...

  8. document.all 在各浏览器中的支持不同

    转载:https://blog.csdn.net/fengweifree/article/details/16862495 感谢 all 方法最初是由 IE 浏览器拥有的,并不属于 W3C 规范范畴, ...

  9. OpenSessionInViewFilter 的配置及作用(原文地址: http://blog.csdn.net/sunsea08/article/details/4545186)

    spring为我们解决hibernate的Session的关闭与开启问题. Hibernate 允许对关联对象.属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Sessio ...

  10. NAT和Proxy的区别

    在internet共享上网技术上,一般有两种方式,一种是proxy代理型,一种是NAT网关型,关于两者的区别与原理,身边很多人都不是很明白,下面我来讲讲我的理解,如有不对的,欢迎指正. 1.先说应用例 ...