图片轮播:

/*广告图片数组*/
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. ajax-》post

    1:最近写完前端,又写后端,jQuery的ajax已经用烂了,事实证明的确好用,再分享一下. data是后台echo的值,可以是数字,也可以是数组,用json_encode()包裹数组形式,前端接收要 ...

  2. 分享一个 Java String split 快速分割的方法

    java中string.split() 方法比较强大,但是split()方法采用正则表达式,速度相对会慢一点, 其实大多数场景下并不需要使用正则表达式,下面分享一个不使用正则表达式分隔字符串的方法. ...

  3. js 中的原型prototype

    每次创建新函数,就会根据规则为该函数创建一个 prototype 属性,该属性是一个指向函数原型对象的指针.并且原型对象都默认拥有一个 constructor 属性,该属性是一个指向那个新建函数的指针 ...

  4. Linq to sql 之 事务

    描述:linq 是自带事物的.如果建了两个linq to sql 类,各自访问不同的数据库,事物如何保证呢. 验证:采用常用的COM+事务来验证一下是否有效. ServiceConfig config ...

  5. spark快速开发之scala基础之2控制流程

    判断结构 大体与java相当.scala没有三元表达式. val num = if(1>0) 1 else 0 //相当于匿名函数 println(num) var num2 = 0 if(1& ...

  6. 基于正则表达式用requests下载网页中的图片

    在慕课网看了正则表达式和requests的课程后,为了加深学习记忆,决定简单记录. 实现步骤: 1.先打开你要下载的网页,查看源码找出图片位置 2.编写正则匹配图片url 3.保存图片到本地 图文步骤 ...

  7. 牛客练习赛19 E和F(签到就走系列)托米的饮料+托米搭积木

    E题传送门:点我 F题传送门:点我 可爱的小托米得到了n瓶饮料. 但他不小心把开盖的工具弄丢了,所以他只能利用饮料瓶来开盖. 已知第i个瓶子的品牌为ai,且其能打开bi品牌的瓶子. 问有几瓶饮料托米无 ...

  8. unity缓动插件DOTween Pro v0.9.680

    DoTween Pro是一款unity插件,是unity中最好用的tween插件,比起Dotween的免费版要多很多功能,实现脚本和视觉脚本的新功能,支持包括移动,淡出,颜色,旋转,缩放,打孔,摇动, ...

  9. vue-webpack项目本地开发环境设置代理解决跨域问题

    前言: 一般跨域问题只要后端配置好的话,是不需要前端做处理的,但也不能保证你遇到的所有后端都能很好的处理这个问题,这个时候可能就需要前端设置代理解决这个问题了. 配置方法: 1. config/ind ...

  10. AngularJs中url参数的获取

    前言: angular获取通过链接形式访问的页面,要获取url中的参数,就不能通过路由的方式传递获取了,使用原生js或者jquery,又显得比较麻烦,好在angular已经封装了获取url参数的方法, ...