亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

用JavaScript來美化HTML的select標簽的下拉列表效果

2019-11-20 11:14:59
字體:
來源:轉載
供稿:網友

首先通過一個例子來回顧一下select標簽的用法:

<html><body><form><select name="cars"><option value="volvo">Volvo</option><option value="saab">Saab</option><option value="fiat">Fiat</option><option value="audi">Audi</option></select></form></body></html>

然后效果一般時這樣的:

20151117144635327.png (119×118)

美與丑暫且不論...所有html元素中select算是比較坑爹的一個。他讓人抓狂的地方主要是:
 
不同的瀏覽器顯示的默認下拉框樣子不完全相同
IE下無法手動設置select的高度(這是最坑爹的?。荒芸縡ont-size撐起來
select右側的下拉箭頭是無法使用背景消除的,這就導致無法使用css進行美化
總結起來,解決辦法主要有:

將select隱藏掉,而使用div進行模擬
將select透明度設置為0,然后使用相對定位在下方 加一個長得很像select又美化了的div

隱藏方案一般原理如下:
找到頁面需要處理的select,將其隱藏
根據select的option,創建一個li列表(當然也可以是div),并隱藏。
在select的位置創建一個div,顯示select的值(selected的option)。并使用css對其進行美化,使其看起來像一個select
添加事件,使點擊“select”的時候,顯示li列表。并使用相對定位,讓這個列表顯示在“select”下方
對li列表添加事件,模擬下拉框的選值過程(點擊事件和鍵盤↑↓事件都要模擬)
選值完成后,要將選的值顯示到上方的“select”,并設置真正的select的值
當然,如果你想做的更復雜點,還可以添加選項搜索、多選、多選后的選項刪除等。當時一般原理都跟上面差不多。網上也有很多這樣的插件。但使用網上的插件要注意測試瀏覽器的兼容性,功能越復雜的模擬select,兼容性越不好做
 
如果,你的程序不需要那么復雜的select,那么設置透明度的第二種方案也許適合你。今天要分享給大家的也是這個方案。
它的原理如下:
 
 
找到當前頁面的select,將其透明度設置為0.使其看不見,但是可以點擊并選值
創建一個div,使用相對定位,放置到select下方 ,并通過css控制使其看起來像一個select。為什么一定要放在下方呢?因為這樣,我們可以點擊真正的select,而用戶看起來像是點擊的這個模擬的select,因為真正的select是完全透明的。如果放置在上方,則用戶點擊的是這個模擬的select,真正的select不會展開!?。?br />設置div的text為select的值
添加事件,使真正的select選值后,將值顯示到模擬的div上
 
 
先上代碼吧:
 

( function ($){var selectFix= function (){var select=$( this );//設置透明度為0 當然你也可以使用css控制 使用Jquery設置透明度可以屏蔽 透明度的 瀏覽器兼容性問題$(select).css({"opacity" :0});//找到select的選項var sOptions= this .get(0).options;//設置模擬select的值var setFixDivText= function (selectValue){var text= "" ;for ( var i=0;i<sOptions.length;i++){var option=sOptions[i];if (option.value==selectValue){text=$(option).text();break ;}}return text;};//模擬的select//初始化時要將select的值傳入var selectFixDiv=$( '<div id="J_selectFix_' +select.attr("id ")+'" class = "selectFix" >'+setFixDivText($(select).val())+ '</div>' );select.after(selectFixDiv);var left=$(select).offset().left;var top=$(select).offset().top-1; //因為一般select都有1px的邊框,所以這里往上拉1px$(selectFixDiv).css({"top" : top,"left" : left});//select選值時,將值顯示到模擬的select上$(select).bind( "change click" , function (){$(selectFixDiv).text(setFixDivText($( this ).val()));});};$.fn.selectFix=selectFix;})(jQuery);
(function($){   var selectFix=function(){     var select=$(this);     //設置透明度為0 當然你也可以使用css控制 使用Jquery設置透明度可以屏蔽 透明度的 瀏覽器兼容性問題     $(select).css({       "opacity":0     });     //找到select的選項     var sOptions=this.get(0).options;     //設置模擬select的值     var setFixDivText=function(selectValue){       var text="";       for(var i=0;i<sOptions.length;i++){         var option=sOptions[i];         if(option.value==selectValue){           text=$(option).text();           break;         }       }       return text;     };      //模擬的select     //初始化時要將select的值傳入     var selectFixDiv=$('<div id="J_selectFix_'+select.attr("id")+'" class="selectFix">'+setFixDivText($(select).val())+'</div>');     select.after(selectFixDiv);      var left=$(select).offset().left;     var top=$(select).offset().top-1;//因為一般select都有1px的邊框,所以這里往上拉1px     $(selectFixDiv).css({       "top" : top,       "left" : left     });          //select選值時,將值顯示到模擬的select上     $(select).bind("change click",function(){       $(selectFixDiv).text(setFixDivText($(this).val()));     });   };   $.fn.selectFix=selectFix; })(jQuery); 

 
 
插件代碼運行:
 

jQuery(document).ready( function () {var selects=$( "select.selectInput" );if (selects.length){selects.each( function (){$( this ).selectFix();});}});jQuery(document).ready(function() {   var selects=$("select.selectInput");   if(selects.length){     selects.each(function(){       $(this).selectFix();     });   } }); 

下面是html代碼:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >< HTML >< HEAD >< TITLE > New Document </ TITLE >< META NAME = "Generator" CONTENT = "EditPlus" >< META NAME = "Author" CONTENT = "" >< META NAME = "Keywords" CONTENT = "" >< META NAME = "Description" CONTENT = "" >< script type = text /javascript src = "http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js" > </ script >< script type = text /javascript src = "temp.js" > </ script >< style >html {font-family: "宋體";font-size: 12px;line-height: 25px;color: #6F6F6F;}.dn {display: none;}select{cursor: pointer;}input,select,textarea,.selectFix {background: white;border: 1px solid #E0E0E0;hide-focus: expression( this.hideFocus = true ); outline: none;}.formText,.selectInput,.text,.selectFix{border: 1px solid #CCC;width: 180px;height: 30px;line-height:30px;padding: 0 3px;}.selectInput {width: 248px; font-size:13px; position: relative; z-index: 2;}.selectFix{width:248px; background: url(selectBg.png) no-repeat; background-position: right; background-color: #fff; position:absolute; z-index: 1;}</ style ></ HEAD >< BODY >< div id = "main" >< select id = "sex" class = "selectInput" name = "sex" >< option value = "0" > 男 </ option >< option value = "1" > 女 </ option ></ select ></ div ></ BODY ></ HTML ><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <META NAME="Generator" CONTENT="EditPlus"> <META NAME="Author" CONTENT=""> <META NAME="Keywords" CONTENT=""> <META NAME="Description" CONTENT="">  <script type=text/javascript src="http://ajax.googleapis.com/ajax/libs/jquery/1.6/jquery.min.js"></script>  <script type=text/javascript src="temp.js"></script>   <style> html {font-family: "宋體";font-size: 12px;line-height: 25px;color: #6F6F6F;} .dn {display: none;} select{cursor: pointer;} input, select, textarea, .selectFix {background: white;border: 1px solid #E0E0E0;hide-focus: expression(this.hideFocus=true); outline: none;} .formText, .selectInput, .text, .selectFix{border: 1px solid #CCC;width: 180px;height: 30px;line-height:30px;padding: 0 3px;} .selectInput {width: 248px; font-size:13px; position: relative; z-index: 2;} .selectFix{width:248px; background: url(selectBg.png) no-repeat; background-position: right; background-color: #fff; position:absolute; z-index: 1;}  </style> </HEAD>  <BODY> <div id="main">   <select id="sex" class="selectInput" name="sex">     <option value="0">男</option>     <option value="1">女</option>   </select> </div> </BODY> </HTML> 

兼容主流瀏覽器。
 
 
但也還是有個重大的缺陷,在老版本的ie中,真正select的高度還是無法撐開。所以,用戶點擊模擬的select的靠下方的位置會發現select無法展開!!
不過設計的藝術在于平衡,如果你無法忍受這個缺陷,可以使用第一種解決方案。
 
 
另外,在測試后,發現如果select處于一個隱藏的容器中,那么顯示后,select的位置是一個空白?。?br />這是怎么回事呢?!
原來,html元素隱藏后是無法獲取他的屏幕坐標的?。?! 所以這時候顯示出來,真正的select完全透明了,而模擬的select跑到屏幕的左上角去了。因為他獲取select的坐標為(0,0)
 
 
不要著急,這個問題有下面的解決辦法:
1、單獨寫代碼觸發select的美化程序
首先,你需要將上面的美化程序運行代碼做以下修改:
 

jQuery(document).ready( function () {var selects=$( "select.selectInput" );if (selects.length){selects.each( function (){if (!($( this ).attr( "autoFix" )== "false" )){$( this ).selectFix();}});}});jQuery(document).ready(function() {   var selects=$("select.selectInput");   if(selects.length){     selects.each(function(){       if(!($(this).attr("autoFix")=="false")){         $(this).selectFix();       }     });   } }); 

然后,在隱藏的select上加屬性autoFix="false":

< select id = "sex" class = "selectInput" name = "sex" autoFix = "false" >< option value = "0" > 男 </ option >< option value = "1" > 女 </ option ></ select ><select id="sex" class="selectInput" name="sex" autoFix="false">     <option value="0">男</option>     <option value="1">女</option>   </select> 

然后,在外部容器顯示的時候,手動調用$("#sex").selectFix()
 
2、如果容器的顯示或者隱藏是第三方插件控制,修改不方便可考慮下面的方案:
在美化程序中,先判斷select是否隱藏,如果否邏輯不變,如果隱藏,則加入一個timer,循環判斷元素是否被顯示,在其顯示的時候再自動調用fix,然后將timer移除
代碼如下:
 

//加上隱藏select的操作( function ($){var selectFix= function (){var select=$( this );//設置透明度為0 當然你也可以使用css控制 使用Jquery設置透明度可以屏蔽 透明度的 瀏覽器兼容性問題$(select).css({"opacity" :0});if (!select.is( ":hidden" )){var sOptions= this .get(0).options;var setFixDivText= function (selectValue){var text= "" ;for ( var i=0;i<sOptions.length;i++){var option=sOptions[i];if (option.value==selectValue){text=$(option).text();break ;}}return text;};var selectFixDiv=$( '<div id="J_selectFix_' +select.attr("id ")+'" class = "selectFix" status= "close" >'+setFixDivText($(select).val())+ '</div>' );select.after(selectFixDiv);var selectWidth=$(select).innerWidth();var selectFixDivWidth=$(selectFixDiv).innerWidth();var left=$(select).offset().left;var top=$(select).offset().top-1;$(selectFixDiv).css({"top" : top,"left" : left,"margin" : 0});$(select).bind( "change click" , function (){$(selectFixDiv).text(setFixDivText($( this ).val()));});} else {var tasks = function (){if (!$(select).is( ":hidden" )){$(select).selectFix();clearInterval(timer);}};var timer=setInterval(tasks,500)}};$.fn.selectFix=selectFix;})(jQuery);
//加上隱藏select的操作 (function($){   var selectFix=function(){     var select=$(this);     //設置透明度為0 當然你也可以使用css控制 使用Jquery設置透明度可以屏蔽 透明度的 瀏覽器兼容性問題     $(select).css({       "opacity":0     });      if(!select.is(":hidden")){       var sOptions=this.get(0).options;        var setFixDivText=function(selectValue){         var text="";         for(var i=0;i<sOptions.length;i++){           var option=sOptions[i];           if(option.value==selectValue){             text=$(option).text();             break;           }         }         return text;       };        var selectFixDiv=$('<div id="J_selectFix_'+select.attr("id")+'" class="selectFix" status="close">'+setFixDivText($(select).val())+'</div>');       select.after(selectFixDiv);        var selectWidth=$(select).innerWidth();       var selectFixDivWidth=$(selectFixDiv).innerWidth();       var left=$(select).offset().left;        var top=$(select).offset().top-1;       $(selectFixDiv).css({         "top" : top,         "left" : left,         "margin" : 0       });        $(select).bind("change click",function(){         $(selectFixDiv).text(setFixDivText($(this).val()));       });     }else{       var tasks = function(){         if(!$(select).is(":hidden")){           $(select).selectFix();           clearInterval(timer);         }       };       var timer=setInterval(tasks,500)     }   };   $.fn.selectFix=selectFix; })(jQuery); 

運行代碼跟原來的不變。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲va在线va天堂va国| 国产精品a久久久久久| 亚洲字幕在线观看| www.xxxx欧美| 大伊人狠狠躁夜夜躁av一区| 精品中文字幕在线观看| 大桥未久av一区二区三区| 国产成人高清激情视频在线观看| 超薄丝袜一区二区| 欧美视频专区一二在线观看| 亚洲美女在线看| 亚洲激情视频在线观看| 亚洲黄在线观看| 国产精品27p| 日韩欧美在线看| 亚洲欧美中文另类| 成人免费大片黄在线播放| 不卡av在线网站| 中文字幕亚洲欧美日韩在线不卡| 国模精品系列视频| 这里只有精品丝袜| 91在线免费观看网站| 亚洲国产天堂久久综合| 欧美一区第一页| 亚洲一区二区精品| 欧美专区中文字幕| 97不卡在线视频| 久久久国产影院| 欧美中文在线免费| 欧美激情按摩在线| 性色av一区二区三区红粉影视| 91精品在线看| 欧美综合在线第二页| 日韩美女视频中文字幕| 亚洲成人av在线| 最近2019年好看中文字幕视频| 国产成人啪精品视频免费网| 亚洲高清av在线| 欧美理论在线观看| 精品国产91久久久久久老师| 欧美性生活大片免费观看网址| 欧美肥老太性生活视频| 欧美噜噜久久久xxx| 自拍偷拍亚洲精品| 九九热视频这里只有精品| 久久6精品影院| 欧美三级免费观看| 亚洲最新中文字幕| 亚洲网站在线观看| 亚洲成人xxx| 日韩欧美精品免费在线| 欧美午夜xxx| 欧美日韩xxx| 亚洲视频第一页| 国产主播喷水一区二区| 性亚洲最疯狂xxxx高清| 超碰97人人做人人爱少妇| 亚洲精品久久久久中文字幕欢迎你| 隔壁老王国产在线精品| 中文字幕精品av| 欧美精品一区三区| 国产一区二区黑人欧美xxxx| 亚洲人成电影在线播放| 国产精品高潮呻吟久久av无限| 成人有码在线视频| 成人免费网站在线| 亚洲视频在线观看视频| 欧美极品少妇xxxxⅹ裸体艺术| 欧美精品久久一区二区| 日韩中文字幕免费视频| 九九综合九九综合| 欧美老女人www| 久久国产一区二区三区| 欧美一级片在线播放| 日韩hd视频在线观看| 欧美日韩中文字幕| 欧美高清在线视频观看不卡| 亚洲精品成人久久电影| 久久999免费视频| 亚洲r级在线观看| 91精品国产高清久久久久久久久| 精品女同一区二区三区在线播放| 国产精品视频久久久久| 欧美午夜xxx| 影音先锋欧美在线资源| 亚洲天堂av电影| 欧美综合第一页| 亚洲一区二区三区xxx视频| 日韩高清免费在线| 国产精品国产三级国产aⅴ9色| 欧美日韩在线看| 欧美国产乱视频| 色午夜这里只有精品| 欧美激情视频一区| 国产精品www网站| 亚洲国产成人精品女人久久久| 亚洲精品电影久久久| 久久99精品久久久久久噜噜| 国产精品视频男人的天堂| 亚洲国产成人精品电影| 国产精品99久久久久久久久| 91精品国产综合久久久久久久久| 精品福利在线视频| 中国人与牲禽动交精品| 国产精品一久久香蕉国产线看观看| 日产精品99久久久久久| 亚洲色图校园春色| 最近2019中文字幕大全第二页| 精品日本美女福利在线观看| 欧美激情视频一区| 国产成+人+综合+亚洲欧美丁香花| 亚洲自拍欧美另类| 国产日韩欧美在线观看| 一个人看的www欧美| 97精品一区二区三区| 国产精品无码专区在线观看| 欧美成人第一页| 国产精品网站视频| 久久久噜噜噜久噜久久| 日本亚洲精品在线观看| 人人爽久久涩噜噜噜网站| 国产主播喷水一区二区| 91成人性视频| 欧美日韩国产丝袜另类| 亚洲片国产一区一级在线观看| 久热精品视频在线观看| 日韩欧美999| 国产成人亚洲综合青青| 亚洲欧美国产一本综合首页| 亚洲精品xxx| 中文字幕亚洲综合久久| 成人免费高清完整版在线观看| 神马久久久久久| 欧美日韩性生活视频| 精品丝袜一区二区三区| 亚洲综合社区网| 91黄色8090| 黄色成人在线播放| 另类天堂视频在线观看| 欧美电影在线免费观看网站| 欧美激情女人20p| 国产精品大片wwwwww| 国产精品视频一| 日韩免费看的电影电视剧大全| 久久久国产精品亚洲一区| 欧美成人免费全部观看天天性色| 91色视频在线导航| 亚洲成人激情视频| 国产九九精品视频| 亚洲精品91美女久久久久久久| 91精品国产91久久久久久不卡| 最近更新的2019中文字幕| 国产午夜精品一区二区三区| 欧美特黄级在线| 亚洲精品久久7777777| 国产精品v片在线观看不卡| 国产91久久婷婷一区二区| 中文欧美日本在线资源| 久久乐国产精品| 国产精品爽爽爽爽爽爽在线观看| 激情亚洲一区二区三区四区| 中文字幕欧美视频在线| 亚洲欧美日韩在线一区| 国产中文欧美精品|