用dl模拟实现可自定义样式的SELECT下拉列表(已封装)

通过dl模拟实现SELECT下拉列表. 其实这是项目中要常用到的一个效果, 于是, 在之前写的基础上封装成了一个插件. 可自定义样式, 可防止用户本意划过时触发事件.
具体思路就不说了,比较常规, 代码中也有注释. 使用方法也不费话了, 就是一个简单的全局函数封装, 不懂的看下源码中注释或Google.
另外, 有兴趣的朋友,可以尝试在本插件基础上改一个可输入的下拉列表. 思路差不多,哈.
演示及代码: 点此查看DEMO

;(function($){
    $.fn.extend({
        iSelect: function(options){
            var iset = {
                name: $('.selectitem'), //容器
                select: $('.selectitem>dl'), //dl列表
                dropCSS: 'drop', //收藏状态dt的样式
                shrinkCSS: 'shrink', //展开状态dt的样式
                hoverCSS: 'hover', //鼠标划过dd时的样式
                clearTime: 100, //允许用户快速划过不触发的时间(ms)
                dropTime: 100, //展开时间(ms)
                shrinkTime: 100, //收缩时间(ms)
                selectVal: null//选择的值传到此元素中
            }
            options=$.extend(iset, options || {});
            var mainHeight = iset.name.height();//容器高度
            var selectHeight = iset.select.height(); //dl实际高度
            var curTxt = iset.select.find('dt').html(); //dt默认html内容
            var self = null;
            var hoverElem = null; //避免用户快速划过时触发事件
            iset.name.each(function(){
                $(this).hover(function(){
                    self = this;
                    hoverElem = setTimeout(function(){
                        $(self).stop(true, false).animate({ //鼠标划过时,展开dl
                            height: selectHeight
                        }, iset.dropTime);
                        if ($(self).find('dt').html() == curTxt) { //判断是否有选择下拉列表,若无则改变dt样式
                            $(self).find('dt').attr('class', iset.dropCSS);
                        }
                        //dd的鼠标事件
                        $(self).find('dd').mouseover(function(){
                            $(this).addClass(iset.hoverCSS).siblings().removeClass(iset.hoverCSS);
                        }).mousedown(function(){ //鼠标点击时取值并赋给dt
                            $(self).find('dt').html($(this).html()).attr('class', $(this).attr('class'));
							//为表单传值
							if(iset.selectVal){
								iset.selectVal.val($(this).html());
							}
                            $(self).stop(true, false).animate({
                                height: mainHeight
                            }, iset.shrinkTime);
                        }).removeClass(iset.hoverCSS);
                    }, iset.clearTime);
                }, function(){
                    //鼠标移出后触发的事件
                    clearTimeout(hoverElem);
                    $(self).stop(true, false).animate({
                        height: mainHeight
                    }, iset.shrinkTime);
                    if ($(self).find('dt').html() == curTxt) {
                        $(self).find('dt').attr('class', iset.shrinkCSS);
                    }
                });
            })
        }
    })
})(jQuery);
共有 13 条评论.

发表评论3,466 Views

  1. Pretty_小夜

    你好啊,看了你写的这个特效,感觉甚好啊。。我是个初学者,认真学习了你写代码。发现个小问题:在你给的例子中有三个dl列表,然而如果我改变第二个或第三个列表(再增加多个dd),然而我新增的dd并不显示,除非同时也增加第一个列表的(dd)。
    var mainHeight = iset.name.height();//容器高度
    var selectHeight = iset.select.height(); //dl实际高度
    这里获取的高度始终是第一个列表的高度.
    我们需要在鼠标移动到某个对象上时,再获取指定对象的容器高度、dl实际高度。
    希望你可以改进,继续向你学习啊。。

    [回复]

    pretty_小夜 回复:

    @Pretty_小夜,
    if($(self).find(‘dt’).html() == curTxt) { //判断是否有选择下拉列表,若无则改变dt样式
    这句也不是很理解。这里的curTxt始终是第一个列表的dt值:“请选择标签类别”。然而三天列表的dt值都是这个,列面的代码都会被执行,也就是会折叠列表信息。如果在这段语句中加一个alert()语句,这里会弹框。列表也会折叠。
    望高手指点迷津呢。。期待回复。。。

    [回复]

    Mr.Think 回复:

    @pretty_小夜, if($(self).find(‘dt’).html() == curTxt) { … }这个判断的目的是当用户在鼠标划过列表,但并不有做进一步做选择操作时的效果,即小三角的展开与收起.

    [回复]

    Mr.Think 回复:

    @Pretty_小夜, 这个问题是因为我DEMO中三个列表用的是同一个样式,你在同时使用时更改一下对应列表的样式即可.

    [回复]

    pretty_小夜 回复:

    @Mr.Think, 谢谢你啊..嘿嘿..多向你学习

    [回复]

    Mr.Think 回复:

    @pretty_小夜, 哈, 互相学习~

  2. 哈哈,很好,前几天正要去实现这个效果,我决定把它转换到 YUI3 去了哈,不介意吧?

    [回复]

    Mr.Think 回复:

    @芒果, 完全可以! 最近也在看些YUI的资料..

    [回复]

  3. iou33449999

    如何实现向上的效果呢?

    [回复]

    Mr.Think 回复:

    @iou33449999, 原理上可以通过修改样式实现. 比如将dt放到最下面并修改相关样式仅显示dt. 未实验.

    [回复]

  4. 博主真牛,这是用jQuery写的吧?

    [回复]

  5. 沙发,发现很多技术博`

    [回复]

发表评论[无需注册]

Trackbacks and Pingbacks: