Rendre Bootstrap 3 Tabs Responsive

actuellement, lorsque vous mettez en place des onglets dans Bootstrap 3, les onglets ne sont pas responsive.

Ceci:

enter image description here

se transforme en ceci:

enter image description here

CSS. Fixer comment il regarde est facile, juste enlever le flotteur, etc. le max-width. Cependant, le contenu est disjoint de l'onglet, de sorte qu'une pile d'onglets fonctionnera comme des onglets, mais sur les plus petits viewports vous pouvez ou ne pouvez pas voir le changement dans contenu.


ceci est le html de base pour faire une navigation tabbed:

      <!--begin tabs going in wide content -->
       <ul class="nav nav-tabs" id="maincontent" role="tablist">
          <li class="active"><a href="#home" role="tab" data-toggle="tab">Home</a></li>
          <li><a href="#profile" role="tab" data-toggle="tab">Profile</a></li>
          <li class="dropdown">
             <a href="#" id="myTabDrop1" class="dropdown-toggle" data-toggle="dropdown">Dropdown <span class="caret"></span></a>
             <ul class="dropdown-menu" role="menu" aria-labelledby="myTabDrop1">
                <li><a href="#dropdown1" tabindex="-1" role="tab" data-toggle="tab">@fat</a></li>
                <li><a href="#dropdown2" tabindex="-1" role="tab" data-toggle="tab">@mdo</a></li>
             </ul>
          </li>
       </ul><!--/.nav-tabs.content-tabs -->


       <div class="tab-content">

          <div class="tab-pane fade in active" id="home">
             <p>Home Content : ...</p>
          </div><!--/.tab-pane -->

          <div class="tab-pane fade" id="profile">
             <p>Profile Content : ...</p>
          </div><!--/.tab-pane -->

          <div class="tab-pane fade" id="dropdown1">
             <p>Dropdown1 - ...</p>
          </div><!--/.tab-pane -->

          <div class="tab-pane fade" id="dropdown2">
             <p>Dropdown 2 - ...</p>
          </div><!--/.tab-pane -->

       </div><!--/.tab-content -->

comment transformer les languettes en accordéon ou S'effondrer pour qu'elles soient plus petites?

23
demandé sur Christina 2014-09-15 23:24:02

4 réponses

Bootstrap onglets ne sont pas sensibles de la boîte. Réactif, OMI, est un changement de style, changement de fonctions est Adaptative. Il y a quelques plugins pour transformer les onglets Bootstrap 3 en un composant de Collapse. La meilleure et la plus à jour est : https://github.com/flatlogic/bootstrap-tabcollapse.

Voici une façon de le mettre en oeuvre:

DÉMO: http://jsbin.com/zibani/1/

modifier: http://jsbin.com/zibani/1/edit

cela transforme le contenu en un composant d'effondrement:

enter image description here

Dépendances:

  1. Bootstrap 3.2 css ou supérieur mais toujours dans la série 3
  2. Bootstrap 3.2 jQuery ou plus, mais toujours dans la série 3
  3. version Compatible de bootstrap-tabcollapse.js

HTML -- même question avec la classe nom outre:

       <ul class="nav nav-tabs content-tabs" id="maincontent" role="tablist">

jQuery:

$(document).ready(function() {

    // DEPENDENCY: https://github.com/flatlogic/bootstrap-tabcollapse
    $('.content-tabs').tabCollapse();

    // initialize tab function
    $('.nav-tabs a').click(function(e) {
        e.preventDefault();
        $(this).tab('show');
    });

});

CSS -- facultatif pour les gros doigts et les états actifs:

.panel-heading {
    padding: 0
}
.panel-heading a {
    display: block;
    padding: 20px 10px;
}
.panel-heading a.collapsed {
    background: #fff
}
.panel-heading a {
    background: #f7f7f7;
    border-radius: 5px;
}
.panel-heading a:after {
    content: '-'
}
.panel-heading a.collapsed:after {
    content: '+'
}
.nav.nav-tabs li a,
.nav.nav-tabs li.active > a:hover,
.nav.nav-tabs li.active > a:active,
.nav.nav-tabs li.active > a:focus {
    border-bottom-width: 0px;
    outline: none;
}
.nav.nav-tabs li a {
    padding-top: 20px;
    padding-bottom: 20px;
}
.tab-pane {
    background: #fff;
    padding: 10px;
    border: 1px solid #ddd;
    margin-top: -1px;
}
27
répondu Christina 2014-09-25 17:47:46

Slack a une façon cool de rendre les onglets petit viewport convivial sur certaines de leurs pages d'administration. J'ai fait quelque chose de similaire en utilisant bootstrap. C'est une forme d'onglets → liste déroulante.

Démo: http://jsbin.com/nowuyi/1

voici à quoi il ressemble sur un grand viewport: as tabs

Voici à quoi il ressemble s'est effondré sur une petite fenêtre:

collapsed dropdown

Ici à quoi il ressemble étendu sur une petite fenêtre:

open dropdown

le HTML est exactement le même que les onglets bootstrap par défaut.

il y a un petit js snippet, qui nécessite jquery (et insère deux éléments de portée dans le DOM):

$.fn.responsiveTabs = function() {
  this.addClass('responsive-tabs');
  this.append($('<span class="glyphicon glyphicon-triangle-bottom"></span>'));
  this.append($('<span class="glyphicon glyphicon-triangle-top"></span>'));

  this.on('click', 'li.active > a, span.glyphicon', function() {
    this.toggleClass('open');
  }.bind(this));

  this.on('click', 'li:not(.active) > a', function() {
    this.removeClass('open');
  }.bind(this));
};

$('.nav.nav-tabs').responsiveTabs();
@xs: 768px;


.responsive-tabs.nav-tabs {
  position: relative;
  z-index: 10;
  height: 42px;
  overflow: visible;
  border-bottom: none;

  @media(min-width: @xs) {
    border-bottom: 1px solid #ddd;
  }

  span.glyphicon {
    position: absolute;
    top: 14px;
    right: 22px;
    &.glyphicon-triangle-top {
      display: none;
    }
    @media(min-width: @xs) {
      display: none;
    }
  }

  > li {
    display: none;
    float: none;
    text-align: center;

    &:last-of-type > a {
      margin-right: 0;
    }

    > a {
      margin-right: 0;
      background: #fff;
      border: 1px solid #DDDDDD;

      @media(min-width: @xs) {
        margin-right: 4px;
      }
    }

    &.active {
      display: block;
      a {
        @media(min-width: @xs) {
          border-bottom-color: transparent; 
        }
        border: 1px solid #DDDDDD;
        border-radius: 2px;
      }
    }

    @media(min-width: @xs) {
      display: block;
      float: left;
    }

  }

  &.open {

    span.glyphicon {
      &.glyphicon-triangle-top {
        display: block;
        @media(min-width: @xs) {
          display: none;
        }
      }
      &.glyphicon-triangle-bottom {
        display: none;
      }
    }

    > li {
      display: block;

      a {
        border-radius: 0;
      }

      &:first-of-type a {
        border-radius: 2px 2px 0 0;
      }
      &:last-of-type a {
        border-radius: 0 0 2px 2px;
      }
    }
  }
}
26
répondu Lee 2016-04-15 15:38:30

Responsive Bootstrap Tabs

http://hayatbiralem.com/blog/2015/05/15/responsive-bootstrap-tabs/

http://codepen.io/hayatbiralem/pen/KpzjOL

Pas besoin de plugin. Il utilise juste un peu css et jquery.

voici un exemple d'onglet markup:

<ul class="nav nav-tabs nav-tabs-responsive">
    <li class="active">
        <a href="#tab1" data-toggle="tab">
            <span class="text">Tab 1</span>
        </a>
    </li>
    <li class="next">
        <a href="#tab2" data-toggle="tab">
            <span class="text">Tab 2</span>
        </a>
    </li>
    <li>
        <a href="#tab3" data-toggle="tab">
            <span class="text">Tab 3</span>
        </a>
    </li>
    ...
</ul>

.. et jQuery codes sont aussi ici:

(function($) {

  'use strict';

  $(document).on('show.bs.tab', '.nav-tabs-responsive [data-toggle="tab"]', function(e) {
    var $target = $(e.target);
    var $tabs = $target.closest('.nav-tabs-responsive');
    var $current = $target.closest('li');
    var $parent = $current.closest('li.dropdown');
        $current = $parent.length > 0 ? $parent : $current;
    var $next = $current.next();
    var $prev = $current.prev();
    var updateDropdownMenu = function($el, position){
      $el
        .find('.dropdown-menu')
        .removeClass('pull-xs-left pull-xs-center pull-xs-right')
        .addClass( 'pull-xs-' + position );
    };

    $tabs.find('>li').removeClass('next prev');
    $prev.addClass('prev');
    $next.addClass('next');

    updateDropdownMenu( $prev, 'left' );
    updateDropdownMenu( $current, 'center' );
    updateDropdownMenu( $next, 'right' );
  });

})(jQuery);
11
répondu hayatbiralem 2018-02-25 13:02:16

je préfère un schéma css uniquement basé sur le scroll horizontal, comme les onglets sur android. C'est ma solution, il suffit de l'envelopper d'une classe nav-tabs-réactif:

<div class="nav-tabs-responsive">
  <ul class="nav nav-tabs" role="tablist">
    <li>...</li>
  </ul>
</div>

Et deux lignes css:

.nav-tabs { min-width: 600px; }
.nav-tabs-responsive { overflow: auto; }

600px est le point plus vous serez sensibles (vous pouvez définir à l'aide de bootstrap variables)

10
répondu Federico González Brizzio 2015-06-25 15:34:24