无图无真相,各种类型的网站基本上都会用到焦点图。
以前在做网站的时候,基本上都无可避免的用到了焦点图,然而碍于时间、技术能力、兼容性等因素,只得去网上找一些广泛使用的焦点图插件,但是用的时候也无可避免的会出现很多问题,比如与其他插件冲突、使用不方便等问题。
近来无事,也是为了巩固一下jQuery的知识,自己动手写了一个jQuery焦点图的插件,效果如图。
插件是基于jQuery编写的,因此在兼容性上同jQuery。
其实焦点图的原理很简单,可以用下面的图来表示。
下面先把代码放上来(jquery-QuinnSlideshow-1.0.js)。
;
(function ($) {
$.fn.QuinnSlideshow = function (_config) {
var _default = {
speed:3000,
animateSpeed:500,
boxStyle: {
"width": "500px",
"height": "300px",
"overflow": "hidden",
"position": "relative"
},
btnEnable: true,
btnEnableClick: true,
btnType: "number",
btnFocusNo: 0,
btnBottom: "5px",
btnRight: "2px",
btnStyle: {
"float": "left",
"width": "20px",
"height": "20px",
"background": "#fff",
"line-height": "20px",
"text-align": "center",
"font-size": "12px",
"margin-right": "3px",
"color": "#aaa",
"cursor": "default"
},
btnFocusStyle: {
background: "#FF5C00",
"color": "#fff"
}
};
$.extend(true,_default,_config)
this.css(_default.boxStyle);
var me = this, meId = me.attr("id"), liCount = me.children().children().length, boxWidth = me.width();
var slideBox, slideBoxInner, slideInterval, focusNo = _default.btnFocusNo;
slideBox = $("<div id='" + meId + "_slideBox'>");
slideBox.css(_default.boxStyle);
slideBoxInner = $("<div id='" + meId + "_slideBoxInner'>");
slideBoxInner.css({"width": "10000%"}); // 尽量大,以保证图片在一行上
me.children().css({
"float": "left",
"margin": 0,
"padding": 0,
"position": "relative",
"list-style": "none"
}).appendTo(slideBoxInner).children().css({
"float": "left",
"width": _default.boxStyle.width,
"height": _default.boxStyle.height
}).children().css({
"width": _default.boxStyle.width,
"height": _default.boxStyle.height,
"border": 0
});
// 复制一份
slideBoxInner.children().clone().appendTo(slideBoxInner);
slideBox.append(slideBoxInner);
me.append(slideBox);
if (_default.btnEnable) {
var ulBtn = $("<ul>");
ulBtn.css({
"position": "absolute",
"padding": 0,
"margin": 0,
"bottom": _default.btnBottom,
"right": _default.btnRight,
"list-style": "none"
});
for (var i = 0; i < liCount; i++) {
var liBtn = $("<li no=" + i + " id='" + meId + "_btn" + i + "' >" + (i + 1) + "</li>");
liBtn.css(_default.btnStyle);
if (_default.btnEnableClick) {
liBtn.click(function () {
clearInterval(slideInterval);
slideBox.clearQueue();
var no = parseInt($(this).attr("no"));
btnBlur(focusNo);
focusNo = no;
btnFocus(focusNo);
slideBox.animate({
"scrollLeft": focusNo * me.width()
}, _default.animateSpeed);
slideShow();
});
}
ulBtn.append(liBtn);
}
me.append(ulBtn);
// 默认焦点
$("#" + meId + "_btn" + focusNo).css(_default.btnFocusStyle);
function btnFocus(_focusNo) {
// 如果等于图片的数量时,实际上这时候显示的是第一张,序号即0
_focusNo = (_focusNo == liCount) ? 0 : _focusNo
$("#" + meId + "_btn" + _focusNo).css(_default.btnFocusStyle);
}
function btnBlur(_focusNo) {
_focusNo = (_focusNo == liCount) ? 0 : _focusNo
$("#" + meId + "_btn" + _focusNo).css(_default.btnStyle);
}
function slideShow() {
slideInterval = setInterval(function () {
btnBlur(focusNo);
focusNo++;
if (focusNo == liCount + 1) {
focusNo = 1;
// scrollLeft设为0,保证动画的延续性
slideBox.scrollLeft(0);
}
btnFocus(focusNo);
slideBox.animate({
"scrollLeft": focusNo * me.width()
}, _default.animateSpeed)
}, _default.speed);
}
slideShow();
}
};
})(jQuery);
其中最核心的代码就是slideShow(), 下面把demo页面代码的放上来
<!DOCTYPE html>
<html>
<head>
<title></title>
<script type="text/javascript" src="jquery-1.8.0.min.js"></script>
<script type="text/javascript" src="jquery-QuinnSlideshow-1.0.js"></script>
<script type="text/javascript">
$(function () {
$("#QuinnSlideshow").QuinnSlideshow({});
});
</script>
</head>
<body>
<div id="QuinnSlideshow">
<ul>
<li><img src="1.jpg" alt="1"/></li>
<li><img src="2.jpg" alt="2"/></li>
<li><img src="3.jpg" alt="3"/></li>
<li><img src="4.jpg" alt="4"/></li>
<li><img src="5.jpg" alt="5"/></li>
</ul>
</div>
</body>
</html>
我在写插件的时候有个原则,那就是最少依赖,因此在上面的插件的代码中可以发现大量的CSS的代码,这样我们在引用的时候就不需要再引入CSS文件了,另外全部的样式都是可以外部配置的。