将 .animate 更改为 .css 并重置宽度

Change .animate to .css and reset width

我一直在寻找这个问题的解决方案,但没有成功,希望您能理解。

我有这个代码滑块图像 jquery:

https://jsfiddle.net/87ucvsn6/2/

Javascript:

jQuery(document).ready(function ($) {

    var slideCount = $('#slider ul li').length;
    var slideWidth = $('#slider ul li').width();
    var slideHeight = $('#slider ul li').height();
    var sliderUlTotal = slideCount * slideWidth;

    $('#slider').css({ width: slideWidth, height: slideHeight });

    $('#slider ul').css({ width: sliderUlTotal, marginLeft: - slideWidth });

    $('#slider ul li:last-child').prependTo('#slider ul');

    function toLeft() {
        $('#slider ul').animate({
            left: + slideWidth
        }, 200, function () {
            $('#slider ul li:last-child').prependTo('#slider ul');
            $('#slider ul').css('left', '');
        });
    };

    function toRight() {
        $('#slider ul').animate({
            left: - slideWidth
        }, 200, function () {
            $('#slider ul li:first-child').appendTo('#slider ul');
            $('#slider ul').css('left', '');
        });
    };

    $('a.prev').click(function () {
        toLeft();
    });

    $('a.next').click(function () {
        toRight();
    });

});

我知道所有的工作原理,但我想将 .animate 更改为 .css 像这样:

function toRight() {
    $('#slider ul').animate({
        left: - slideWidth
    }, 200, function () {
        $('#slider ul li:first-child').appendTo('#slider ul');
        $('#slider ul').css('left', '');
    });
};

收件人:

function toRight() {
    $('#slider ul').css({
        left: - slideWidth
    }, 200, function () {
        $('#slider ul li:first-child').appendTo('#slider ul');
        $('#slider ul').css('left', '');
        $('#slider ul').addClass('selected');
    });
};

但这行不通,我认为问题出在这里:

$('#slider ul').css( {left: - imgWidth});
$('#slider ul').css('left', '');

我以前用其他滑块做过这个,但是那个滑块没有无限循环,那个滑块从最后一个滑块到第一个滑块,但是这个滑块是无限的,为什么 prependTo 和 appendto 不起作用。

我想在单击后将宽度重置为 0 但不更改滑块的位置,例如 .animate

我的目标是使用不同的转换 css3 与:

$('#slider ul').addClass('selected');
.selected{
  transition:all 1.0s ease-in-out;
}

¿我该怎么做?

感谢阅读

尝试以下操作:

 function toRight() {
   $('#slider ul').css({
        left: - slideWidth
    }); 
        $('#slider ul li:first-child').appendTo('#slider ul');
        $('#slider ul').css('left', '');
        $('#slider ul').addClass('selected');
  };

您可以将 toLefttoRight 函数更改为:

function toLeft() {
    $('#slider ul').css({
        left: +slideWidth
    })
    $('#slider ul li:last-child').prependTo('#slider ul');
    $('#slider ul').css('left', '');
};

function toRight() {
    $('#slider ul').css({
        left: -slideWidth
    })
    $('#slider ul li:first-child').appendTo('#slider ul');
    $('#slider ul').css('left', '');
};

但是在 jQuery 中没有简单的方法可以知道转换何时完成。为此,您将不得不收听更多事件:

$("#el").bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){ ... });

(摘自 this question)。

transition 的问题在于,如果您进行任何更改 - 动画将会发生,您将有一个无限循环的转换(或错误的计算)。

为了克服这个问题,您必须 "unset" 元素更改之间的动画,更改完成后 - 再次添加过渡。
在这里您遇到了另一个问题 - 您可能会在 dom/css 更改和您 add/remove 从元素过渡的事实之间进入竞争条件。

我克服了上述所有问题,使用 class 完全删除了转换,setTimeout 函数确保删除 class 的调用在css/dom 更改完成。

这是最后的片段:

jQuery(document).ready(function($) {
  var lastAction;
  var slideCount = $('#slider ul li').length;
  var slideWidth = $('#slider ul li').width();
  var slideHeight = $('#slider ul li').height();
  var sliderUlTotal = slideCount * slideWidth;

  $('#slider').css({
    width: slideWidth,
    height: slideHeight
  });

  $('#slider ul').css({
    width: sliderUlTotal,
    marginLeft: -slideWidth
  })

  $('#slider ul li:last-child').prependTo('#slider ul');
  
  function toLeft() {
    $('#slider ul').css({
        marginLeft: 0
    })
    lastAction = 'left';
  };

  function toRight() {
    $('#slider ul').css({
        marginLeft: -slideWidth*2
    })
    lastAction = 'right';
  };

  $("#slider ul").bind("transitionend webkitTransitionEnd oTransitionEnd MSTransitionEnd", function(){
    if (lastAction == 'left') {
      $('#slider ul').addClass('notrans')
     $('#slider ul li:last-child').prependTo('#slider ul');
      $('#slider ul').css({marginLeft: -500})
      setTimeout(
        function() {
          $('#slider ul').removeClass('notrans')
        }, 1);
    } else if (lastAction == 'right') {
      $('#slider ul').addClass('notrans')
     $('#slider ul li:first-child').appendTo('#slider ul');
      $('#slider ul').css({marginLeft: -500})
      setTimeout(
        function() {
          $('#slider ul').removeClass('notrans')
        }, 1);
    }
  });

  $('a.prev').click(function() {
    toLeft();
  });

  $('a.next').click(function() {
    toRight();
  });
});
html {
  background: #0d1b73;
  color: #2a2a2a;
}

html,
body {
  margin: 0;
  padding: 0;
}

#slider {
  position: relative;
  overflow: hidden;
  margin: 20px auto 0 auto;
  border-radius: 4px;
}

#slider ul {
  position: absolute;
  margin: 0;
  padding: 0;
  height: 200px;
  list-style: none;
}

#slider ul li {
  position: relative;
  display: block;
  float: left;
  margin: 0;
  padding: 0;
  width: 500px;
  height: 300px;
  background: #ccc;
  text-align: center;
  line-height: 300px;
}

a.prev,
a.next {
  position: absolute;
  top: 40%;
  z-index: 999;
  display: block;
  padding: 4% 3%;
  width: auto;
  height: auto;
  background: #2a2a2a;
  color: #fff;
  text-decoration: none;
  font-weight: 600;
  font-size: 18px;
  opacity: 0.8;
  cursor: pointer;
}

a.prev:hover,
a.next:hover {
  opacity: 1;
  -webkit-transition: all 0.2s ease;
}

a.prev {
  border-radius: 0 2px 2px 0;
}

a.next {
  right: 0;
  border-radius: 2px 0 0 2px;
}

.slider_option {
  position: relative;
  margin: 10px auto;
  width: 160px;
  font-size: 18px;
}
#slider ul {
  transition:all 1.0s ease-in-out;
}
#slider ul.notrans {
  transition: none;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div id="slider">
  <a href="#" class="next">&gt;&gt;</a>
  <a href="#" class="prev">
    &lt;&lt;</a>
      <ul>
        <li>SLIDE 1</li>
        <li style="background: #e6e2df;">SLIDE 2</li>
        <li>SLIDE 3</li>
        <li style="background: #e6e2df;">SLIDE 4</li>
      </ul>
</div>