功能需求
1、呼叫要方便,做好之後應該像這樣:
function loadSelect(selectobj){
//傳入一個select物件就能美化他的樣式
}
2.不改變原有表單項,表單的頁面程式碼不破壞:
<form name="f" onsubmit="getResult();">
<fieldset>
<legend>用戶註冊</legend>
<div>
<label for="username">帳號</label>
<input type="text" id="username" name="username" />
</div>
<div>
<label for="pwd">密碼</label>
<input type="password" name="pwd" id="pwd" />
</div>
<div>
<label for="province">省份</label>
<select id="province" name="province">
<option value="10">江西</option>
<option value="11">福建</option>
<option value="12">廣東</option>
<option value="13">浙江</option>
</select>
</div>
</fieldset>
<input type="submit" value="提交" name="btnSub" />
</form>
實作思路
第一步:將表單中的select隱藏起來。
為什麼?很簡單,因為這傢伙太頑固了,用css根本搞不出來你想要的。所以把它殺掉。
第二步:用腳本找出select標籤在網頁上的絕對位置。
我們在那個位置上用DIV標籤做個假的、好看點的來當他的替身。
第三步:用腳本把select標籤中的值讀出來。
雖然藏起來了,但它裡邊的options我們還有用呢,統統取過來。
第四步:當使用者點選select標籤的替身,也就是div的時候。我們再用一個div浮在上一個div的下邊,這個就是options的替身了。
大致上就是這樣了,接下來我們一步一步去實現它!
準備工作
1、想好你要把select美化成什麼樣子,並準備好對應的圖片。我準備了兩張小圖,就是下拉箭頭1和下拉箭頭2,1是預設樣式,2是滑鼠移過來的樣式。
2.寫好一個普通的表單遞交頁面,例如下邊這個。注意我為select定義了基本的CSS樣式、在頭部添加了呼叫js檔案的程式碼、在body中加入了呼叫函數的腳本。
編寫javascript
<script type="text/javascript" src="select.js"></script>
新建一個js檔案並儲存為select.js,剩下的工作我們全部在這個js中去完成。
函數名稱:loadSelect(obj);
參數:select物件
相關函數:
//取標籤的絕對位置
{
var t = e.offsetTop;
var l = e.offsetLeft;
var w = e.offsetWidth;
var h = e.offsetHeight-2;
while(e=e.offsetParent)
{
t+=e.offsetTop;
l+=e.offsetLeft;
}
return {
top : t,
left : l,
width : w,
height : h
}
}
第一步:把select的絕對位置錄下來。一會替身上來就知道應該站在那裡了。
var offset=Offset(obj);
//這裡解釋一下Offset是一個函數,用來取得物件的絕對位置。寫在loadSelect()函數外邊的。他有四個屬性分別是top/left/width/height。
第二步:將select隱藏。
obj.style.display="none";
第三步:虛擬一個div出來代替select
var iDiv = document.createElement("div");
iDiv.id="selectof" + obj.name;
iDiv.style.position = "absolute";
iDiv.style.width=offset.width + "px";
iDiv.style.height=offset.height + "px";
iDiv.style.top=offset.top + "px";
iDiv.style.left=offset.left + "px";
iDiv.style.background="url(icon_select.gif) no-repeat right 4px";
iDiv.style.border="1px solid #3366ff";
iDiv.style.fontSize="12px";
iDiv.style.lineHeight=offset.height + "px";
iDiv.style.textIndent="4px";
document.body.appendChild(iDiv);
第四步:把原始select沒人選取的值給它。
iDiv.innerHTML=obj.options[obj.selectedIndex].innerHTML;
第五步:為替身添加滑鼠移過樣式。
iDiv.onmouseover=function(){//滑鼠移到
iDiv.style.background="url(icon_select_focus.gif) no-repeat right 4px";
}
iDiv.onmouseout=function(){//滑鼠移走
iDiv.style.background="url(icon_select.gif) no-repeat right 4px";
}
第六步:新增關鍵的滑鼠點擊事件。
iDiv.onclick=function(){//滑鼠點擊
if (document.getElementById("selectchild" + obj.name)){
//判斷是否有建立過div
if (childCreate){
//判斷目前的下拉是不是開啟狀態,如果是開啟的就關閉掉。是關閉的就開啟。
document.getElementById("selectchild"+ obj.name).style.display="none";
childCreate=false;
}else{
document.getElementById("selectchild" + obj.name).style.display="";
childCreate=true;
}
}else{
//初始一個div放在上一個div下邊,當options的替身。
var cDiv = document.createElement("div");
cDiv.id="selectchild" + obj.name;
cDiv.style.position = "absolute";
cDiv.style.width=offset.width + "px";
cDiv.style.height=obj.options.length *20 + "px";
cDiv.style.top=(offset.top+offset.height+2) + "px";
cDiv.style.left=offset.left + "px";
cDiv.style.background="#f7f7f7";
cDiv.style.border="1px solid silver";
var uUl = document.createElement("ul");
uUl.id="uUlchild" + obj.name;
uUl.style.listStyle="none";
uUl.style.margin="0";
uUl.style.padding="0";
uUl.style.fontSize="12px";
cDiv.appendChild(uUl);
document.body.appendChild(cDiv);
childCreate=true;
for (var i=0;i<obj.options.length;i++){
//將原始的select標籤中的options加入到li中
var lLi=document.createElement("li");
lLi.id=obj.options[i].value;
lLi.style.textIndent="4px";
lLi.style.height="20px";
lLi.style.lineHeight="20px";
lLi.innerHTML=obj.options[i].innerHTML;
uUl.appendChild(lLi);
}
var liObj=document.getElementById("uUlchild" + obj.name).getElementsByTagName("li");
for (var j=0;j<obj.options.length;j++){
//為li標籤新增滑鼠事件
liObj[j].onmouseover=function(){
this.style.background="gray";
this.style.color="white";
}
liObj[j].onmouseout=function(){
this.style.background="white";
this.style.color="black";
}
liObj[j].onclick=function(){
//做兩件事情,一是將使用者選擇的儲存到原始select標籤中,要不做的再好看表單遞交後也取得不到select的值了。
obj.options.length=0;
obj.options[0]=new Option(this.innerHTML,this.id);
//同時我們把下拉的關掉。
document.getElementById("selectchild" + obj.name).style.display="none";
childCreate=false;
iDiv.innerHTML=this.innerHTML;
}
}
}
}
最後這個比較複雜一點,再解釋一下,我們在做這一步之前,select的樣子已經出來了,下一步就是再加一個div去模仿select被點擊之後出現的下拉選項了。我們可以講select標籤的options透過javascript提取出來,把它寫成這樣:
<div>
<ul>
<li>optionName</li>
<li>optionName</li>
<li>optionName</li>
</ul>
</div>
基本上就這樣了。還有些缺陷,有時間大家可以一起補充!