添加Transition正在改变Jquery设置的位置

时间:2016-08-07 09:23:34

标签: javascript jquery html css css3

好的,所以如果我没有将转换属性添加到.slide类,这个示例工作正常。如果我添加此转换属性,则通过jquery设置的right属性未按预期工作。它正在增加或减少太多。

这是代码:

$(function(){
  $("#with-transition").click(function() {
    $(document.body).toggleClass("with-transition", this.value);
  }).trigger("click");
  var curSlide = 0;
  $('.arrow-left').click(function(){
  
  var $slideContainer = $('.slides');
  var $slide = $slideContainer.find('.slide');
  
  curSlide++;
  if(curSlide === $slide.length){
    $slide.css({"right":"-=200%"});
    curSlide = 0;
  } else {
    $slide.css({"right":"+=100%"});
  } 
});
})
html, body {
  width: 100%;
  height: 100%;
  overflow: hidden;
  background-color: #efefef;
  position: relative;
}

.container {
  width: 600px;
  height: 300px;
  background-color: #17A05E;
  position: absolute;
  top: 50%;
  left: 50%;
  -webkit-transform: translate(-50%, -50%);
          transform: translate(-50%, -50%);
}

.slides {
  width: 100%;
  height: 100%;
  position: relative;
}
body.with-transition .slide {
  -webkit-transition: all 400ms ease-in;
  transition: all 400ms ease-in;
}
.slide1, .slide2, .slide3 {
  width: 600px;
  height: 200px;
  position: absolute;
}

.slide1 {
  background-color: #DD4E42;
  right: -200%;
}

.slide2 {
  background-color: #DF6026;
  right: -100%;
}

.slide3 {
  background-color: #F1990D;
  right: 0;
}

.nav {
  position: absolute;
  left: 0;
  right: 0;
  top: 50%;
  z-index: 1000;
}
.nav .arrow-left, .nav .arrow-right {
  width: 50px;
  height: 50px;
  background-color: rgba(255, 255, 255, 0.4);
  position: absolute;
  -webkit-transition: all 200ms ease-in-out;
  transition: all 200ms ease-in-out;
}
.nav .arrow-left {
  left: 0;
}
.nav .arrow-right {
  right: 0;
}

.arrow-left:hover, .arrow-right:hover {
  background-color: rgba(255, 255, 255, 0.9);
}
<label><input type="checkbox" id="with-transition"> Include transition</label>
<div class="container">
  <div class="slides">
    <div class="slide slide1"></div>
    <div class="slide slide2"></div>
    <div class="slide slide3"></div>
  </div>
  <div class="nav">
    <div class="arrow-left"></div>
    <div class="arrow-right"></div>
  </div>
</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script>

单击左下方较浅的橙色框时会发生转换。为了检查差异,在选中和不选中复选框的情况下尝试它,这将确定是否包含转换。现在,我想要的是,如何使这个代码完全按照它没有过渡的方式工作。

这里我要添加inspect元素的快照: 1) - 没有过渡 This is without transition

2) - 随着过渡 THis is without Transition

最后这是Pen:Check it out here as well

1 个答案:

答案 0 :(得分:1)

所以,我无法用百分比来解决这个问题。如果我在右侧属性中使用像素而不是百分比,那么它可以在转换时正常工作,否则它会为正确的属性添加太多。

但我现在所做的是使用transform: translate(x,y)属性来解决这个问题。

它按照预期和我想要的方式工作。除了相对于它的位置移动它我创建了一个名为xPos的新变量,并给它一个100的值,并在我的translate(x)属性中使用了这个var。

以下是这个较新版本的Jquery:

$(function(){
  var curSlide = 0;
  var xPos = 100;
  $('.arrow-left').click(function(){

    var $slideContainer = $('.slides');
    var $slide = $slideContainer.find('.slide');

    curSlide++;
    if(curSlide === $slide.length){
      $slide.css({'transform':'translate('+(xPos-xPos)+'%, 0)'});
      curSlide = 0;
      xPos = 100;
    } else {
      $slide.css({'transform':'translate(-'+xPos+'%, 0)'});
      xPos = xPos + 100;
    } 
 });
});

虽然再次,如果有人知道为什么当我在正确的属性上使用百分比以及css过渡时发生这种奇怪的行为,我会非常乐意知道!