用层模拟下拉列表框

类别:Java 点击:0 评论:0 推荐:
[支持图片,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>

本文地址:http://com.8s8s.com/it/it14975.htm