進(jìn)階10 事件的應(yīng)用

1: 實(shí)現(xiàn)如下圖Tab切換的功能

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>tab切換</title>
  <style>
    * {
      box-sizing: border-box;
    }

    ul,
    li {
      margin: 0;
      padding: 0;
      list-style: none;
    }

    .tab-ct .header>li {
      width: 50px;
      height: 30px;
      line-height: 30px;
      text-align: center;
      border: 1px solid #ccc;
      display: inline-block;
      margin-right: -5px;
      border-right: none;
      cursor: pointer;
    }

    .tab-ct .header>li:last-child {
      border-right: 1px solid #ccc;
    }

    .tab-ct .header>li.active {
      background: #a5daa6;
    }

    .tab-ct .content>li {
      width: 149px;
      height: 100px;
      border: 1px solid #ccc;
      background: #f5daa6;
      border-top: none;
      padding: 10px;
      display: none;
    }

    .tab-ct .content>li.active {
      display: block;
    }
  </style>
</head>

<body>
  <div class="tab-ct">
    <ul class="header">
      <li class="active">tab1</li>
      <li>tab2</li>
      <li>tab3</li>
    </ul>
    <ul class="content">
      <li class="active">我是tab1內(nèi)容</li>
      <li>我是tab2內(nèi)容</li>
      <li>我是tab3內(nèi)容</li>
    </ul>
  </div>

  <script>
    var tabs = document.querySelectorAll('.tab-ct .header>li')
    var panels = document.querySelectorAll('.tab-ct .content>li')
    
    // for(var i = 0; i < tabs.length; i++){       // 使用for循環(huán)去遍歷也可以
    //   tabs[i].addEventListener('click', function(){
    //     console.log(this)
    //   })
    // }

    tabs.forEach(function(tab){ //使用遍歷部念,給tabs 里的 每一個(gè)tab (li) 綁定事件
      tab.addEventListener('click', function(){
        tabs.forEach(function(node){ //遍歷的時(shí)候缘滥,每一次薪棒,先再來個(gè)遍歷金砍,去除所有的active class
          node.classList.remove('active')
        }) // this之外, 還可以是e.target  window.event.target
        this.classList.add('active') // 然后給當(dāng)前的tab添加active

        // 接下來贬派,點(diǎn)擊header 里面的li,如何對(duì)應(yīng)上 content里面的li
        // 這就需要知道點(diǎn)擊的是第幾個(gè)li澎媒,有兩種方法:
        // this 看索引號(hào) 搞乏, 獲得數(shù)組循環(huán)對(duì)比
        var index = [].indexOf.call(tabs, this) //找到當(dāng)前l(fā)i的index
        panels.forEach(function(node){ //同上,先去除content里面所有l(wèi)i的active class
          node.classList.remove('active')
        })
        panels[index].classList.add('active') //給與tab對(duì)應(yīng)的content li添加active
      })
    })

    // 注意點(diǎn)
    // 1. 數(shù)組遍歷要熟練戒努, 2. classList操作要熟練 3. 綁定事件
  </script>
</body>
</html>

完成效果

2. 實(shí)現(xiàn)下圖的模態(tài)框功能查描,點(diǎn)擊模態(tài)框不隱藏,點(diǎn)擊關(guān)閉以及模態(tài)框以外的區(qū)域模態(tài)框隱藏

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <style>
    .modal-dialog {
      display: none;
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background:rgba(0,0,0,0.7);
    }

    .modal-dialog .bt {
      display: inline-block;
      padding: 3px 6px;
      border: 1px solid #ccc;
      border-radius: 3px;
      font-size: 14px;
    }

    .modal-dialog a {
      text-decoration: none;
      color:deepskyblue;
    }
    /* 下面的cover柏卤,是為了展示整個(gè)modal冬三,所添加的cover,上面的區(qū)別在于缘缚,沒有display: none; 
    這里提供參考勾笆,在css最末尾用了個(gè)較為簡單明了的方法,可以滿足目前的簡單需求 */
    /* .modal-dialog .cover {
      position: fixed;
      top: 0;
      left: 0;
      right: 0;
      bottom: 0;
      background-color: #000;
      opacity: 0.5;
      z-index: 99;
    } */
    .modal-dialog .modal-ct {
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      width: 300px;
      border: 1px solid #ccc;
      border-radius: 5px;
      background: #fff;
      z-index: 100;
    }
    .modal-dialog .modal-ct .header {
      position: relative;
      height: 36px;
      line-height: 36px;
      border-bottom: 1px solid #ccc;
    }
    .modal-dialog .modal-ct .header h3 {
      margin: 0;
      padding-left: 10px;
      font-size: 16px;
    }
    .modal-dialog .modal-ct .header .close {
      position: absolute;
      right: 10px;
      top: 10px;
      line-height: 1;
    }
    .modal-dialog .modal-ct .content {
      padding: 10px;
    }
    .modal-dialog .modal-ct .footer {
      padding: 10px;
      border-top: 1px solid #eee;
    }
    .modal-dialog .modal-ct .footer:after {
      content: '';
      display: table;
      clear: both;
    }
    .modal-dialog .modal-ct .footer .btn {
      float: right;
      margin-left: 10px;
    }

    .open {
      display: block;
    }
  </style>
</head>
<body>
  <div class="btn-group">
    <button id="btn-modal">點(diǎn)我1</button>
  </div>

  <div id="modal-1" class="modal-dialog">
    <div class="modal-ct">
      <div class="header">
        <h3>我是標(biāo)題1</h3>
        <a href="#" class="close">x</a>
      </div>
      <div class="content">
        <p>我是第一段</p>
        <p>我是第二段</p>
      </div>
      <div class="footer">
        <a href="#" class="btn btn-confirm">確定</a>
        <a href="#" class="btn btn-cancel">取消</a>
      </div>
    </div>
  </div>

  <script>
    var btn = document.querySelector('#btn-modal'),
      modal = document.querySelector('#modal-1'),
      modalCt = document.querySelector('#modal-1 .modal-ct'),
      close = document.querySelector('#modal-1 .close'),
      btnConfirm = document.querySelector('.btn-confirm'),
      btnCancel = document.querySelector('.btn-cancel')

    btn.addEventListener('click', function(){ //默認(rèn)模態(tài)框隱藏桥滨,現(xiàn)在要展示 加clas或操作style(最好前者 比如加個(gè)open)
      modal.classList.add('open')
    })

    // 聲明一個(gè)事件處理函數(shù)窝爪,以便 x  確定 取消, 都能綁定相同的操作
    function handler(){
      modal.classList.remove('open')
    }
    close.addEventListener('click', handler)
    btnConfirm.addEventListener('click', handler)
    btnCancel.addEventListener('click', handler)

    // 現(xiàn)在希望點(diǎn)擊模態(tài)框以外的齐媒,也能消失
    modal.addEventListener('click', function(){
      modal.classList.remove('open')
    })
    // 但是點(diǎn)擊到里面的 ct容器蒲每,會(huì)向上冒泡,從而也會(huì)隱藏modal喻括,所以需要取消ct的事件冒泡
    modalCt.addEventListener('click',function(e){
      e.stopPropagation()
    })
  </script>

</body>
</html>

完成效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末邀杏,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子唬血,更是在濱河造成了極大的恐慌望蜡,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷恨,死亡現(xiàn)場離奇詭異脖律,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)腕侄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門小泉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人冕杠,你說我怎么就攤上這事微姊。” “怎么了拌汇?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵柒桑,是天一觀的道長弊决。 經(jīng)常有香客問我噪舀,道長魁淳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任与倡,我火速辦了婚禮界逛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘纺座。我一直安慰自己息拜,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布净响。 她就那樣靜靜地躺著少欺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馋贤。 梳的紋絲不亂的頭發(fā)上赞别,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音配乓,去河邊找鬼仿滔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛犹芹,可吹牛的內(nèi)容都是我干的崎页。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼腰埂,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼飒焦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屿笼,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤荒给,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后刁卜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體志电,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蛔趴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了挑辆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孝情,死狀恐怖鱼蝉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情箫荡,我是刑警寧澤魁亦,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站羔挡,受9級(jí)特大地震影響洁奈,放射性物質(zhì)發(fā)生泄漏间唉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杈抢,春花似錦、人聲如沸被冒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昨悼。三九已至,卻和暖如春跃洛,著一層夾襖步出監(jiān)牢的瞬間幔戏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國打工税课, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留闲延,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓韩玩,卻偏偏與公主長得像垒玲,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子找颓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

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