打印

select 美化,基于jquery

起因是在实践中发现input的高度无法改变,也就是说再怎么调整,他的四周都会有空隙,当然只作用于IE,如果调整一下的话,FF下效果又不理想,没有什么好的解决方法,除非用图片模拟,为了追求完美,模拟就模拟吧。

本人习惯用jQuery,于是就找到了nicejform,专门用来美化表单的jquery插件。(我知道坛子上有相关的文章,我也参考过,但是美化不是我的强项,所以就想找现成的)

效果查看

看源码,可以发现没有另外添加样式,id之类的,所以如果不用这个插件了,页面也无需改动

众所周知,表单美化里面select是最不好模拟的,同样nicejforms也没有很好的模拟,那就自己动手改造吧。

3个半小时过去后......

终于被我征服了,彻底地模拟美化了select表单,可以说功能上一点都不差,修改了原版本的一些不足


           
  • 点击页面空白处,弹出的options不能缩回
           
  • 无法设置option的value值,一律都是"#"
           
  • 由于都设置为了"#",所以如果select放置到了页面的下方,选择后会回到页面顶部


现在这些问题全都解决了,可以正式派上用场了,oh,yeah!

效果查看

点击下载修改后的文件

-------------------------------------------------------------------------------------------------------------------------------------------------
10.1日添加

其实上面那个select美化有一个非常大的问题,不过好像没有人注意到,就是当页面载入完后,在页面的底部会出现这些选项,这次重新操刀,不再是对原插件的修修补补,自己重新写了code。

特点:


  • 仅IE有效,FF下保持原状
  • 不接受键盘响应,所以上下键无效,滚轴也无效
  • 其他的应该都模仿的差不多了


由于前台编程也只是我的业余爱好,所以更加细致的模仿,只能靠大家了。

其实我自己也觉得写这么一堆未必有用,但是既然都写出来了,还是放上来吧,有用没用让大家来评价。

浏览地址:http://www.live-my-life-with-yuyi.com/lab/jquery/form_select/

代码:
复制内容到剪贴板
代码:
if($.browser.msie)
$(document).ready(function(){
    //对每一个select进行美化
    $("select").each(function(){
        select_name = $(this).attr("name");
        //取得select的高度
        width = $(this).width();
        //取得input的宽度
        input_width = width-17;
        //取得绝对坐标
        offset = $(this).offset();
        //美化的代码
        select_html = '<div style="width:'+width+'px;position:absolute;left:'+offset.left+'px;top:'+offset.top+'px"><input type="text" style="width:'+input_width+'px;" autocomlete="off" readonly="true" id="input_'+select_name+'" class="select_input"/><img id="img_'+select_name+'" name="'+select_name+'" class="select_img" src="s.gif" width="17" height="21"></div>';
        //附加到页面上
        $("body").append(select_html);
        $(this).css({visibility:"hidden"});
        //$(this).css("margin","200px");
        //取得option的数量
        option_num = $("option",$(this)).length;
        //option的高度
        option_height = option_num * 21 > 200 ? 200 : option_num*21;
        //option的宽度
        option_width = width;
        //option的坐标
        option_left = offset.left;
        option_top = offset.top+21;
        //下拉菜单的美化代码
        option_html = "<div class='select_option_div' id=option_"+select_name+" style='height:"+option_height+"px;width:"+option_width+"px;position:absolute;top:"+option_top+"px;left:"+option_left+"px;overflow:auto'>";
        $(this).find("option").each(function(){
            option_html += "<div class='select_option'>"+$(this).text()+"</div>";
        });
        option_html += "</div>";
        //附加到页面上
        $("body").append(option_html);
        //隐藏选项
        $("#option_"+select_name).hide();
        //设定img id 和 input id
        img_id = "#img_"+select_name;
        input_id = "#input_"+select_name;
        //设定图片点击事件
        $(img_id).click(function(){
            //通过name取得目标id
            dest_id = "#option_"+$(this).attr("name");
            //取得选项的状态是打开还是关闭
            state = $(dest_id).css("display");
            //关闭所有的选项
            $(".select_option_div").hide();
            //开的关,关的开
            if(state == "none"){
                $(dest_id).show();
            }
            else{
                $(dest_id).hide();
            }
        });
        //input的点击事件
        $(input_id).click(function(){
            //取得目标id
            dest_id = $(this).attr("id").substr(6);
            dest_id = "#option_"+dest_id;
            state = $(dest_id).css("display");
            $(".select_option_div").hide();
            if(state == "none"){
                $(dest_id).show();
                //alert("hello");
            }
            else{
                $(dest_id).hide();
            }
        });
        //设置默认选中的项
        obj = document.getElementById(select_name);
        input_id = "#input_"+select_name;
        $(input_id).val(obj.options[obj.selectedIndex].text);
    });
    //当点击选项后的操作
    $(".select_option").click(function(){
        //取得select id
        parent_id = $(this).parent().attr("id");
        parent_id = parent_id.substr(7);
        input_id = "#input_"+parent_id;
        //在input处显示所选项
        $(input_id).val($(this).text());
        //操作select选项
        obj = document.getElementById(parent_id);
        obj.options[obj.selectedIndex].text=$(this).text();
        option_id = "#option_"+parent_id;
        //选中之后隐藏选项
        $(option_id).hide();
    });
    //对option选项应用鼠标移入移出效果
    $(".select_option").hover(function(){$(this).addClass("select_highlight")},function(){$(this).removeClass("select_highlight")});
});
//点击页面函数
$(document).click(function(evt){
    var evt = evt || window.event; // event object
    var target = evt.target || window.event.srcElement; // event target
    var t_className = target.className; // event target id
    if(t_className == "select_img" || t_className == "select_input" || t_className == "select_option"){
        return false;
    }
    else{
    $(".select_option_div").hide();
    };
});
[ 本帖最后由 lzyy 于 2007-10-1 20:51 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
本帖最近评分记录
  • 帅青蛙 威望 +2 原创内容 2008-1-7 17:59
效果不错,沙发~~~~~
好的,很强大
为了你的三个小时!建议版主给分 ~~~

TOP

不错不错,比以前那个要好很多,顶了
我是菜鸟,菜死鸟的鸟。

TOP

不错不错,谢谢啦哈!

TOP

这么麻烦,怎么不用flash

TOP

的确比原来的好多了

赞一个
DOM木偶

TOP

我没觉得什么特别呀
因为专业,所以选择..技术群:11162579

TOP

简单的感觉了一下, SELECT弹出后,点出SELECT以外的地方能消失,这点不错。

建议再修改一下,SELECT中,鼠标放在option没文字的地方,也能将option选中。

(鼠标放在有文字的地方才能做选择,有点不适应)
个人签名 (60 字节以内)
不支持自定义 Discuz! 代码

TOP

给option样式 加上 height: 1% 就可以了

TOP

点击页面空白处,弹出的options不能缩回

我用的遨游,这个问题还是会出现啊

TOP

IE6下也有这个问题
增加
document.onclick=function{
//hide options
}

TOP

LZ的代码浏览器报错

TOP

SELECT的边框颜色怎么改变? 用CSS可以么?
不在放荡中变坏,就在沉默中变态...

TOP

这个挺好看的哦。。

TOP

在Username里边输入中文加英文,如:中国aaabbb
Username控件有点变形(IE下,FF不知道)

TOP

select做的不好看。。。
灌水人水区灌半桶水

TOP

楼主修改一下帖子吧,说明一下是怎么操作的,在做的过程中需要注意什么等等。
把你的思路跟大家讲讲,然后给你加分。
新一代四无新人…… [POCO空间]
承接定制建站、在线系统,代理域名、邮局、主机,价格从优。
有意者站内PM。

TOP

是很好看,不过这样做是不是太费成本了,呵呵.不过看东西顶下.

TOP

更新了一下

TOP

小建议:
select下拉框的宽度最好和select一样宽
不一样使用起来不方便

TOP

不错,以前也被这个美化问题难住过

TOP

很好啊
继续发扬!

TOP

完却的看不懂

TOP

火狐下没变化

TOP

效果不错的~
但,点击非select区域后select为什么还在那里呢?
www.csser.com | CSSer群:36047120

TOP

直接用Ext不就可以了……

TOP

不错。。。。

TOP

好东西分享了 才算好东西

楼主辛苦啊

TOP

真漂亮,厉害

真漂亮,厉害,牛

TOP