select表單元素詳解及下拉列表模擬實(shí)現(xiàn)

圖書(shū)館前
圖書(shū)館前

原文地址:→看過(guò)來(lái)

寫(xiě)在前面

select 是HTML表單元素中很常用的一個(gè)著蟹,其中很重要的幾個(gè)屬性常被忽略,但這幾個(gè)屬性卻能幫助我們完成很多的功能梢莽,當(dāng)然萧豆,select下拉列表默認(rèn)樣式很不友好,所以更多的時(shí)候可以自己模擬實(shí)現(xiàn)一個(gè)同樣功能的下拉菜單昏名。下文先介紹select標(biāo)簽的一些屬性及使用涮雷,后面再模擬一個(gè)相同效果的下拉菜單。

介紹之前先看下demo預(yù)覽圖:

  1. firefox下select的默認(rèn)樣式:


    firefox-default
  2. chrome下select的默認(rèn)樣式:


    chrome-default
  3. firefox下自定義select下拉列表的icon效果:


    firefox-self
  4. chrome下自定義select下拉列表的icon效果:


    chrome-self
  5. 原生js模擬select下拉列表的實(shí)現(xiàn)效果(chrome及firefox效果一致):


    模擬select

源代碼地址→傳送門(mén)

預(yù)覽地址→傳送門(mén)

1. select表單元素及相關(guān)屬性(我只是大自然的搬運(yùn)工)

  • 提示
    select 元素是一種表單控件轻局,可用于在表單中接受用戶輸入

  • 支持的全局屬性

    • 僅挑幾個(gè)屬性
    • autofocus(其值為autofocus): 規(guī)定在頁(yè)面加載后文本區(qū)域自動(dòng)獲得焦點(diǎn)洪鸭。
    • disabled(值為disabled): 規(guī)定禁用該下拉列表膜钓。
    • form(值為form_id): 規(guī)定文本區(qū)域所屬的一個(gè)或多個(gè)表單。
    • multiple(值為multiple): 規(guī)定可選擇多個(gè)選項(xiàng)卿嘲。
  • 支持的事件屬性

    • 挑一個(gè)最常用到的額
    • onchange:當(dāng)select改變選擇時(shí)調(diào)用的事件句柄颂斜。(可以實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的效果)
  • selected對(duì)象的屬性及方法

    • 挑幾個(gè)重要的額
    • options[]:返回包含下拉列表中的所有選項(xiàng)的一個(gè)數(shù)組。
    • length:返回下拉列表中的選項(xiàng)數(shù)目拾枣。
    • selectIndex:設(shè)置或返回下拉列表中被選項(xiàng)目的索引號(hào)沃疮。
    • add(): 向下拉列表添加一個(gè)選項(xiàng)。
    • remove(): 從下拉列表中刪除一個(gè)選項(xiàng)梅肤。
  • option標(biāo)簽

    • option元素定義下拉列表中的一個(gè)選項(xiàng)(一個(gè)條目)司蔬。
    • disabled(值為disabled):規(guī)定此選項(xiàng)應(yīng)在首次加載時(shí)被禁用。
    • label(值為text):定義當(dāng)使用 <optgroup> 時(shí)所使用的標(biāo)注姨蝴。
    • selected)(值為selected):規(guī)定選項(xiàng)(在首次顯示在列表中時(shí))表現(xiàn)為選中狀態(tài)俊啼。
    • value(text): 定義送往服務(wù)器的選項(xiàng)值。
  • option對(duì)象的屬性

    • 幾個(gè)比較重要的額
    • defaultSelected:返回 selected 屬性的默認(rèn)值左医。
    • disabled:設(shè)置或返回選項(xiàng)是否應(yīng)被禁用授帕。
    • index:返回下拉列表中某個(gè)選項(xiàng)的索引位置。
    • selected:設(shè)置或返回 selected 屬性的值浮梢。

注意

  1. select本身的樣式可用css設(shè)置跛十,但對(duì)option設(shè)置的樣式在chrome中不起作用,在Firefox可行
  2. w3c官網(wǎng)的詳細(xì)解釋 → 傳送門(mén)

2. HTML標(biāo)簽自定義屬性(純屬題外話)

HTML5 data-*自定義屬性:添加data-前綴使屬性變成自定義屬性秕硝,最大的好處是我們可以把所有自定義屬性在dataset對(duì)象中統(tǒng)一管理芥映。

<div id="student" data-weight="98">點(diǎn)擊顯示</div>

var student = document.getElementById("student");
student.dataset.cm = '168'; //設(shè)置自定義屬性
var stuWeight = studdent.dataset.weight; //獲取自定義屬性值

student.dataset.birthDate = '19980612';  //連字符的自定義屬性 (例如設(shè)置data-birth-date)

3. 自定義下拉列表的圖標(biāo)

select默認(rèn)樣式中的下拉按鈕不是很好看,我們可以自己用替張圖片替換掉远豺。(效果看文章上面的鏈接奈偏,請(qǐng)忽略我的丑丑的圖標(biāo)額)

  1. 對(duì)select自定義圖標(biāo)時(shí)需要設(shè)置apperance屬性為none(隱藏原有小三角),并做兼容
  2. 加上將要替換的自定義圖標(biāo)即可
select{
    -webkit-appearance: none; /*隱藏默認(rèn)樣式中的小三角*/
    -moz-appearance: none;
    background: url('http://opif0c56u.bkt.clouddn.com/select.gif') no-repeat scroll right 8px center; 
}
  1. 可對(duì)option添加背景色
  2. 在firefox中可使用偽元素:before對(duì)option添加序號(hào)(此處插播一個(gè)css添加序號(hào)的方法)
select{
    counter-reset: item; //類似于聲明計(jì)數(shù)變量(聲明在父元素中)
}
select option:before {
    counter-increment: item;   //要使用的計(jì)數(shù)名
    content: counter(item) " . "; //追加前置序號(hào),chrome對(duì)option的設(shè)置中不起作用
}

4. js模擬select下拉菜單(重頭戲)

許多時(shí)候會(huì)覺(jué)得select表單特別的不好用躯护,不能自己添加很多的樣式惊来,小伙伴們還是自己模擬一個(gè)吧!

  1. html代碼結(jié)構(gòu):
<div id="sel-wrap">
    <div id="sel-show">=請(qǐng)選擇=</div>
    <ul id="sel-option">
        <li class="item">早上吃包子</li>
        <li class="item">中午吃米飯</li>
        <li class="item">晚上吃面條</li>
        <li class="item">宵夜吃燒烤</li>
        <li class="item">睡前喝牛奶</li>
    </ul>
</div>
  1. 下拉按鈕的圖標(biāo)跟上面自定義的方式一致(這里不再說(shuō)了)榛做。

  2. hover到li上時(shí)唁盏,利用偽元素:before追加一個(gè)對(duì)勾内狸。

#sel-option li:hover:before {
    content: '\2714' ' ';  //此處為對(duì)勾+空格
    }
  1. 下面說(shuō)下實(shí)現(xiàn)原理:
    • 下拉菜單的選項(xiàng)為ul中的內(nèi)容检眯,需要先隱藏起來(lái),且顯示的時(shí)候是浮在其他內(nèi)容的上面昆淡,此處需要使用position來(lái)實(shí)現(xiàn)锰瘸。(即脫離文檔流)
#sel-wrap{
    position: relative;  //設(shè)置父元素
}
#sel-option{
    position: absolute;  //設(shè)置下拉列項(xiàng)的包裹層
}
  • 點(diǎn)擊下拉框時(shí)顯示下拉列表項(xiàng)
var flag = false;    //初始化一個(gè)flag標(biāo)記
selShow.onclick = function () {
        flag = !flag;
        if (flag == true) {
            selOption.style.display = 'block';
        } else {
            selOption.style.display = 'none';
        }
    };
  • 點(diǎn)擊列表項(xiàng)時(shí)將選中值傳遞給下拉框并顯示,同時(shí)下拉項(xiàng)收起(此處的點(diǎn)擊事件綁定在父元素中)
  selOption.onclick = function (e) {
        var ev = e || window.event;
        var target = ev.target || ev.srcElement;
        if (target && target.nodeName == 'LI') {
            selShow.innerText = target.innerText;
            selOption.style.display = 'none';
            flag = false;
        }
    };
  • 當(dāng)下拉項(xiàng)顯示并未選中任何下拉項(xiàng)時(shí)昂灵,點(diǎn)擊下拉框收起下拉項(xiàng)

  • 當(dāng)下拉項(xiàng)顯示并未選中任何下拉項(xiàng)時(shí)避凝,點(diǎn)擊下拉項(xiàng)以外的任意位置舞萄,收起下拉框(將事件綁定在body上)

bd.onclick = function (ev) {
      var e = ev || event;
      var target = e.target || e.srcElement;
      if (target && target.id != 'sel-option' && target.id != 'sel-show' && target.className != 'item') {
       selOption.style.display = 'none';
            flag = false;
        } else {
            return false;
        }

        if (e && e.stopPropagation) {//阻止冒泡
            e.stopPropagation();
        } else {
            window.event.cancelBubble = true;
        }
    };

  • 最終實(shí)現(xiàn)(樣式什么的都可以隨便改):
最終樣式

小結(jié)

  1. 小花作為菜鳥(niǎo)第一次自己模擬下拉列表的實(shí)現(xiàn),有可能存在代碼欠缺管削,但是為了方便以后使用的時(shí)候查詢倒脓,所以就記錄下
  2. 歡迎大佬們指點(diǎn)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市含思,隨后出現(xiàn)的幾起案子崎弃,更是在濱河造成了極大的恐慌,老刑警劉巖含潘,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饲做,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遏弱,警方通過(guò)查閱死者的電腦和手機(jī)盆均,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)漱逸,“玉大人泪姨,你說(shuō)我怎么就攤上這事∈问悖” “怎么了驴娃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)循集。 經(jīng)常有香客問(wèn)我唇敞,道長(zhǎng),這世上最難降的妖魔是什么咒彤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任疆柔,我火速辦了婚禮,結(jié)果婚禮上镶柱,老公的妹妹穿的比我還像新娘旷档。我一直安慰自己,他們只是感情好歇拆,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布鞋屈。 她就那樣靜靜地躺著,像睡著了一般故觅。 火紅的嫁衣襯著肌膚如雪厂庇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,816評(píng)論 1 290
  • 那天输吏,我揣著相機(jī)與錄音权旷,去河邊找鬼。 笑死贯溅,一個(gè)胖子當(dāng)著我的面吹牛拄氯,可吹牛的內(nèi)容都是我干的躲查。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼译柏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼镣煮!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起鄙麦,我...
    開(kāi)封第一講書(shū)人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤怎静,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后黔衡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蚓聘,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年盟劫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夜牡。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡侣签,死狀恐怖塘装,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情影所,我是刑警寧澤蹦肴,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站猴娩,受9級(jí)特大地震影響阴幌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卷中,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一矛双、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蟆豫,春花似錦议忽、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至帮辟,卻和暖如春速址,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背织阅。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工壳繁, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荔棉。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓闹炉,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親润樱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子渣触,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)、插件壹若、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,064評(píng)論 4 62
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理嗅钻,服務(wù)發(fā)現(xiàn),斷路器店展,智...
    卡卡羅2017閱讀 134,633評(píng)論 18 139
  • 有位姑娘咨詢歐巴养篓,說(shuō)自己想去韓國(guó)結(jié)婚,不知道這種情況應(yīng)該申請(qǐng)什么簽證赂蕴,這個(gè)是分兩種情況的柳弄,主要看您是否要在韓國(guó)長(zhǎng)期...
    漢紙心的小驢人閱讀 1,373評(píng)論 0 0
  • 自定義flowlayout實(shí)現(xiàn)分頁(yè) collectionView 分頁(yè) & 偏移位置 collectionView...
    xiari1991閱讀 328評(píng)論 0 0
  • 馬拉松比賽里的兔子,其實(shí)說(shuō)的是領(lǐng)跑員概说,按照一定的配速碧注,在指定時(shí)間前后兩分鐘內(nèi)跑完全程才能算是合格。因?yàn)樵诒荣愔刑桥猓I(lǐng)...
    白大炮閱讀 375評(píng)論 0 0