图片轮播:

/*广告图片数组*/
var imgs=[
{"i":0,"img":"images/index/banner_01.jpg"},
{"i":1,"img":"images/index/banner_02.jpg"},
{"i":2,"img":"images/index/banner_03.jpg"},
{"i":3,"img":"images/index/banner_04.jpg"},
{"i":4,"img":"images/index/banner_05.jpg"},
];
var slider={
LIWIDTH:0,//保存每个li的宽度,其实就是#slider的宽
DURATION:1000,//动画的总时间
WAIT:3000,//自动轮播之间的等待时间
timer:null,//保存一次性定时器序号
canAuto:true,//保存是否可以自动轮播
init:function(){
this.LIWIDTH=parseFloat(
$("#slider").css("width")
);
this.updateView();
//为id为indexs的ul添加鼠标进入事件代理,只有不是hover的li才能响应事件
$("#indexs").on("mouseover","li:not(.hover)",
function(e){
//获得目标元素$target
var $target=$(e.target);
//调用move方法,传入要移动的个数:
//目标元素的内容-目标元素的兄弟中class为hover的li的内容
this.move($target.html()
-$target.siblings(".hover").html());
}.bind(this));
//当鼠标进入#slider时,将canAuto改为false
//当鼠标移出#slider时,将canAuto改为true
$("#slider").hover(
function(){this.canAuto=false;}.bind(this),
function(){this.canAuto=true;}.bind(this)
)
this.autoMove();
},
autoMove:function(){//启动自动轮播
//启动一次性定时器:
this.timer=setTimeout(
function(){
if(this.canAuto){
this.move(1);//调用move执行移动一个
}else{
this.autoMove();//继续等待
}
}.bind(this),
this.WAIT
);
},
move:function(n){
clearTimeout(this.timer);//停止一次性定时器
this.timer=null;
$("#imgs").stop(true);//停止动画,防止叠加
if(n<0){//如果n<0,右移,先改数组,再移动
n*=-1;//将n转为正数
imgs=//先删除结尾的n个元素,拼接到开头
imgs.splice(imgs.length-n,n).concat(imgs);
this.updateView();//更新界面
//获得#imgs当前的left,转为浮点数
var left=parseFloat($("#imgs").css("left"));
//修改#imgs的left为left-n*LIWIDTH
$("#imgs").css("left",left-n*this.LIWIDTH);
//启动动画,在DURATION时间内,left移动到0
$("#imgs").animate(
{left:"0"},
this.DURATION,
this.autoMove.bind(this)
);
}else{//否则, 左移,先移动,再改数组
//让#imgs的ul再DURATION事件内,left变为-n*LIWIDTH
$("#imgs").animate(
{left:-n*this.LIWIDTH+"px"},
this.DURATION,
//在动画结束后调用endMove,替换this,传入参数n
this.endMove.bind(this,n)
);
}
},
endMove:function(n){
//删除imgs开头的n个元素,再拼到结尾
imgs=imgs.concat(imgs.splice(0,n))
this.updateView();//更新页面
$("#imgs").css("left",0);//设置#imgs的left为0
this.autoMove();//启动自动轮播
},
updateView:function(){//将数组中的元素更新到页面
//遍历imgs数组中每个对象,同时声明空字符串html
for(var i=0,html="",idxs="";i<imgs.length;i++){
html+="<li><img src='"+imgs[i].img+"'></li>";
idxs+="<li>"+(i+1)+"</li>";
}
//设置id为imgs的内容为html,再设置其宽为LIWIDTH*imgs的元素个数
$("#imgs").html(html)
.css("width",this.LIWIDTH*imgs.length);
//设置id为indexs的内容为idxs
$("#indexs").html(idxs);
//获得#indexs下的和imgs中第一个元素的i属性对应的li,设置其class为hover,选择兄弟中的class为hover的li,清除其class
$("#indexs>li:eq("+imgs[0].i+")")
.addClass("hover")
.siblings(".hover").removeClass("hover");
}
}
slider.init();

电梯:

var elevator={
FHEIGHT:0,//保存楼层的高度
//保存亮灯区域上下边界距文档显示区顶部距离
UPLEVEL:0, DOWNLEVEL:0,
DURATION:1000,//动画持续时间
init:function(){
this.FHEIGHT=//#f1的高+#f1的marginBottom
parseFloat($("#f1").css("height"))+
parseFloat($("#f1").css("marginBottom"));
this.UPLEVEL=//(innerHeight-FHEIGHT)/2
(innerHeight-this.FHEIGHT)/2
this.DOWNLEVEL=//UPLEVEL+FHEIGHT
this.UPLEVEL+this.FHEIGHT;
//为document绑定scroll事件为scroll方法
$(document).scroll(this.scroll.bind(this));
//为#elevator下的ul添加mouseover事件代理,只有li才能响应事件
$("#elevator>ul").on("mouseover","li",
function(e){//target: li a
var $target=$(e.target);//获得目标元素
if(e.target.nodeName=="A"){//如果target是a
$target=$target.parent();//换成其父元素li
}
//$target中显示第2个a,隐藏第1个a
$target.children(":first").hide();
$target.children(":last").show();
}
);
//为#elevator下的ul添加mouseout事件代理,只有li响应事件
$("#elevator>ul").on("mouseout","li",
function(e){
var $target=$(e.target);
if(e.target.nodeName=="A"){//如果target是a
$target=$target.parent();//就改为其父元素
}
//获得$target在ul下的下标
var i=$target.index("#elevator>ul>li");
//查找.floor下的header下的span取第i个
var $span=$(".floor>header>span:eq("+i+")");
//如果span的class没有hover
if(!$span.hasClass("hover")){
//$target中显示第1个a,隐藏第2个a
$target.children(":first").show();
$target.children(":last").hide();
}
}
);
//为#elevator下的ul添加click事件代理,只有li下class为etitle的a才能响应事件
$("#elevator>ul").on("click","li>a.etitle",
function(e){
//停止body上的动画,清空队列
$("body").stop(true);
//获得目标元素的父元素$li
var $li=$(e.target).parent();
//获得$li在所有li中的下标i
var i=$li.index("#elevator>ul>li");
//查找.floor下的header下的span中第i个$span
var $span=
$(".floor>header>span:eq("+i+")");
//启动动画,让body在DURATION时间内,滚动到$span距页面顶部的总距离-UPLEVEL
$("body").animate(
{scrollTop:
$span.offset().top-this.UPLEVEL},
this.DURATION
);
}.bind(this)
);
},
scroll:function(){//响应document的scroll事件
//查找.floor下的header下的span,对每个元素执行:
$(".floor>header>span").each(function(i,elem){
//function(i,elem){i: 下标, elem:当前DOM元素}
//获取当前元素elem距页面顶部的总距离totalTop
var totalTop=$(elem).offset().top;
//获取body滚动过的距离scrollTop
var scrollTop=$("body").scrollTop();
//用totalTop-scrollTop,保存在innerTop
var innerTop=totalTop-scrollTop;
//如果innerTop>UPLEVEL且<=DOWNLEVEL
if(innerTop>this.UPLEVEL
&&innerTop<=this.DOWNLEVEL){
//设置当前元素elem的class为hover
$(elem).addClass("hover");
//对应的li中显示第2个a,隐藏第1个a
$("#elevator>ul>li:eq("+i+")>a:first")
.hide();
$("#elevator>ul>li:eq("+i+")>a:last")
.show();
}else{//否则,就移除当前元素elem的hover类
$(elem).removeClass("hover");
$("#elevator>ul>li:eq("+i+")>a:first")
.show();
$("#elevator>ul>li:eq("+i+")>a:last")
.hide();
}
}.bind(this));
//查找.floor下的header下的span中class为hover的,如果找到,就设置#elevator显示,否则就隐藏
$(".floor>header>span.hover").length>0?
$("#elevator").show():$("#elevator").hide();
}
}
elevator.init();

放大镜:

var zoom={
moved:0,//保存左移的li个数
WIDTH:62,//保存每个li的宽度
OFFSET:20,//保存ul的起始left值
MAX:3,//保存可左移的最多li个数
MSIZE:175,//保存mask的大小
MAXLEFT:175,MAXTOP:175,//保存mask可用的最大坐标
init:function(){
//为id为preview下的h1添加单击事件代理,仅a能响应事件,事件处理函数为move
$("#preview>h1").on(
"click","a",this.move.bind(this));
//为id为icon_list的ul添加鼠标进入事件代理,仅li下的img可响应事件,处理函数为changeImgs
$("#icon_list").on(
"mouseover","li>img",this.changeImgs);
//为id为superMask的div添加hover事件,切换mask的显示和隐藏,再绑定鼠标移动事件为moveMask
$("#superMask").hover(this.toggle,this.toggle)
.mousemove(
this.moveMask.bind(this));
},
moveMask:function(e){
var x=e.offsetX;//获得鼠标相对于父元素的x
var y=e.offsetY;//获得鼠标相对于父元素的y
//计算mask的left: x-MSIZE/2
var left=x-this.MSIZE/2;
//计算mask的top: y-MSIZE/2
var top=y-this.MSIZE/2;
//如果left越界,要改回边界值
left=left<0?0:
left>this.MAXLEFT?this.MAXLEFT:
left;
//如果top越界,要改回边界值
top=top<0?0:
top>this.MAXTOP?this.MAXTOP:
top;
//设置id为mask的元素的left为left,top为top
$("#mask").css({left:left,top:top});
//设置id为largeDiv的背景图片位置:
$("#largeDiv").css(
"backgroundPosition",
-left*16/7+"px "+-top*16/7+"px");
},
toggle:function(){//切换mask的显示和隐藏
$("#mask").toggle();
$("#largeDiv").toggle();
},
move:function(e){//移动一次
var $target=$(e.target);//获得目标元素$target
var btnClass=$target.attr("class");
//如果btnClass中没有disabled
if(btnClass.indexOf("disabled")==-1){
//如果btnClass以forward开头
//将moved+1
//否则
//将moved-1
this.moved+=
btnClass.indexOf("forward")!=-1?1:-1;
//设置id为icon_list的ul的left为-moved*WIDTH+OFFSET
$("#icon_list").css(
"left",-this.moved*this.WIDTH+this.OFFSET);
this.checkA();//检查a的状态:
}
},
checkA:function(){//检查两个a的状态
//查找class属性以backward开头的a,保存在$back
var $back=$("a[class^='backward']");
//查找class属性以forward开头的a,保存在$for
var $for=$("a[class^='forward']");
if(this.moved==0){//如果moved等于0
//设置$back的class为backward_disabled
$back.attr("class","backward_disabled");
}else if(this.moved==this.MAX){
//否则,如果moved等于MAX
//设置$for的class为forward_disabled
$for.attr("class","forward_disabled");
}else{//否则
//$back的class为backward
$back.attr("class","backward");
//$for的class为forward
$for.attr("class","forward");
}
},
changeImgs:function(e){//根据小图片更换中图片
//获得目标元素的src属性,保存在变量src中
var src=$(e.target).attr("src");
//查找src中最后一个.的位置i
var i=src.lastIndexOf(".");
//设置id为mImg的元素的src为:
//src从开头-i 拼上-m 拼上src从i到结尾
$("#mImg").attr(
"src",src.slice(0,i)+"-m"+src.slice(i));
$("#largeDiv").css(
"backgroundImage",
"url("+src.slice(0,i)+"-l"+src.slice(i)+")"
);
}
}
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. Zabbix监控系统配置

    1.Zabbix是一个基于WEB界面的提供分布式系统监控的企业级的开源解决方案 Zabbix能监视各种网络参数,保证服务器系统的安全稳定的运行,并提供灵活的通知机制以让SA快速定位并解决存在的各种问题 ...

  2. hdu3826-Squarefree number-(欧拉筛+唯一分解定理)

    Squarefree number Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  3. BOS物流项目第十三天

    教学计划 1.Quartz概述 a. Quartz介绍和下载 b. 入门案例 c. Quartz执行流程 d. cron表达式 2.在BOS项目中使用Quartz创建定时任务 3.在BOS项目中使用J ...

  4. centos 7.4安装教程

    1. 2. 3. 4. 5. 6. 7. 8.

  5. JVM G1GC参数配置

    https://www.oracle.com/technetwork/articles/java/g1gc-1984535.html         主要这两个参数需要设置下,ParallelGCTh ...

  6. php请求php

    function post2($url, $data){//file_get_content $postdata = http_build_query( $data ); $opts = array( ...

  7. 2017面向对象程序设计(Java) 第4周学习指导及要求(2017.9.14-2017.9.18)

    学习目标 深入理解程序设计中算法与程序的关系: 深入理解java程序设计中类与对象的关系: 理解OO程序设计的第一个特征:封装: 需要掌握基本使用方法的预定义类有:Math类.String类.Arra ...

  8. sql根据最小值去重

    CREATE TABLE temp2 AS SELECT MAX(id) id FROM sys_oper_procenter GROUP BY pro_title 创建一个temp2的表 根据标题分 ...

  9. python学习day6 for循环 字符串的内置方法

    1.for循环 和while相比 l=[1,2,3] i=0 while i <len(l) print(l[i]) i+=1 l=['a','b','c'] for item in l: pr ...

  10. linux 升级python2.7

    linux为centos6,系统默认安装了python2.6,需要执行的python脚本内容包含标准库之xml.etree.ElementTree  用到库里的一个iter方法是python2.7的新 ...