CSS 下拉框特效

demo.gif

想要制作這么一個效果還是比較麻煩的鳍怨,但是代碼并不難理解串结。首先哑子,來看看 Html 代碼。

<div class="container">
    <div class="heading">
        <h2>Custom Select</h2>
    </div>

    <div class="select">
        <p>Please select</p>
        <ul>
            <li data-value="HTML5">HTML5</li>
            <li data-value="CSS3">CSS3</li>
            <li data-value="JavaScript">JavaScript</li>
            <li data-value="JQuery">JQuery</li>
            <li data-value="Backbone">Backbone</li>
        </ul>
    </div>
</div>

可見肌割,我們并沒有利用原生的 select 元素卧蜓,而是利用其它元素來模擬這個效果。我們?yōu)?li 元素指定了 data-value,主要是接下來我們會用 JQuery 獲取選中值并將其放置到 p 元素下把敞。

下面逐步來看 CSS 代碼烦却。

    * {
        margin: 0;
        padding: 0;
    }

    html {
        font-family: 'Terminal';
        font-size: 62.5%;
    }

    body {
        background-color: #33CC66;
    }
  1. 將網(wǎng)頁中所有元素的外邊距和內(nèi)邊距設置為 0
  2. 將網(wǎng)頁中的默認字體設置為 Terminal先巴,字體大小設置為 62.5%, 也就是 10px其爵。
  3. 設置背景顏色為 #33CC66
 <link  rel='stylesheet' type='text/css'>

上面我們用到了 Terminal 字體伸蚯,而且接下來我們還會使用 Lobster 字體摩渺,所以用這行代碼添加引用。

    .heading, .select {
        display: block;
        width: 22rem;
        margin: 0 auto;
        text-align: center;
    }

    .heading {
        width: 28rem;
        margin-top: 10rem;
        margin-bottom: 2rem;
    }

    .heading h2 {
        font-size: 6rem;
        font-family: 'Lobster';
        color: #ffffff;
    }
  1. 指定 headng, select 寬度并指定其水平居中剂邮。
  2. 修改 heading 的寬度摇幻,主要是為了讓其寬度大于 select 的寬度,顯得更加美觀挥萌。然后指定其上外邊距和下外邊距绰姻。
  3. 設置 headingh2 元素的字體和字體大小,顏色引瀑。
.select > p, .select ul {
        background-color: #ffffff;
        font-size: 2rem;
        border: 1px solid bisque;
        border-radius: 5px;
        margin-bottom: 0;
    }

.select > p {
        text-align: left;
        padding: 1rem;
        position: relative;
        border-bottom-right-radius: 0;
        border-bottom-left-radius: 0;
        cursor: pointer;
        color: rgba(102, 102, 102, .6);
    }
.select > p:after {
        display: block;
        width: 10px;
        height: 10px;
        content: '';
        position: absolute;
        top: 1.4rem;
        right: 2rem;
        border-bottom: 1px solid #33CC66;
        border-left: 1px solid #33CC66;
        transform: rotate(-45deg);
        transition: transform .3s ease-out, top .2s ease-out;
    }
  1. 設置 pul 元素的背景顏色和邊框等設置狂芋。
  2. p 元素單獨指定樣式,并設置其 position 屬性憨栽,主要是為了下面繪制右側的下拉按鈕帜矾。
  3. 利用 :afterp 元素的右方繪制下拉按鈕翼虫,可以看出來,我們是利用左下邊框然后旋轉 -45 度 模擬的這個效果屡萤。值得注意的是珍剑,我們需要將其 display 設置為 block,并且設置寬高死陆,否則看不到 這個效果招拙。
    .select ul {
        margin-top: 0;
        border-top-left-radius: 0;
        border-top-right-radius: 0;
        list-style-type: none;
        cursor: pointer;
        overflow-y: auto;
        max-height: 0;
        transition: max-height .3s ease-out;
    }

    .select ul li {
        padding-left: 0.5rem;
        display: block;
        line-height: 3rem;
        text-align: left;
    }   
  1. 設置 ul 的一些默認屬性,并將其設置最大寬度為 0措译,指定 overflow-yauto 别凤,這個時候ul 將會被隱藏。
  2. 在這里設置的時候我遇到了一個問題瞳遍,就是 li 標簽始終占不滿 ul 的一行闻妓,那是因為其默認有 marginpadding 菌羽,所以在一開始的時候就將網(wǎng)頁中所有元素的外邊距和內(nèi)邊距設置成了 0掠械。
    .select.open ul {
        max-height: 20rem;
        transform-origin: 50% 0;
        -webkit-animation: slide-down .5s ease-in;
    }

    .select.open > p:after {
        position: absolute;
        top: 1.6rem;
        transform: rotate(-225deg);
        transition: transform .3s ease-in, top .2s ease-in;
    }
  1. open 設置最大高度,并為其指定動畫效果注祖。
  2. 將下拉按鈕旋轉 -225 度猾蒂,并為其指定動畫。

下面我們看看為 ul 元素指定的 slide-down 動畫效果是晨,這也是這個下拉特效的關鍵所在肚菠。

    @-webkit-keyframes slide-down {
        0% {
            transform: scale(1, 0);
        }
        25% {
            transform: scale(1, 1.25);
        }
        50% {
            transform: scale(1, 0.75);
        }
        75% {
            transform: scale(1, 1.1);
        }
        100% {
            transform: scale(1, 1);
        }
    }

看到以上代碼可能就都明白了,就是不斷改變 ul 的大小罩缴,讓其在 0.75-1.25 之間進行縮放蚊逢,所以就會有那個跳動的效果了。

下面還有一些簡單的 CSS 代碼箫章,不再解釋烙荷。

    .select ul li:hover {
        background-color: rgba(102, 153, 102, 0.4);
    }

    .select .selected {
        background-color: rgba(102, 153, 102, 0.8);
    }

CSS 講完了,下面就可以看看我們是如何利用 JQuery 控制這個效果的檬寂。

我們并不需要下載 JQuery 就可以使用终抽,因為現(xiàn)在已經(jīng)有很多網(wǎng)站提供了 CDN 服務,比如我使用的 BootCDN桶至。

<script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>

下面就可以使用 JQuery 了昼伴。

<script>
    $(document).ready(function () {
        $('.select ul li').on("click", function (e) {
            var _this = $(this);
            $('.select >p').text(_this.attr('data-value'));
            $(_this).addClass('selected').siblings().removeClass('selected');
            $('.select').toggleClass('open');
            cancelBubble(e);
        });

        $('.select>p').on("click", function (e) {
            $('.select').toggleClass('open');
            cancelBubble(e);
        });

        $(document).on('click', function () {
            $('.select').removeClass('open');
        })
    })

    function cancelBubble(event) {
        if (event.stopPropagation) {
            event.preventDefault();
            event.stopPropagation();
        } else {
            event.returnValue = false;
            event.cancelBubble();
        }
    }
</script>
  1. 首先為 p 標簽綁定 click 事件膝捞,在觸發(fā)的時候美浦,為 select 添加或移除 open class, 也就是將 ul 顯示出來。
  2. li 綁定 click 事件且改,當選中了一個 li 元素的時候女蜈,首先獲取到 data-value描沟,然后將其賦值給 p 標簽飒泻,然后為選中的 li 添加 selected class,與此同時利用 siblings() 方法,讓兄弟節(jié)點的 selected class 移除吏廉。
  3. document 設置click 事件泞遗,當我們點擊網(wǎng)頁中任何一處地方的時候,如果 ul 是打開的席覆,就將其關閉史辙,不過這個時候由于所有元素都在 document 內(nèi),所以我們需要阻止事件冒泡佩伤,調(diào)用自己寫的 cancelBubble() 方法聊倔。

好了,就講到這里生巡,有不理解的可在下方留言耙蔑。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市孤荣,隨后出現(xiàn)的幾起案子甸陌,更是在濱河造成了極大的恐慌,老刑警劉巖盐股,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钱豁,死亡現(xiàn)場離奇詭異,居然都是意外死亡疯汁,警方通過查閱死者的電腦和手機牲尺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幌蚊,“玉大人谤碳,你說我怎么就攤上這事∫缍梗” “怎么了蜒简?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沫换。 經(jīng)常有香客問我臭蚁,道長,這世上最難降的妖魔是什么讯赏? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任垮兑,我火速辦了婚禮,結果婚禮上漱挎,老公的妹妹穿的比我還像新娘系枪。我一直安慰自己,他們只是感情好磕谅,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布私爷。 她就那樣靜靜地躺著雾棺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衬浑。 梳的紋絲不亂的頭發(fā)上捌浩,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音工秩,去河邊找鬼尸饺。 笑死,一個胖子當著我的面吹牛助币,可吹牛的內(nèi)容都是我干的浪听。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼眉菱,長吁一口氣:“原來是場噩夢啊……” “哼迹栓!你這毒婦竟也來了?” 一聲冷哼從身側響起俭缓,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤克伊,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后尔崔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體答毫,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡褥民,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年季春,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片消返。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡载弄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出撵颊,到底是詐尸還是另有隱情宇攻,我是刑警寧澤,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布倡勇,位于F島的核電站逞刷,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏妻熊。R本人自食惡果不足惜夸浅,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扔役。 院中可真熱鬧帆喇,春花似錦、人聲如沸亿胸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至婉刀,卻和暖如春吟温,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背突颊。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工溯街, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洋丐。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓呈昔,卻偏偏與公主長得像,于是被迫代替她去往敵國和親友绝。 傳聞我的和親對象是個殘疾皇子堤尾,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

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

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,737評論 1 92
  • 學習CSS的最佳網(wǎng)站沒有之一 http://www.w3school.com.cn/tags/index.asp ...
    Amyyy_閱讀 1,033評論 0 1
  • 本文主要是起筆記的作用迁客,內(nèi)容來自慕課網(wǎng). 認識CSS樣式 CSS全稱為“層疊樣式表 (Cascading Styl...
    0o凍僵的企鵝o0閱讀 2,630評論 0 30
  • 一 外部式css樣式 (也可稱為外聯(lián)式)就是把css代碼寫一個單獨的外部文件中郭宝,這個css樣式文件以“.css...
    KunMitnic閱讀 933評論 0 1
  • 本課來自http://www.imooc.com/learn/9請不要用作商業(yè)用途。 HTML5 HTML介紹 H...
    PYLON閱讀 3,212評論 0 5