javascript - 如果达到限制,可移动的动态 Bootstrap Tab 菜单 slider

标签 javascript jquery html css twitter-bootstrap

我的网站有动态标签菜单,一个标签菜单项可能是 2 或 3,也可能是 20+。 因此,当导航项超过 10+ 时,会自动下降到第二行,请参阅 here .

我不想要这种效果,我想要在达到导航限制时出现下一个箭头图标,点击它,剩余的菜单项将向左移动。

我试过跟随但没有成功。

HTML

<div class="wrap">
  <ul class="nav nav-tabs">
      <li class="active"><a href="#">Home</a></li>
      <li><a href="#">Tab1 example</a></li>
      <li><a href="#">Tab2 example</a></li>
      <li><a href="#">Tab3 example</a></li>
      <li><a href="#">Tab4 example</a></li>
      <li><a href="#">Tab5 example</a></li>
      <li><a href="#">Tab6 example</a></li>
      <li><a href="#">Tab7 example</a></li>
      <li><a href="#">Tab8 example</a></li>
      <li><a href="#">Tab9 example</a></li>
      <li><a href="#">Tab10 example</a></li>
      <li><a href="#">Tab11 example</a></li>
      <li><a href="#">Tab12 example</a></li>
  </ul>
</div>
<button id="goPrev">Prev</button>
<button id="goNext">Next</button>

CSS

.wrap {
  overflow: hidden;
  position: relative;
  white-space: nowrap;
  width:1000px;
  background: #dad9d9;
    border: 1px solid #efefef;
}

.wrap>.nav-tabs {
  display: inline-block;
  padding:0;
  margin:0;
  position: relative;
  top: 0;
  left: 0;
}

.wrap>.nav-tabs>li {
  background: #fff;
  display: inline-block;
  position: relative;
  white-space: normal;
  float: none;
}
.nav-tabs>li>a {
  margin-right: 0;
}

JavaScript/JQuery

var wrap = $(".wrap").width();
var el = $("ul").width();
if (el > wrap) {
  $("#goNext").click(function() {
    $("ul").stop(true);
    if (-parseInt($("ul").css("left")) - wrap < 0) {
      $("ul").animate({
        "left": "+=-" + wrap
      }, "slow")
    } else {
      $("ul").animate({
        "left": "-" + (el - wrap)
      }, "slow")
    }

  });
  $("#goPrev").click(function() {
    $("ul").stop(true);
    if (-parseInt($("ul").css("left")) - wrap > 0) {
      $("ul").animate({
        "left": "+=" + wrap
      }, "slow")
    } else {
      $("ul").animate({
        "left": "0"
      }, "slow")
    }

  });
}

Bootply

注意:我不想为这个小东西使用任何插件,还要确保 slider 应该是响应式的。

谢谢

最佳答案

只需定义一个全局“currPage”变量。试试这个(参见 jsfiddle):

var menus = $("#menus"), menuWidth = menus.parent().outerWidth();
    var menupage = Math.ceil(menus[0].scrollWidth / menuWidth), currPage = 1;
    if (menupage > 1) {
        $("#goNext").click(function () {
            currPage < menupage && menus.stop(true).animate({
                "left": -menuWidth * currPage
            }, "slow") && currPage++
        });
        $("#goPrev").click(function () {
            currPage > 1 && menus.stop(true).animate({
                "left": -menuWidth * (currPage - 2)
            }, "slow") && currPage--;
        });
        $(window).on("resize", function () {
            menuWidth = menus.parent().outerWidth();
            menupage = Math.ceil(menus[0].scrollWidth / menuWidth);
            currPage = Math.ceil(-parseInt(menus.css("left")) / menuWidth) + 1;
        });
    }
/* Optional theme */
@import url('//netdna.bootstrapcdn.com/bootstrap/3.0.0/css/bootstrap.min.css');

.tab-slider {
  padding:0 40px;
}
.tab-slider .btn-icon {
    position: absolute;
    top: 5px;
}
#goPrev {
  left:0;
}
#goNext {
  right:0;
}
.wrap {
  overflow: hidden;
  position: relative;
  white-space: nowrap;
  width: 100%;
  background: #dad9d9;
  border: 1px solid #efefef;
  font-size: 0;
}

.nav-tabs>li.active>a,
.nav-tabs>li.active>a:focus,
.nav-tabs>li.active>a:hover {
  border: 1px solid transparent;
}

.wrap>.nav-tabs {
  display: inline-block;
  padding: 0;
  margin: 0;
  position: relative;
  top: 0;
  left: 0;
}

.wrap>.nav-tabs>li {
  background: #fff;
  display: inline-block;
  position: relative;
  white-space: normal;
  float: none;
  font-size: 14px;
}

.nav-tabs>li>a {
  margin-right: 0;
  border-radius: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.0/jquery.min.js"></script>
<div class="tab-slider">
  <div class="wrap">
    <ul class="nav nav-tabs" id="menus">
      <li class="active"><a href="#">Home</a></li>
      <li><a href="#">Tab1 example</a></li>
      <li><a href="#">Tab2 example</a></li>
      <li><a href="#">Tab3 example</a></li>
      <li><a href="#">Tab4 example</a></li>
      <li><a href="#">Tab5 example</a></li>
      <li><a href="#">Tab6 example</a></li>
      <li><a href="#">Tab7 example</a></li>
      <li><a href="#">Tab8 example</a></li>
      <li><a href="#">Tab9 example</a></li>
      <li><a href="#">Tab10 example</a></li>
      <li><a href="#">Tab11 example</a></li>
      <li><a href="#">Tab13 example</a></li>
      <li><a href="#">Tab14 example</a></li>
      <li><a href="#">Tab15 example</a></li>
      <li><a href="#">Tab16 example</a></li>
      <li><a href="#">Tab17 example</a></li>
    </ul>

  </div>
  <button id="goPrev" class="btn btn-default btn-icon"><i class="glyphicon glyphicon-chevron-left"></i></button>
  <button id="goNext" class="btn btn-default btn-icon"><i class="glyphicon glyphicon-chevron-right"></i></button>
</div>

注意:我加了一个id menus给你的<ul class="nav nav-tabs">

关于javascript - 如果达到限制,可移动的动态 Bootstrap Tab 菜单 slider ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38524460/

相关文章:

javascript - jquery mobile动态添加元素无法正常工作

javascript - 在 Cordova 使用相机?

jquery 无法更改 ul li 样式

html - 删除多余的图像不起作用

javascript - 如何使用 Jquery 在 5 秒后卸载加载到 div 标签中的 HTML 页面?

javascript - 更改输入类型 "invalid date"中的错误消息 ="date"

javascript - 如果单击按钮,则更改颜色表行

Javascript 无法在页面上运行?

html - 将 CSS 添加到 HTML 复选框

javascript - 使用 JavaScript 将 svg 导出为 png 或其他具有样式的图像