七分地
soncy的七分责任田,种点瓜果蔬菜和杂草
javascript+css模拟下拉框
发表于 2010年03月3日
296次阅读
浏览器自带的下拉框用起来挺方便,但是很多时候也会遇到麻烦,说说两个最大的麻烦吧 1,在IE下,下拉框无法自定义样式。 2,在IE下,下拉框的优先级最高,如果有遮盖效果的话,遮不住它。
这个时候模拟一个下拉框也是很必要的,自己写了一个简单的下拉框的模拟,效果:

JS部分:
下载: CsSelect.js
- function CsSelect(_data,_element){
- if(typeof _element == "string"){
- _element = document.getElementById(_element);
- }
- var self = this;
- self._value = "";
- self.data = _data;
- if(typeof self.data == "undefined" || self.data.length < 1) return;
- this.insertAfter = function(newElement,targetElement){
- var parent = targetElement.parentNode;
- if(parent.lastChild == targetElement){
- parent.appendChild(newElement);
- }else{
- parent.insertBefore(newElement,targetElement.nextSibling);
- }
- };
- var _htmlArr = [];
- self._CsSelect = document.createElement("div");
- self._CsSelect.className = "csSelect";
- self._CsStitle = document.createElement("div");
- self._CsStitle.className = "csStitle";
- self._CsStitle.innerHTML = self.data[0][1];
- _element.value = self.data[0][0];
- self._CsSelect.appendChild(self._CsStitle);
- self._CsSlist = document.createElement("ul");
- self._CsSlist.className = "csSlist";
- for(var i =0;i < self.data.length;i++){
- var _tempData = self.data[i];
- var _optValue = _tempData[0];//获取value值
- var _optText = _tempData[1];//获取text值
- _htmlArr.push('<li><a href="#" value="');
- _htmlArr.push(_optValue);
- _htmlArr.push('">');
- _htmlArr.push(_optText);
- _htmlArr.push('</a></li>');
- }
- self._CsSlist.innerHTML = _htmlArr.join("");
- self._CsSelect.appendChild(self._CsSlist);
- //展示
- var _parentNode = _element.parentNode;
- _element.style.display = "none";
- self.insertAfter(self._CsSelect,_element);
- //事件注册
- self._CsStitle.onclick = function(){
- var _CsSlist = self._CsSlist;
- var _Clist = document.getElementsByTagName("ul");
- for(var i = 0;i < _Clist.length;i++){
- if(_Clist[i].className.indexOf("csSlist") > -1 && _Clist[i] != self._CsSlist){
- _Clist[i].style.display = "none";
- }
- }
- if(_CsSlist.style.display != "block"){
- _CsSlist.style.visibility = "hidden";
- _CsSlist.style.display = "block";
- if(_CsSlist.offsetHeight > 200){
- _CsSlist.style.height = "200px";
- }
- _CsSlist.style.visibility = "inherit";
- }else{
- _CsSlist.style.display = "none";
- _CsSlist.style.height = "auto";
- }
- };
- var _csList = self._CsSlist.getElementsByTagName("a");
- for(var i = 0;i < _csList.length;i ++){
- _csList[i].onclick = function(event){
- var ev = event || window.event;
- var el = ev.srcElement || ev.target;
- self._CsStitle.innerHTML = el.innerHTML;
- _element.value = el.getAttribute("value");
- self._CsSlist.style.display = "none";
- self.change();
- return false;
- }
- };
- this.change = function(){
- };
- this.hide = function(){
- self._CsSelect.style.display = "none";
- };
- this.show = function(){
- self._CsSelect.style.display = "block";
- };
- this.setValue = function(value){
- var _idx = 0;
- for(var i = 0;i < self.data.length;i++){
- if(self.data[i][0] == value){
- _idx = i;
- }
- }
- self._CsStitle.innerHTML = self.data[_idx][1];
- _element.value = self.data[_idx][0];
- };
- this.getValue = function(){
- return _element.value;
- };
- if(window.addEventListener){
- document.addEventListener("click" , function(event){
- var ev = event || window.event;
- var el = ev.srcElement || ev.target;
- if(el.className == "csStitle") return;
- var _Clist = document.getElementsByTagName("ul");
- for(var i = 0;i < _Clist.length;i++){
- if(_Clist[i].className.indexOf("csSlist") > -1){
- _Clist[i].style.display = "none";
- }
- }
- },false);
- }else{
- document.attachEvent("onclick" , function(event){
- var ev = event || window.event;
- var el = ev.srcElement || ev.target;
- if(el.className == "csStitle") return;
- var _Clist = document.getElementsByTagName("ul");
- for(var i = 0;i < _Clist.length;i++){
- if(_Clist[i].className.indexOf("csSlist") > -1){
- _Clist[i].style.display = "none";
- }
- }
- });
- }
- }
css部分:
下载: CsSelect.css
- .csSelect{position:relative;width:154px;}
- .csStitle{cursor:pointer;border:1px solid #bababa;padding:4px;width:146px;background:#fff url(images/icon_CsSelect.gif) no-repeat right center;}
- .csSlist{display:none;position:absolute;background:#fff;width:100%;border:1px solid #bababa;border-top:0;overflow-y:auto;overflow-x:hidden;}
- .csSlist li{line-height:auto !important;margin:0 !important;}
- .csSlist a{display:block;padding:2px 4px;color:#555;outline:none;}
- .csSlist a:hover{background:#0069ca;color:#fff;}
用法: html部分:
- <input type="hidden" name="xxx" id="csselect" />
js部分:
- var selectData = [["value","text"],["value1","text1"]];
- var someSelect = new CsSelect(selectData,document.getElementById("csselect"));
需要用到的图片: ![]()
感谢您的浏览,如果您喜欢本站,可以通过Rss订阅本站,如需转载,请注明出处,谢谢!
2条评论 
我之前也写过模拟的select,印象中有个问题是IE6下列表宽度不能自适应…
[回复]
博客换域名了,特来低调通知一下keelii.cn变成了keelii.com。欢迎断续围观哈,
果断关注我请点这里:
http://feed.feedsky.com/kily
[回复]
发表评论
[回复]