(原)原生js封装的焦点图(幻灯片)效果一

最近想对网站上比较常用的效果都用原生的代码做一个整理和封装,前一阵做了个弹出层,那么就接着热炒热卖,今天刚好还在中秋放假期间,就顺便按照以前常用的思路,写了个焦点图播放效果。

  恩,说到焦点图,网上可是一搜一大堆,基本上随便打开一个网站首页,百分之八九十都能看到类似的效果,不管是轮播的,淡入淡出的,或是其他更为复杂的效果....

淘宝首页上轮播banner

163.com上一个版块的类似效果腾讯上的一个效果

不管外表长什么样子,只要轮播的过渡效果一样,那就是同一种算法,以淘宝上的轮播效果为例,下面跟就是刚写的仿淘宝的焦点图效果:(图片都是刚从taobao上抓下来的)

  • 1
  • 2
  • 3
  • 4
  • 5

上一个 下一个

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Slider</title> <script type="text/javascript"><!-- var Hongru = {}, H$ = function(id){return document.getElementById(id)}, H$$ = function(c,p){return p.getElementsByTagName(c)} Hongru.slider = function(){ return{ init:function(id,options){ var ul = this.u = H$$('ul',H$(id))[0], li = H$$('li',ul); this.l=li.length; this.index = 0; if(options.navId&&options.curClass){this.nav = H$$('li',H$(options.navId)), this.c = options.curClass;} this.a=options.auto||0; this.v=options.vertical||0;H$(id).style.overflow = 'hidden';H$(id).style.position = 'relative';ul.style.position='absolute'; if(this.v){ul.style.top=0; this.h=options.height||li[0].offsetHeight; ul.style.height=(this.l*this.h)+'px';} else{ul.style.left=0; this.w=options.width||li[0].offsetWidth; ul.style.width=(this.l*this.w)+'px';} this.pos(options.index||0,this.a?1:0); }, pos:function(pos,a){ clearInterval(this.u.posAnim); clearInterval(this.u.auto); var curPos=this.v?parseInt(this.u.style.top):parseInt(this.u.style.left), correctPos=this.v?pos*this.h:pos*this.w, direction = correctPos>Math.abs(curPos)?1:-1; correctPos*=-1; this.index = pos; if(this.nav){for(var i=0;i<this.l;i++){this.nav[i].className = i==pos?this.c:''}} this.u.posAnim = setInterval(function(){Hongru.slider.anim(correctPos,direction,a)},10); }, anim:function(des,dir,a){ var curPos=this.v?parseInt(this.u.style.top):parseInt(this.u.style.left); if(curPos == des){ clearInterval(this.u.posAnim); if(a||this.a){Hongru.slider.auto()} } else{ var v=curPos-Math.ceil(Math.abs(des-curPos)*.07)*dir+'px'; this.v?this.u.style.top=v:this.u.style.left=v; } }, auto:function(){ this.u.auto=setInterval(function(){Hongru.slider.move(1,1)},this.a*1000) }, move:function(n,a){ var num=this.index+n, i=n==1?num==this.l?0:num:num<0?this.l-1:num; Hongru.slider.pos(i,a); } }; }(); // --></script> <mce:style type="text/css"><!-- *{margin:0;padding:0} ul,li{list-style:none} li{height:150px;width:470px;float:left} #nav li.nav{background:#ffb442;} #nav li{border:1px solid #f47500; color:#d94b01; background:#fff;font-size:12px; height:15px;width:15px;float:left;margin-left:4px;display:inline;text-align:center} --></mce:style><style type="text/css" _mce_bogus="1"><!-- *{margin:0;padding:0} ul,li{list-style:none} li{height:150px;width:470px;float:left} #nav li.nav{background:#ffb442;} #nav li{border:1px solid #f47500; color:#d94b01; background:#fff;font-size:12px; height:15px;width:15px;float:left;margin-left:4px;display:inline;text-align:center} --></style> </head> <body> <div id="slider" style="overflow:hidden;width:470px;height:150px;position:relative" _mce_style="overflow: hidden; width: 470px; height: 150px; position: relative;"> <ul style="width:470px;height:150px" _mce_style="width: 470px; height: 150px;"> <li><img alt="" src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_1.jpg" _mce_src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_1.jpg" /></li> <li><img alt="" src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_2.jpg" _mce_src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_2.jpg" /></li> <li><img alt="" src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_3.jpg" _mce_src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_3.jpg" /></li> <li><img alt="" src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_4.jpg" _mce_src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_4.jpg" /></li> <li><img alt="" src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_5.jpg" _mce_src="http://images.cnblogs.com/cnblogs_com/hongru/262693/o_5.jpg" /></li> </ul> <ul id="nav" style="position:absolute;bottom:5px;right:5px;" _mce_style="position: absolute; bottom: 5px; right: 5px;"> <li οnmοuseοver="setTimeout(function(){Hongru.slider.pos(0)},300)">1</li> <li οnmοuseοver="setTimeout(function(){Hongru.slider.pos(1)},300)">2</li> <li οnmοuseοver="setTimeout(function(){Hongru.slider.pos(2)},300)">3</li> <li οnmοuseοver="setTimeout(function(){Hongru.slider.pos(3)},300)">4</li> <li οnmοuseοver="setTimeout(function(){Hongru.slider.pos(4)},300)">5</li> </ul> </div> <script type="text/javascript"><!-- Hongru.slider.init('slider',{ auto:3, vertical:1, navId:'nav', curClass:'nav', index:0}); // --></script> </body> </html>

恩恩,看了例子,下面函数调用的几个参数,引入js后,调用Hongru.slider.init(id, options)即可,参数id为要滚动的ul列表的父标签id,options为一个对象,可选参数有auto(自动滚动时间间隔秒数,为0时表示不自动滚动),vertical(true时垂直滚动,false横向滚动),navId(控制器的ul标签id),curClass(当前状态下控制器样式类名),index(表示初始化时从第几个开始,默认为0,表示从第一个开始),如下:

Hongru.slider.init('slider',{	
	auto:3,
	vertical:1,
	navId:'nav',
	curClass:'nav',
	index:0});

另需要注意的一点,滚动内容和控制器都需要放在ul无序列表里。。。。

下面附上js源码:

 

var Hongru = {}, H$ = function(id){return document.getElementById(id)}, H$$ = function(c,p){return p.getElementsByTagName(c)}
Hongru.slider = function(){
	return{
		init:function(id,options){
			var ul = this.u = H$$('ul',H$(id))[0], li = H$$('li',ul); this.l=li.length; this.index = 0;
			if(options.navId&&options.curClass){this.nav = H$$('li',H$(options.navId)), this.c = options.curClass;}
			this.a=options.auto||0; this.v=options.vertical||0;H$(id).style.overflow = 'hidden';H$(id).style.position = 'relative';ul.style.position='absolute';
			if(this.v){ul.style.top=0; this.h=options.height||li[0].offsetHeight; ul.style.height=(this.l*this.h)+'px';}
			else{ul.style.left=0; this.w=options.width||li[0].offsetWidth; ul.style.width=(this.l*this.w)+'px';}
			this.pos(options.index||0,this.a?1:0);
		},
		
		pos:function(pos,a){
			clearInterval(this.u.posAnim); clearInterval(this.u.auto);
			var curPos=this.v?parseInt(this.u.style.top):parseInt(this.u.style.left),
			correctPos=this.v?pos*this.h:pos*this.w, 
			direction = correctPos>Math.abs(curPos)?1:-1;
			correctPos*=-1; 
			this.index = pos;
			if(this.nav){for(var i=0;i<this.l;i++){this.nav[i].className = i==pos?this.c:''}}
			this.u.posAnim = setInterval(function(){Hongru.slider.anim(correctPos,direction,a)},10);
		},
		
		anim:function(des,dir,a){
			var curPos=this.v?parseInt(this.u.style.top):parseInt(this.u.style.left);
			if(curPos == des){
				clearInterval(this.u.posAnim);
				if(a||this.a){Hongru.slider.auto()}
			}
			else{
				var v=curPos-Math.ceil(Math.abs(des-curPos)*.07)*dir+'px';
				this.v?this.u.style.top=v:this.u.style.left=v;
			}
		},
		
		auto:function(){
			this.u.auto=setInterval(function(){Hongru.slider.move(1,1)},this.a*1000)
		},
		
		move:function(n,a){
			var num=this.index+n, i=n==1?num==this.l?0:num:num<0?this.l-1:num; Hongru.slider.pos(i,a);
		}
	};
}();

 

最后还是提供源文件打包下载,感兴趣的同学可以下来看看,后面可能还会做淡入淡出或者其他过渡效果的焦点图。

您可以点击这里下载

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值