[支持图片,16x16px(需设定路径),列表框弹出滚动效果支持传值(需设定),自适应宽度,根据最宽的一个选项自动调整,样式、效果基本摹仿select tag。]
大家都知道select的优先权比较高,CSS不宜控制,而且还能遮挡层的正常显示!那么我们就来模拟一个!这样样式就可以随心所欲了
<title>自定义列表框</title>
<style>
.selectDiv { border: 2px solid inset buttonface;}
.optionDiv { border:1px solid black;border-top:0px;position:absolute;cursor:default;clip:rect(auto auto 0% auto);}
.optionDiv div { font-size:11px;font-family:Tahoma;padding-left:8px;line-height:160%;background-color:white;}
.optionDiv img { vertical-align: middle;margin-right:3px;}
.defaultSelect { font-size:11px;font-family:Tahoma;padding-left:6px;border:1px solid white;cursor:default;}
.defaultSelect img { vertical-align: middle;margin-right:3px;}
.arrow { font-family:webdings;line-height:13px;border:2px outset buttonhighlight;background-color:buttonface;width:15px;text-align:center;cursor:default;font-size:8px;height:18px;}
</style>
<body>
<span id="sel"></span><button style="font-family:Arial;font-size:10px;width:22px;height:18px;margin-top:4px;" onclick="putValue()">Go</button>
<SCRIPT LANGUAGE="JavaScript">
//用户变量
var oWhere = document.getElementById("sel");
//显示文字
var OptionText = new Array();
OptionText[0] = "--优秀网站--";
OptionText[1] = "piggydesign.yeah.net";
OptionText[2] = "蓝色理想";
OptionText[3] = "PcHome.net";
OptionText[4] = "Sina.com.cn";
//显示图片
var OptionImg = new Array();
OptionImg[0] = "";
OptionImg[1] = "";
OptionImg[2] = new Image(),OptionImg[2].src="http://www.sayee.com/cloudchen/js/images/blueidea.gif";
OptionImg[3] = new Image(),OptionImg[3].src="http://www.sayee.com/cloudchen/js/images/pchome.gif";
OptionImg[4] = new Image(),OptionImg[4].src="http://www.sayee.com/cloudchen/js/images/sina.gif";
var OptionValue = new Array();
OptionValue[0] = "";
OptionValue[1] = "http://piggydesign.yeah.net";
OptionValue[2] = "http://www.blueidea.com";
OptionValue[3] = "http://www.pchome.net";
OptionValue[4] = "http://www.sina.com.cn";
//系统变量
var selectedOver = false;
var selectedValue = 0;
//下拉菜单主体
var selectDiv = document.createElement("table");
var selectDivTR = selectDiv.insertRow();
var defaultValueTD = selectDivTR.insertCell();
var arrow = selectDivTR.insertCell();
with(selectDiv)cellSpacing=0,cellPadding=0,border=0,className="selectDiv";
with(defaultValueTD)innerHTML = showOptionImg(1)+OptionText[0],className="defaultSelect";
with(arrow)innerText=6,className="arrow";
oWhere.appendChild(selectDiv);
//外层Div
var optionDiv = document.createElement("div");
//设置下拉菜单选项的坐标和宽度
with(optionDiv.style) {
var select = selectDiv;
var xy = getSelectPosition(select);
pixelLeft = xy[0];
pixelTop = xy[1]+select.offsetHeight;
optionDiv.className = "optionDiv";
}
//下拉菜单内容
var Options = new Array();
for (var i=0;i<OptionText.length;i++) {
Options[i] = optionDiv.appendChild(document.createElement("div"));
}
for (i=0;i<Options.length;i++) {
Options[i].innerHTML = showOptionImg(i)+OptionText[i];
Options[i].index = i;
}
oWhere.appendChild(optionDiv);
//列表宽度自适应
var SelectWidth = Options[0].offsetWidth+arrow.offsetWidth+8;
selectDiv.style.width=SelectWidth;;
optionDiv.style.width=SelectWidth;
/*事件*/
//禁止选择文本
selectDiv.onselectstart = function() {return false;}
optionDiv.onselectstart = function() {return false;}
//下拉菜单的箭头
arrow.onmousedown = function() {
this.setCapture();
this.style.borderStyle="inset";
}
arrow.onmouseup = function() {
event.cancelBubble = true;
this.style.borderStyle="outset";
this.releaseCapture();
showHide();
}
document.onmouseup = function() {
optionDiv.style.clip="rect(auto auto 0% auto)";
if(selectedOver) {
with(defaultValueTD.style)background="",color="";
selectedOver=false;
}
}
defaultValueTD.onmouseup = function() {
event.cancelBubble = true;
showHide();
}
//移动Option时的动态效果
for (i=0;i<Options.length;i++) {
Options[i].attachEvent("onmouseover",function(){moveWithOptions("highlight","white")});
Options[i].attachEvent("onmouseout",function(){moveWithOptions("","")});
Options[i].attachEvent("onmouseup",selectedText);
}
function moveWithOptions(bg,color) {
with(event.srcElement) {
style.backgroundColor = bg;
style.color = color;
}
}
function selectedText() {
event.cancelBubble=true;
defaultValueTD.innerHTML = event.srcElement.innerHTML;
with(defaultValueTD.style)background="highlight",color="white";
optionDiv.style.clip="rect(auto auto 0% auto)";
selectedOver = true;
selectedValue = event.srcElement.index;
}
i = 0;
/*通用函数*/
//获取对象坐标
function getSelectPosition(obj) {
var objLeft = obj.offsetLeft;
var objTop = obj.offsetTop;
var objParent = obj.offsetParent;
while (objParent.tagName != "BODY") {
objLeft += objParent.offsetLeft;
objTop += objParent.offsetTop;
objParent = objParent.offsetParent;
}
return([objLeft,objTop]);
}
function showOptionImg(index) {
var imgSrc = OptionImg[index].src;
if (imgSrc!=undefined)
return("<img src="+OptionImg[index].src+">")
else
return("");
}
function dynamicOptions() {
optionDiv.style.clip="rect(auto auto "+i+"% auto)",i=i+20;
if(i<101)
setTimeout("dynamicOptions()",5);
else
i=0;
}
function showHide() {
with(optionDiv.style) {
if (clip=="rect(auto auto 0% auto)"||clip=="")
dynamicOptions();
else
clip="rect(auto auto 0% auto)";
}
}
function putValue() {
var url = OptionValue[selectedValue];
if (url) window.open(url)
}
</SCRIPT>