打印

[分享]用javascript实现select的美化

回复 #14 buildcold 的帖子

在FF下还是没有实现!
DIV+CSS讨论群:13669844和23629301

我来做个BUTTON的优化

目的仅是感谢楼主的分享,共同学习。而且,我对HTML元素的美化非常滴感兴趣。

目的:不改动现有HTML结构,不添加任何元素(除了加载一个js文件),实现<input type="button" value="submit"/>的样式美化。目前只测试了IE6和FF2.0

joel.js部分:
PART A:
检测、替换input标签(貌似应该检查下type属性=。=·)加载CSS文件。CSS部分稍后防出。
复制内容到剪贴板
代码:
(function(){
          if(typeof(window.attachEvent)!='undefined'){
             window.attachEvent("onload",ini);
        }else if(typeof(window.addEventListener)!='undefined'){
            window.addEventListener("load",ini,false);
            }
          })();
function ini(){
var cssfile="joel.css";
var buttonsHtml=document.getElementsByTagName("input");
for(var i=0;i<buttonsHtml.length;i++){
new joel.Button(buttonsHtml[i],buttonsHtml[i].value);
var cssfileref=document.createElement("link")
cssfileref.setAttribute("rel", "stylesheet")
cssfileref.setAttribute("type", "text/css");
cssfileref.setAttribute("href", cssfile);
document.getElementsByTagName("head")[0].appendChild(cssfileref)
}
}
PART B:

这段只要是joel.Button的定义。有点问题,比如"document.body.replaceChild(this.outer,target_);"
复制内容到剪贴板
代码:
var joel=new Object();
joel.Button=function(target_,value_){
    this.inputbutton=document.createElement("input");
    this.inputbutton.type="button";
    this.inputbutton.value=value_;
    this.inner=document.createElement("span");
    this.inner.className="buttoninner";
    this.outer=document.createElement("span");
    this.outer.className="buttonouter";
    this.inner.appendChild(this.inputbutton);
    this.outer.appendChild(this.inner);
    this.outer.object=this;
    
    
    this.outer.onmouseover=this.onmouseover;
    this.outer.onmousedown=this.onmousedown;
    this.outer.onmouseup=this.onmouseup;
    this.outer.onmouseout=this.onmouseout;
    this.outer.mouseover=this.onmouseover;
    this.outer.mousedown=this.onmousedown;
    this.outer.mouseup=this.onmouseup;
    this.outer.mouseout=this.onmouseout;
    document.body.replaceChild(this.outer,target_);
}
joel.Button.prototype={
onmouseover:function(){
    var joelButton=this.object;
    if(joelButton){
        joelButton.outer.style.background="url(sprite.png) left -1700px repeat-x";
    }
    },
    onmousedown:function(){
    var joelButton=this.object;
    if(joelButton){
        joelButton.outer.style.background="url(sprite.png) left -1300px repeat-x";
    }
    },
    onmouseup:function(){
    var joelButton=this.object;
    if(joelButton){
    joelButton.outer.style.background="url(sprite.png) left -1700px repeat-x";
    }
    },
onmouseout:function(){
    var joelButton=this.object;
    if(joelButton){
        joelButton.outer.style.background="url(sprite.png) left top repeat-x";
    }
    },
addEventListener:function(target,type,func){
    if(window.attachEvent){
        target.attachEvent(type,func);
    }else if(window.addEventListener){
        type=type.slice(2,type.length);
        target.addEventListener(type,func,false);
    }
    }
}
joel.css
复制内容到剪贴板
代码:
.buttonouter{
display:-moz-inline-box;
display:inline-block;
background:url(sprite.png) left top repeat-x;
border-width:1px 0;
border-color:#808080;
border-style:solid;
}
.buttoninner{
display:-moz-inline-box;
display:inline-block;
border-width:0 1px;
border-color:#808080;
border-style:solid;
margin:0 -1px;
*position:relative;
*left:-1px;
}
.buttonouter .buttoninner input{
line-height:2;
margin:0;
padding:0 10px;
background:transparent;
border:none;
min-height:2em;
*min-hight:auto;
}
button.html:
复制内容到剪贴板
代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script src="BUTTON/joel.js"></script>
</head>
<body>
<input type="button" value="你好"/>
<input type="button" value="你好"/>
<input type="button" value="你好"/>
<input type="button" value="你好"/>
<!--/*<span class="buttonouter">
<span class="buttoninner">
<input name="innerbutton" type="button" value="123" />
</span>*/-->
</span>
</body>
</html>
完整下载

效果图:

[ 本帖最后由 yzcj007 于 2008-2-26 23:42 编辑 ]
附件: 您所在的用户组无法下载或查看附件,您需要注册/登录后才能查看!
很好很强大,收藏了。

java 程序员必备电子书

TOP

还在为头像烦恼?还在为不能关注好友动态烦忧?快来蓝色理想家园吧!
这一沓子电子书有关系吗?

TOP

赞一个
QQ梦想家园http://www.qqideal.cn

TOP

不知道那些电子书怎样

[ 本帖最后由 zhsdxy 于 2008-7-23 09:14 编辑 ]
努力再努力

TOP

回复 firepage 在 18# 的帖子

该例子也是有缺陷的
1.失去焦点时下拉框收缩;
2.select只能是一种

TOP

http://b0304006.summit.name/zdn/01_copy.html
链接中的select是我做的 css 是可以更换的
在js 中是这样定义的
复制内容到剪贴板
代码:
function setupInput(options) {
        var input = document.createElement("input");
        var $input = $(input);
        $input.attr("id", elm_id+"_input");
        $input.attr("type", "text");
        $input.attr("class", bbb );
        $input.attr("autocomplete", "off");
        $input.attr("readonly", "readonly");
        $input.attr("tabIndex", $select.attr("tabindex")); // "I" capital is important for ie
        
        return $input;    
    }
$input.attr("class", bbb );
是通过
复制内容到剪贴板
代码:
var class_arrary = new Array ("","selectbox01","selectbox01","selectbox01","selectbox02","selectbox02","selectbox02","selectbox02");
    var aaa = Number(elm_id.substring(12,13));
    var bbb=class_arrary[aaa];
也就是我要加一个样式 就要在 class_arrary 数组中加入一个样式;  我知道这样并不是很完美 ,但是现在还没有想到办法
当然 焦点问题也没有解决!

TOP

yzcj007,你做的BUTTON的优化不用那么麻烦,ie7下面单单CSS就可以实现了。楼主的代码很好,感谢分享。因为工作需要,我对楼主的代码进行了一些修改:http://www.366312.com/blog/sample/js_Select/
修正:
失去焦距自动收缩
支多个Select,JS自动遍历页面所有Select并进行美化
原代码样式和js混合在一起,难以修改。因此我将它的js和css代码分离出来了。示例里的CSS文件有详细注释详细,方便修改。

TOP