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

Posted

技术标签:

【中文标题】将 .animate 更改为 .css 并重置宽度【英文标题】:Change .animate to .css and reset width 【发布时间】:2017-01-12 18:21:36 【问题描述】:

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

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

¿我该怎么做?

感谢阅读

【问题讨论】:

【参考方案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 更改后调用删除该类的调用。

这是最终的sn-p:

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>

【讨论】:

感谢您的评论 嗨,Dekel 很高兴在这里见到你,感谢你的代码 您也可以查看我的other answers,如果您觉得他们有帮助/有趣,请投票 :)【参考方案2】:

尝试以下方法:

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

【讨论】:

您好,感谢您的参与,我之前也做过,但没有成功。 我的意思是,滑块改变但效果过渡 css3 no show transition:all 1.0s ease-in-out;我认为问题与以下评论有关:(但是 jQuery 中没有简单的方法可以知道转换何时完成。为此,您将不得不收听更多事件:)

以上是关于将 .animate 更改为 .css 并重置宽度的主要内容,如果未能解决你的问题,请参考以下文章

jQuery + Animate.css 动画只工作一次,动画不重置

jquery animate 使用方形矩形图像创建缩小效果以适应窗口宽度或高度并保持纵横比

搞清animation/transtion/transform/translate

搞清animation/transtion/transform/translate

CSS边框宽度更改布局[重复]

如何在悬停时获得实际的 DOM CSS 宽度? [复制]