用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)
            
}
            
options = 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 ' )) ;
                            $
( 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 ) ;

原文发布于Mr.Think的博客:
http://mrthink.net/jquery-plugin-iselect/ 转载请注明出处

转载于:https://www.cnblogs.com/mrthink/archive/2010/11/02/1867445.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值