【前端Talkking】前端系列-原生JS實現Tab選項卡滑動、延遲、自動切換效果

1.寫在前面

前一段時間我寫了幾篇關於css屬性的理解和用法方面的文章,今天就不分享css屬性了,給你們分享一個咱們在實際工做中用到比較多的一個效果——Tab選項卡效果。首先,咱們先來看看Tab選項卡效果是什麼樣子,以QQ新聞爲例,有以下效果:javascript

圖片描述

當鼠標滑動到相關的標題上時,標題對應的內容就會出現,這是Tab選項卡的滑動切換效果,Tab選項卡效果還包括延遲切換自動切換效果。今天就和你們一塊兒來學習下Tab選項卡的這三種效果。css

2.三種效果的公共代碼

三種效果都是基於如下的公共的html結構和css樣式:
圖片描述html

在html代碼中,使用兩個div,分別用於包含標題和內容,標題的個數和內容的個數須要相同。詳細的html代碼和css代碼以下所示:前端

html代碼java

<div id="notice" class="notice">
  <div id="notice-title" class="notice-title">
    <ul>
      <li class="select"><a href="#">公告</a></li>
      <li><a href="#">規則</a></li>
      <li><a href="#">論壇</a></li>
      <li><a href="#">安全</a></li>
      <li><a href="#">公益</a></li>
    </ul>
  </div>
  <div id="notice-content" class="notice-content">
    <div class="mod" style="display: block">
      <ul>
        <li>
          <a href="#">張勇:要玩快樂足球</a>
        </li>
        <li>
          <a href="#">阿里2000萬馳援災區</a>
        </li>
        <li>
          <a href="#">旅遊寶讓你邊玩邊賺錢</a>
        </li>
        <li>
          <a href="#">多行跟進阿里信用貸款</a>
        </li>
      </ul>
    </div>
    <div class="mod" style="display: none">
      <ul>
        <li>
          <span>
            [
            <a href="">通知</a>
            ]
          </span>
          <a href="#">「濫發」即將換新</a>
        </li>
        <li>
          <span>
            [
            <a href="">通知</a>
            ]
          </span>
          <a href="#">比特幣嚴管啦</a>
        </li>
        <li>
          <span>
            [
            <a href="">通知</a>
            ]
          </span>
          <a href="#">禁發商品名錄</a>
        </li>
        <li>
          <span>
            [
            <a href="">通知</a>
            ]
          </span>
          <a href="#">商品熟悉限制</a>
        </li>
      </ul>
    </div>
    <div class="mod" style="display: none">
      <ul>
        <li>
          <span>
            [
            <a href="">聚焦</a>
            ]
          </span>
          <a href="#">金牌賣家再啓航</a>
        </li>
        <li>
          <span>
            [
            <a href="">功能</a>
            ]
          </span>
          <a href="#">櫥窗規則升級啦</a>
        </li>
        <li>
          <span>
            [
            <a href="">話題</a>
            ]
          </span>
          <a href="#">又愛又恨優惠券</a>
        </li>
        <li>
          <span>
            [
            <a href="">工具</a>
            ]
          </span>
          <a href="#">購後送店鋪紅包</a>
        </li>
      </ul>
    </div>
    <div class="mod" style="display: none">
      <ul>
        <li>
          <span>
            [
            <a href="">要聞</a>
            ]
          </span>
          <a href="#">年輕幹部要摒棄盲目求快的人生哲學</a>
        </li>
        <li>
          <span>
            [
            <a href="">近來好</a>
            ]
          </span>
          <a href="#">都說實體店不行了,可便利店爲啥越開越多?</a>
        </li>
        <li>
          <span>
            [
            <a href="">冬奧會</a>
            ]
          </span>
          <a href="#">永遠有杯咖啡留給您</a>
        </li>
        <li>
          <span>
            [
            <a href="">總書記</a>
            ]
          </span>
          <a href="#">從高空視角看習總書記的春節足跡    奮進新時代</a>
        </li>
      </ul>
    </div>
    <div class="mod" style="display: none">
      <ul>
        <li>
          <a href="#">走近無聲課堂</a>
        </li>
        <li>
          <a href="#">淘寶之行大衆評審贏公益</a>
        </li>
        <li>
          <a href="#">愛心品牌聯合徵集</a>
        </li>
        <li>
          <a href="#">名公益機構淘寶開店攻略</a>
        </li>
      </ul>
    </div>
  </div>
</div>

css代碼瀏覽器

*{
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 12px;
    box-sizing: border-box;
}
.notice{
    width: 302px;
    height: 100px;
    margin: 10px;
    border: 1px solid #eee;
    overflow: hidden;
}
.notice-title{
    height: 26px;
    background: #f7f7f7;
}

.notice-title li{
    float: left;
    width: 60px;
    line-height: 26px;
    text-align: center;
    overflow: hidden;
    background: #fff;
    border-bottom: 1px solid #eee;
    background: #f7f7f7;
}

.notice li a:link,
.notice li a:visited{
    text-decoration: none;
    color: #000;
}

.notice li a:hover{
    color: #f90;
}
.notice-title li.select{
    background: #fff;
    border-bottom-color: #fff;
    border-left: 1px solid #eee;
    border-right: 1px solid #eee;
    font-weight: bold;
}
.notice-title li:first-child.select{
    border-left: none;
}
.notice-title li:last-child.select{
    border-right: none;
}

.notice-content .mod{
    padding: 12px 5px;
}
.notice-content .mod ul{
    width: 300px;
    font-size: 0;
}
.notice-content .mod ul li{
    display: inline-block;
    width: 145px;
    height: 25px;
    line-height: 25px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

3.滑過切換效果原理分析

滑動切換效果,顧名思義,就是當鼠標滑過的時候,顯示標題下的內容。須要將當前標題的樣式置爲選中狀態(增長標題選中的css樣式,本例中是增長select樣式類),同時將該標題下的內容置爲顯示,即設置樣式display:block,而其餘標題下的內容設置爲隱藏,即設置樣式display:none。詳細的javascript代碼以下所示:安全

function $(id) {
    return typeof id==='string'? document.getElementById(id):id;
}
//獲取鼠標滑過或點擊的標籤和要切換內容的元素
var titles = $('notice-title').getElementsByTagName('li'),
    divs = $('notice-content').getElementsByTagName('div');
if(titles.length != divs.length){
  return;
}
// 遍歷titles下的全部li
for(var i = 0; i < titles.length; i++) {
  // 添加索引
  titles[i].id = i;
  titles[i].onmouseover = function () {
    //清除全部title上的class,將全部的div設置爲隱藏
    for(var j=0; j<titles.length; j++) {
      titles[j].className = '';
      divs[j].style.display = 'none';
    }
    //設置當前li爲高亮顯示
    this.className = 'select';
    divs[this.id].style.display = 'block';
  }
}

若是須要實現點擊切換的效果,只須要將onmouseover修改成onclick便可。微信

在瀏覽器中的效果以下所示:函數

圖片描述

當鼠標過相關標題的時候,標題中對應的內容則會顯示出來。工具

4.延遲切換效果原理分析

延遲切換效果,顧名思義,就是鼠標滑動到標題上必定的時間後才顯示標題下相關的內容,熟悉javascript的同窗知道,咱們可使用setTimeout函數來達到延遲必定的時間,而後再將相關的標題和內容修改成顯示與隱藏。其javascript代碼與滑動切換效果相差不大,須要咱們修改的是首先判判定時器timer是否存在,若是存在,須要清除定時器timer,不然就會出現多個定時器,致使切換效果紊亂,而後將修改標題樣式和標題內容的代碼放到setTimout函數中。

var timer = null;

var list = $('notice-title').getElementsByTagName('li'),
    divs = $('notice-content').getElementsByTagName('div');
if(list.length != divs.length){
  return;
}
for(var i = 0; i < list.length; i++) {
  list[i].id = i;
  list[i].onmouseover = function () {
    var self = this;
    //若是存在準備執行的定時器,馬上清除,只有當前停留時間大於500ms時纔開始執行
    if(timer) {
      clearTimeout(timer);
      timer = null;
    }
    //延遲半秒執行
    timer = setTimeout(function () {
      for(var j = 0; j < list.length; j++) {
        list[j].className = '';
        divs[j].style.display = 'none';
      }
      list[self.id].className = 'select';
      divs[self.id].style.display = 'block';
    }, 500)
  }
}

在瀏覽器中的效果以下:

圖片描述

當鼠標滑過標題的時候,老是間隔必定的時間後標題內容纔出現。

5.自動切換效果原理分析

自動切換效果,顧名思義,就是選項卡能夠自動切換。在javascript中,咱們可使用setInterval來實現這種效果。具體步驟以下:

  1. 默認第一個標題處於選中狀態,第一個標題下的內容顯示,同時給每個標題設定id;
  2. 判判定時器是否存在,若是存在,則清除定時器;
  3. 利用setInterval函數,每隔必定的時間(本例中設定的時間是2s)執行函數autoPlay,在autoPlay函數中,改變顯示標題的下標index,若是下標index的值大於等於標題的個數,則顯示下標index的值置爲0;
  4. 將標題的下標等於顯示的下標index值增長selected類,同時將內容的下標等於顯示下標index值設置爲顯示(display:block),其他的標題內容修改成隱藏(display:none);
//當前高亮顯示的頁籤索引
var index = 0;
var timer = null;
//獲取全部的頁籤和要切換的內容
var list = $('notice-title').getElementsByTagName('li'),
    divs = $('notice-content').getElementsByTagName('div');

//遍歷每個頁籤而且給他們綁定事件
for(var i = 0; i < list.length; i++) {
  list[i].id = i;
}
//添加定時器前作一次清除,避免多個定時器致使頁面卡頓
if(timer){
  clearInterval(timer);
  timer = null;
}
//添加定時器,改變當前高亮的索引
timer = setInterval(autoPlay, 2000);

function autoPlay() {
  index++;
  if(index >= list.length) {
    index = 0;
  }
  changeOption(index);
}

function changeOption(curIndex) {
  // console.log(curIndex);
  for(var j = 0; j < list.length; j++) {
    list[j].className = '';
    divs[j].style.display = 'none';
  }
  //高亮顯示當前頁籤
  list[curIndex].className = 'select';
  divs[curIndex].style.display = 'block';
  index = curIndex;
}

在瀏覽器中的效果以下:

圖片描述

能夠發現,選項卡能夠間隔必定的時間自動切換。

6.寫在最後

好了,今天給你們分享了Tab選項卡的三種切換效果,但願給你們起一個熱身做用,掌握了Tab選項卡的原理,其滑動切換、延遲切換、自動切換的效果比較容易實現。

若是發現有的地方寫錯了或者寫的很差,能夠給我留言,歡迎你們指點!咱們一塊兒進步!感謝閱讀。

ps:今天大年初四了,假期很快都要過去了,立刻就要進城務工。。。


碰見了,不妨關注下個人微信公衆號「前端Talkking」

圖片描述

相關文章
相關標籤/搜索