javascript - 使用下一个和上一个按钮(如轮播)创建菜单列表

标签 javascript html jquery css

我正在尝试制作轮播,但遇到问题。

首先,当您继续单击“下一步”按钮时,如果到达最后一项,该函数将继续工作,而应停止。我不知道如何告诉该功能停止工作。不过,我设法在 prev 按钮中做到了这一点。

其次,我需要它灵活,因为我不知道元素的宽度和数量。例如,如果只有两个元素,则不再需要按钮 NextPrev,我希望它隐藏,或者类似元素不再适合的情况然后容器显示 NextPrev 按钮。

$(document).ready(function() {
  var margin_left = 0;
  $('#prev').on('click', function(e) {
    e.preventDefault();
    if (margin_left != 0) {
      margin_left = margin_left + 190;
      $('ul#csx-chips-menu-slider').animate({
        'margin-left': margin_left
      }, 300);
    }
  });

  $('#next').on('click', function(e) {
    e.preventDefault();
    margin_left = margin_left - 190;
    $('ul#csx-chips-menu-slider').animate({
      'margin-left': margin_left
    }, 300);
  });
});
* {
  box-sizing: border-box;
}

.chips-slider-container {
  border: solid 1px;
  width: 100%;
  padding: 2px;
}

.chips-slider-parent {
  width: 100%;
  display: flex;
  border: solid 1px;
}

.chips-slider-parent .csx-chips-items {
  background-color: #CCCCCC;
  padding: 5px;
}

.chips-slider-parent .csx-chips-items:nth-child(2) {
  background-color: #DDDDDD;
  flex: 1;
  display: block;
  overflow-x: hidden;
}

.csx-chips-menu {
  padding: 0;
  margin: 0;
  list-style: none;
  white-space: nowrap;
}

.csx-chips-menu li {
  display: inline-block;
  padding-left: 10px;
  padding-right: 10px;
  border: solid 1px;
}

.csx-chips-sub-menu {
  display: none;
  position: absolute;
  background-color: #FFFFFF;
  padding: 0;
  margin: 0;
  margin-left: -11px;
  list-style: none;
}

.csx-chips-sub-menu li {
  display: block;
}

.csx-chips-menu li:hover>.csx-chips-sub-menu {
  display: block;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="chips-slider-container">
  <div class="chips-slider-parent">
    <div class="csx-chips-items">
      <a href="#" id="prev">PREV</a>
    </div>
    <div class="csx-chips-items">
      <ul class="csx-chips-menu" id="csx-chips-menu-slider">
        <li>
          <a href="#">Sample Menu 1</a>
          <ul class="csx-chips-sub-menu">
            <li><a href="#">Sample Sub Menu</a></li>
            <li><a href="#">Sample Sub Menu</a></li>
            <li><a href="#">Sample Sub Menu</a></li>
            <li><a href="#">Sample Sub Menu</a></li>
          </ul>
        </li>
        <li><a href="#">Sample Menu 2</a></li>
        <li><a href="#">Sample Menu 3</a></li>
        <li><a href="#">Sample Menu 4</a></li>
        <li><a href="#">Sample Menu 5</a></li>
        <li><a href="#">Sample Menu 6</a></li>
        <li><a href="#">Sample Menu 7</a></li>
        <li><a href="#">Sample Menu 8</a></li>
        <li><a href="#">Sample Menu 9</a></li>
        <li><a href="#">Sample Menu 10</a></li>
        <li><a href="#">Sample Menu 11</a></li>
      </ul>
    </div>
    <div class="csx-chips-items">
      <a href="#" id="next">NEXT</a>
    </div>
  </div>
</div>

最佳答案

这是我通常的做法:

通过在 getMaxMargin() 函数中从父宽度中减去 slider 宽度来获取最大负边距。区别在于您可以添加到 slider 的最大偏移量。

然后只需使用 Math.max 即可确保始终保持在该限制之上。对于另一端 - 不超过 0 - 使用 Math.min。所以整个魔力就是这一行: margin_left = Math.min(0, Math.max( getMaxMargin(), margin_left + amount ))

$(document).ready(function() {

  var margin_left = 0;

  $('#prev').on('click', function(e) {
    e.preventDefault();
    animateMargin( 190 );
  });

  $('#next').on('click', function(e) {
    e.preventDefault();
    animateMargin( -190 );
  });

  const animateMargin = ( amount ) => {
      margin_left = Math.min(0, Math.max( getMaxMargin(), margin_left + amount ));
      $('ul#csx-chips-menu-slider').animate({
        'margin-left': margin_left
      }, 300);
};

  const getMaxMargin = () => 
    $('#csx-chips-menu-slider').parent().width() - $('#csx-chips-menu-slider')[0].scrollWidth;
});

关于javascript - 使用下一个和上一个按钮(如轮播)创建菜单列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61542082/

相关文章:

javascript - 在 JavaScript 中创建 json 文件

jquery - 我可以将 jQuery UI 对话框置于 div 中心吗?

javascript - 辅助功能:仅使用 javascript 链接 href ="#"

JavaScript 错误 : [elementname] has no properties

javascript - 如何在 react 中过滤唯一值?

html - 在第二列中垂直居中 flex 元素

html - 应用 border-radius 而不将它应用到 box-shadow

jquery - 简单的淡入 jQuery

javascript - 动态生成文本区域(JQuery)以适应初始内容大小

javascript - 您认为哪些开源项目拥有编写良好的 Jasmine/Jasmine-Jquery 测试?