具有css转换的滑块中的无限循环

时间:2016-10-04 12:06:50

标签: javascript jquery html css slider

我在移动设备上处理特定类型的滑块。 我们的想法是只利用css动画来执行动作。 所以,我通过" touchmove"检测手指的位置。事件并通过特定的功能我确定位置。 现在,问题的关键是在第一个数字和最后一个数字之间,动画似乎出现故障。 prevAll和nextAll函数正常工作,但不适用于第一个和最后一个数字。 我不知道如何在不改变方向的情况下进行无限循环。 有人能帮助我吗?



var
  isMobile = function() {
    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent))
      return true;
    else
      return false;
  },
  _child = $('ul'),
  human = false,
  saved = 1,
  _check = function(int) {
    _child.find('li').removeClass('selected before after');
    _child.find('li[value=' + int + ']').addClass('selected');
    _child.find('li.selected').nextAll('li').addClass('after');
    _child.find('li.selected').prevAll('li').addClass('before');
  },
  _m = function(n) {
    if (n > 10) {
      return _m(n - 10);
    } else if (n < 1) {
      return _m(n + 10);
    } else
      return n;
  };

_child.on('mousedown touchstart', function(e) {
  init = isMobile() ? e.originalEvent.touches[0].pageY : e.pageY;
  human = true;
});
$(document).on('mousemove touchmove', function(e) {
  e.preventDefault();
  if (human) {
    var
      _current = isMobile() ? e.originalEvent.touches[0].pageY : e.pageY;

    _current = init - _current;
    _current = Math.round(_current * .03);
    _current = saved + _current;

    var
      int = _m(_current);

    _check(int);

    $(this).on('mouseup touchend', function() {
      saved = _current;
      human = false;
    });
  }
});

_child.find('li[value=' + saved + ']').addClass('selected');
_check(saved);
&#13;
body {
  margin: 0;
  background: #FCFCFC;
  color: #222;
  font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Open Sans, Helvetica Neue, sans-serif;
}
ul {
  margin: 0;
  padding: 0;
  list-style: none;
  width: 200px;
  height: 200px;
  background: #FFF;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 32px rgba(0, 0, 0, 0.05);
  overflow: hidden;
}
li {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  line-height: 200px;
  text-align: center;
  font-size: 72px;
  opacity: .5;
  transition: all .4s ease
}
li.after {
  transform: translateY(100%);
}
li.before {
  transform: translateY(-100%);
}
li.selected {
  opacity: 1;
  transform: translateY(0);
  z-index: 1;
}
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<ul>
  <li value="1" class="selected">1</li>
  <li value="2">2</li>
  <li value="3">3</li>
  <li value="4">4</li>
  <li value="5">5</li>
  <li value="6">6</li>
  <li value="7">7</li>
  <li value="8">8</li>
  <li value="9">9</li>
  <li value="10">10</li>
</ul>
&#13;
&#13;
&#13;

1 个答案:

答案 0 :(得分:0)

试图创造工作榜样,但我没有足够的时间。 到达最后一个li时,只需从顶部取一个,将其附加到列表的末尾,然后删除第一个。像这样:

var cloneLi = $(_child.find('li')[0]).clone()
_child.append(cloneLi);
$(_child.find('li')[0]).remove()