【问题标题】:Change .animate to .css and reset width将 .animate 更改为 .css 并重置宽度
【发布时间】: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;
}

¿我该怎么做?

感谢阅读

【问题讨论】:

    标签: jquery image slider append jquery-animate


    【解决方案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 中没有简单的方法可以知道转换何时完成。为此,您将不得不收听更多事件:)
    猜你喜欢
    • 1970-01-01
    • 2020-01-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多