htmlbulma

How to switch through tabs in bulma


I' trying to implement a nav tab panel to switch through tabs. I went through Bulma documentation but couldn't find any. Here's the sample code

<div class="tabs is-toggle is-fullwidth">
  <ul>
    <li class="is-active">
      <a>
        <span class="icon is-small"><i class="fa fa-image"></i></span>
        <span>Pictures</span>
      </a>
      <p>
      Here goes pictures
      </p>
    </li>
    <li>
      <a>
        <span class="icon is-small"><i class="fa fa-music"></i></span>
        <span>Music</span>
      </a>
       <p>
      Here goes music
      </p>
    </li>
    <li>
      <a>
        <span class="icon is-small"><i class="fa fa-film"></i></span>
        <span>Videos</span>
      </a>
       <p>
      Here goes music
      </p>
    </li>
    <li>
      <a>
        <span class="icon is-small"><i class="fa fa-file-text-o"></i></span>
        <span>Documents</span>
      </a>
       <p>
      Here goes music
      </p>
    </li>
  </ul>
</div>

Here' the JSfiddle I'm trying to work on. I want "Here goes picture" to only show up when pictures tab is active and vice-versa


Solution

  • You should separate the tabs and the tab content into separate containers. You can match a tab to the correct content using the data attribute.

    Set the tab content to be hidden by default, unless it has the class active. When you click on a tab, the corresponding tab content receives active.

    You can update the fiddle/snippet below with more appropriate elements and class/id names as you need.

    fiddle

    $(document).ready(function() {
      $('#tabs li').on('click', function() {
        var tab = $(this).data('tab');
    
        $('#tabs li').removeClass('is-active');
        $(this).addClass('is-active');
    
        $('#tab-content p').removeClass('is-active');
        $('p[data-content="' + tab + '"]').addClass('is-active');
      });
    });
    #tab-content p {
      display: none;
    }
    
    #tab-content p.is-active {
      display: block;
    }
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet"/>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.1/css/bulma.css" rel="stylesheet"/>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <div class="tabs is-toggle is-fullwidth" id="tabs">
      <ul>
        <li class="is-active" data-tab="1">
          <a>
            <span class="icon is-small"><i class="fa fa-image"></i></span>
            <span>Pictures</span>
          </a>
        </li>
        <li data-tab="2">
          <a>
            <span class="icon is-small"><i class="fa fa-music"></i></span>
            <span>Music</span>
          </a>
        </li>
        <li data-tab="3">
          <a>
            <span class="icon is-small"><i class="fa fa-film"></i></span>
            <span>Videos</span>
          </a>
        </li>
        <li data-tab="4">
          <a>
            <span class="icon is-small"><i class="fa fa-file-text-o"></i></span>
            <span>Documents</span>
          </a>
        </li>
      </ul>
    </div>
    <div id="tab-content">
      <p class="is-active" data-content="1">
        Pictures
      </p>
      <p data-content="2">
        Music
      </p>
      <p data-content="3">
        Videos
      </p>
      <p data-content="4">
        Documents
      </p>
    </div>

    Example without jQuery

    const TABS = [...document.querySelectorAll('#tabs li')];
    const CONTENT = [...document.querySelectorAll('#tab-content p')];
    const ACTIVE_CLASS = 'is-active';
    
    function initTabs() {
        TABS.forEach((tab) => {
          tab.addEventListener('click', (e) => {
            let selected = tab.getAttribute('data-tab');
            updateActiveTab(tab);
            updateActiveContent(selected);
          })
        })
    }
    
    function updateActiveTab(selected) {
      TABS.forEach((tab) => {
        if (tab && tab.classList.contains(ACTIVE_CLASS)) {
          tab.classList.remove(ACTIVE_CLASS);
        }
      });
      selected.classList.add(ACTIVE_CLASS);
    }
    
    function updateActiveContent(selected) {
      CONTENT.forEach((item) => {
        if (item && item.classList.contains(ACTIVE_CLASS)) {
          item.classList.remove(ACTIVE_CLASS);
        }
        let data = item.getAttribute('data-content');
        if (data === selected) {
          item.classList.add(ACTIVE_CLASS);
        }
      });
    }
    
    initTabs();
    #tab-content p {
      display: none;
    }
    
    #tab-content p.is-active {
      display: block;
    }
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css" rel="stylesheet" />
    <link href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.6.1/css/bulma.css" rel="stylesheet" />
    <div class="tabs is-toggle is-fullwidth" id="tabs">
      <ul>
        <li class="is-active" data-tab="1">
          <a>
            <span class="icon is-small"><i class="fa fa-image"></i></span>
            <span>Pictures</span>
          </a>
        </li>
        <li data-tab="2">
          <a>
            <span class="icon is-small"><i class="fa fa-music"></i></span>
            <span>Music</span>
          </a>
        </li>
        <li data-tab="3">
          <a>
            <span class="icon is-small"><i class="fa fa-film"></i></span>
            <span>Videos</span>
          </a>
        </li>
        <li data-tab="4">
          <a>
            <span class="icon is-small"><i class="fa fa-file-text-o"></i></span>
            <span>Documents</span>
          </a>
        </li>
      </ul>
    </div>
    <div id="tab-content">
      <p class="is-active" data-content="1">
        Pictures
      </p>
      <p data-content="2">
        Music
      </p>
      <p data-content="3">
        Videos
      </p>
      <p data-content="4">
        Documents
      </p>
    </div>