前言
前两篇博客写了自定义播放器和弹幕的实现,这次说点常用的技术,那就是焦点图的实现。当然网上有很多优秀的焦点图模板可以借鉴(我才不会说我也是借鉴来的),但万变不离宗,我们不仅要懂得怎么运用模板,还要看懂代码,写一个真正属于自己的效果。
分析
下载一个网上找的模板,直接贴上代码和效果图,然后来分析啦~
效果图
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来消除计时器,这样当鼠标移上去时就会停止轮播了。
结语
以上的代码在网上可以很容易找到,大家也可以下载其他的模板来学习。在平时中,我们可以在网上找到很多资源,但我们不能过度依赖这样的模板,而是去学习其中是怎么实现的。否则如果出现一个我们找不到的模板需求时只能头痛。