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

时间:2016-09-05 11:25:46

标签: jquery image slider append jquery-animate

我一直在寻找这个问题的解决方案好几天没有成功,我希望你理解。

我有这个代码滑块图像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();
    });

});

我知道所有工作如何但我想改变.anss到.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;
}

¿我怎么能这样做?

感谢您阅读

2 个答案:

答案 0 :(得分:1)

您可以将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的问题在于,如果你做了任何改变 - 动画将会发生,你将有一个无限循环的转换(或错误的计算)。

为了克服这个问题,你将不得不解开这个问题。元素更改之间的动画,以及更改完成后 - 再次添加过渡 在这里你会遇到另一个问题 - 你可能会在dom / css更改和添加/删除元素转换这一事实之间陷入竞争状态。

我使用完全删除转换的类和setTimeout函数克服了上述所有操作,以确保在完成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>
&#13;
&#13;
&#13;

答案 1 :(得分:0)

尝试以下方法:

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