焦点图的实现

前言

    前两篇博客写了自定义播放器和弹幕的实现,这次说点常用的技术,那就是焦点图的实现。当然网上有很多优秀的焦点图模板可以借鉴(我才不会说我也是借鉴来的),但万变不离宗,我们不仅要懂得怎么运用模板,还要看懂代码,写一个真正属于自己的效果。

分析
    下载一个网上找的模板,直接贴上代码和效果图,然后来分析啦~
效果图


HTML
<div class="focus" id="focus001">
    	<ul>
        	<li><img src="img/1.jpg"/></li>
        	<li><img src="img/2.jpg"/></li>
        	<li><img src="img/3.jpg"/></li>
		<li><img src="img/4.jpg"/></li>
		<li><img src="img/5.jpg"/></li>
    	</ul>
</div>

CSS
.focus {
	width:1235px; 
	height:420px;
	margin:0 auto; 
	overflow:hidden;
	position:relative;
}

.focus ul {
	height:380px; 
	position:absolute;
}

.focus ul li {
	 float:left;
	 width:1235px;
	 height:420px;
	 overflow:hidden;
	 position:relative;
	 background:#000;
}

.focus ul li div {
	position:absolute;
	overflow:hidden;
}

.focus .btnBg {
	position:absolute;
	width:600px;
	height:20px;
	left:0;
	bottom:0; 
	background:#000; 
	display:none;
}

.focus .btn {
	position:absolute;
	width:580px;
	height:23px;
	padding:0px 10px 0px 10px; 
	right:0; bottom:6px;
	text-align:right;
}

.focus .btn span {
	display:inline-block;
	_display:inline;
	_zoom:1;
	width:25px;
	height:24px; 
	line-height:24px; 
	text-align:center;
	_font-size:0;
	margin-left:5px;
	cursor:pointer; 
	background:#fff;
}

.focus .btn span.on {
	background:#fff;
}
.focus .preNext {
	width:45px; 
	height:100px;
	position:absolute; 
	top:160px; 
	background:url(../img/sprite.png) no-repeat 0 0;
	cursor:pointer;
}

.focus .pre {
	left:0;
}

.focus .next {
	right:0;
	background-position:right top;
}

JS
$(function() {
	jQuery.focus = function(slid) {
		var sWidth = $(slid).width(); //获取焦点图的宽度(显示面积)
		var len = $(slid).find("ul li").length; //获取焦点图个数
		var index = 0;
		var picTimer;
		
		//以下代码添加数字按钮和按钮后的半透明条,还有上一页、下一页两个按钮
		var btn = "<div class='btnBg'></div><div class='btn'>";
		for(var i=0; i < len; i++) {
			var ii = i+1;
			btn += "<span>"+ii+"</span>";
		}
		btn += "</div><div class='preNext pre'></div><div class='preNext next'></div>";
		$(slid).append(btn);
		$(slid).find("div.btnBg").css("opacity",0.5);
	
		//为小按钮添加鼠标滑入事件,以显示相应的内容
		$(slid+" div.btn span").css("opacity",0.4).mouseenter(function() {
			index = $(slid+" .btn span").index(this);
			showPics(index);
		}).eq(0).trigger("mouseenter");	//一开始就触发mouseenter事件
	
		//上一页、下一页按钮透明度处理
		$(slid+" .preNext").css("opacity",0.4).hover(function() {
			$(this).stop(true,false).animate({"opacity":"0.6"},300);
		},function() {
			$(this).stop(true,false).animate({"opacity":"0.4"},300);
		});
	
		//上一页按钮显示对应的图片
		$(slid+" .pre").click(function() {
			index -= 1;
			if(index == -1) {index = len - 1;}
			showPics(index);
		});
	
		//下一页按钮显示对应的图片
		$(slid+" .next").click(function() {
			index += 1;
			if(index == len) {index = 0;}
			showPics(index);
		});
	
		//本例为左右滚动,即所有li元素都是在同一排向左浮动,所以这里需要计算出外围ul元素的宽度
		$(slid+" ul").css("width",sWidth * (len));
		
		//鼠标滑上焦点图时停止自动播放,滑出时开始自动播放
		$(slid).hover(function() {
			clearInterval(picTimer);
		},function() {
			picTimer = setInterval(function() {
				showPics(index);
				index++;
				if(index == len) {index = 0;}
			},4000); //此4000代表自动播放的间隔,单位:毫秒
		}).trigger("mouseleave");
		
		//显示图片函数,根据接收的index值显示相应的内容
		function showPics(index) { //普通切换
			var nowLeft = -index*sWidth; //根据index值计算ul元素的left值
			$(slid+" ul").stop(true,false).animate({"left":nowLeft},300); //通过animate()调整ul元素滚动到计算出的position
			$(slid+" .btn span").removeClass("on").eq(index).addClass("on"); //为当前的按钮切换到选中的效果
			$(slid+" .btn span").stop(true,false).animate({"opacity":"0.4"},300)
				.eq(index).stop(true,false).animate({"opacity":"1"},300); //为当前的按钮切换到选中的效果
		}
	};
});

虽然上面的注释已经写得很清楚了,但还是来说说思路吧
我们分为两个大步骤:一是添加元素,二是编写事件。
一、所谓的添加元素就是添加触发事件的按钮,比如上一页,下一页,还有带有数字下标的的小按钮。
    首先根据<li>标签来获取焦点图的个数,然后通过个数以<span>标签来循环添加小按钮。添加元素这部分还是比较简单的,所以就简单略过。
二、编写事件,分别给上一页,下一页,小按钮编写事件。
    上一页和下一页的事件具体实现过程为,在一开头就设置了一个index变量来存储当前焦点图的下标。当点击按钮时,先改变index的数值,上一页为index-1,下一页就是index+1,然后通过index这个参数改变现实的焦点图。在此之前,必须先写一个显示焦点图的showPics(index)方法,该方法主要的功能就是根据传进来的index值来使<ul>水平移动一定的距离,还有就是改变小按钮的效果。
    小按钮的实现过程其实与上一页,下一页类似,主要的区别就是改变当前index方式不同,具体还是看以上的代码。

说到事件别忘了还有焦点图根据一定时间间隔来自动轮播,所以还得写一个自动轮播的方法。
    自动轮播的前提是鼠标不在其区域上,也就是说当鼠标在其区域上焦点图就会停下来,不再切换其他焦点图。我们可以在当鼠标离开时设置setIntervall来根据一定时间间隔改变index的值,再调用showPics(index)方法显示图片。给焦点图的hover设置clearInterva来消除计时器,这样当鼠标移上去时就会停止轮播了。

结语
    以上的代码在网上可以很容易找到,大家也可以下载其他的模板来学习。在平时中,我们可以在网上找到很多资源,但我们不能过度依赖这样的模板,而是去学习其中是怎么实现的。否则如果出现一个我们找不到的模板需求时只能头痛。
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值