jQuery焦点图插件编写

       无图无真相,各种类型的网站基本上都会用到焦点图。

       以前在做网站的时候,基本上都无可避免的用到了焦点图,然而碍于时间、技术能力、兼容性等因素,只得去网上找一些广泛使用的焦点图插件,但是用的时候也无可避免的会出现很多问题,比如与其他插件冲突、使用不方便等问题。

       近来无事,也是为了巩固一下jQuery的知识,自己动手写了一个jQuery焦点图的插件,效果如图。

jQuery焦点图插件编写_第1张图片

       插件是基于jQuery编写的,因此在兼容性上同jQuery。

       其实焦点图的原理很简单,可以用下面的图来表示。

jQuery焦点图插件编写_第2张图片

       下面先把代码放上来(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文件了,另外全部的样式都是可以外部配置的。

你可能感兴趣的:(jquery,原理,插件,焦点图)