【问题标题】:Function only running once函数只运行一次
【发布时间】:2017-01-23 00:37:27
【问题描述】:

我有 4 个按钮,按钮 1 应该触发动画,按钮 2 应该反转该动画,这可以工作,但有一个小的 css 捕获。(我希望通过单击按钮 2 来让 div 回到原位,而不是出现首先,然后是动画,我也很乐意为此提供解决方案。

现在按钮 3 使 div 飞出,按钮 4 将它们带回原位,但这个过程只工作一次。

点击后触发了以下功能

function animationTwo() {
    var div1 = document.querySelector('.inner1');
    var div2 = document.querySelector('.inner2');
    var div3 = document.querySelector('.inner3');
    var div4 = document.querySelector('.inner4');

    removeAllClasses('div1', 'div2', 'div3', 'div4');

    setTimeout(function() {
        addClass(div1, 'outTopLeft');
        addClass(div2, 'outTopRight');
        addClass(div3, 'outTopRight');
        addClass(div4, 'outTopRight');
    }, 100);
}

function reverseAnimationTwo() {
    var div1 = document.querySelector('.inner1');
    var div2 = document.querySelector('.inner2');
    var div3 = document.querySelector('.inner3');
    var div4 = document.querySelector('.inner4');

    removeAllClasses('div1', 'div2', 'div3', 'div4');

    setTimeout(function() {
        addClass(div1, 'inAgain');
        addClass(div2, 'inAgain');
        addClass(div3, 'inAgain');
        addClass(div4, 'inAgain');
    }, 100);
}

有时,我得到一个引用错误,“元素”未定义,但有时,没有抛出错误。它总是在页面刷新后工作。

以下是上述函数中调用的添加和删除类函数:

 function addClass(element, classToAdd) {
     var currentClassValue = element.className;
     if (currentClassValue.indexOf(classToAdd) == -1) {
         if ((currentClassValue == null) || (currentClassValue === "")) {
             element.className = classToAdd;
         } else {
             element.className += " " + classToAdd;
         }
     }
 }

 function removeAllClasses(el, el, el, el) {
     var currentClassValue = el.className;
     el.className = "";

 };

另一件事是,我想让每个 div 的动画交错,就像单击第一个按钮时触发的动画一样,但是我尝试过循环和回调都没有成功。以及单击按钮 3 和 4 时的滚动条,我该如何避免这些? 我知道这是 JS 和 Css 的混合问题,我希望这不会让任何人感到不安。

笔的链接:

http://codepen.io/damianocel/pen/QdKyzm

【问题讨论】:

  • 你似乎有两个函数叫做reverseAnimationOne
  • 旁注:学习使用Element.classListpropteries add() & remove() 方法添加和删除CSS类
  • @JohnHascall,谢谢,我已经删除了其中一个,但仍然一样。 satpal,我已经使用了有缺陷的 className 属性,因为我没有想出任何好的方法来使用 Element.classList 删除所有类。如果您对此有解决方案,我很乐意了解它。

标签: javascript css


【解决方案1】:

修改您的removeAllClasses(el,el,el,el) 函数后,它正在工作

var aniOne = document.getElementById('move');
var aniOneReversed = document.getElementById('moveBack');
var aniTwo = document.getElementById('move2');
var aniTwoReversed = document.getElementById('moveBack2');
aniOne.addEventListener('click', function () {
    animationOne();
});
aniOneReversed.addEventListener('click', function () {
    reverseAnimationOne();
});
aniTwo.addEventListener('click', function () {
    animationTwo();
});
aniTwoReversed.addEventListener('click', function () {
    reverseAnimationTwo();
});
function animationOne() {
    var allDivs = document.querySelectorAll('div');
    [].forEach.call(allDivs, function (allDivs, i) {
        allDivs.classList.remove('animationOneReversed');
        setTimeout(function () {
            allDivs.classList.add('animationOne');
        }, 100 * i);
    });
}
function reverseAnimationOne() {
    var allDivs = document.querySelectorAll('div');
    [].forEach.call(allDivs, function (allDivs, i) {
        allDivs.classList.remove('animationOne');
        setTimeout(function () {
            allDivs.classList.add('animationOneReversed');
        }, 100 * i);
    });
}
function animationTwo() {

    var div1 = document.querySelector('.inner1');
    var div2 = document.querySelector('.inner2');
    var div3 = document.querySelector('.inner3');
    var div4 = document.querySelector('.inner4');
    removeAllClasses(div1);
	removeAllClasses(div2);
	removeAllClasses(div3);
	removeAllClasses(div4);
    setTimeout(function () {
        addClass(div1, 'outTopLeft');
        addClass(div2, 'outTopRight');
        addClass(div3, 'outTopRight');
        addClass(div4, 'outTopRight');
    }, 100);
}
function reverseAnimationOne() {
    var allDivs = document.querySelectorAll('div');
    [].forEach.call(allDivs, function (allDivs, i) {
        allDivs.classList.remove('animationOne');
        setTimeout(function () {
            allDivs.classList.add('animationOneReversed');
        }, 100 * i);
    });
}
function reverseAnimationTwo() {
    var div1 = document.querySelector('.inner1');
    var div2 = document.querySelector('.inner2');
    var div3 = document.querySelector('.inner3');
    var div4 = document.querySelector('.inner4');
    
    setTimeout(function () {
        addClass(div1, 'inAgain');
        addClass(div2, 'inAgain');
        addClass(div3, 'inAgain');
        addClass(div4, 'inAgain');
    }, 100);
}
function addClass(element, classToAdd) {
    var currentClassValue = element.className;
    if (currentClassValue.indexOf(classToAdd) == -1) {
        if (currentClassValue == null || currentClassValue === '') {
            element.className = classToAdd;
        } else {
            element.className += ' ' + classToAdd;
        }
    }
}
function removeAllClasses(el) {
    var currentClassValue = el.className;
	currentClassValue=currentClassValue.split(" ");
	if(currentClassValue[1]!=""){
		el.className = currentClassValue[0];
	}
    
}
.wrapper {
  perspective: 800px;
  position:relative;
  
  margin:0 auto;
  width:1000px;
  height:500px;
  border:black 10px solid;
  padding:30px;
}

.wrapperInner {
  position:relative;
  
  width:100%;
  height:500px;
  transform-style: preserve-3d;
  transition: transform 1s;
   
  margin: 0 auto;
  
   padding: 30px;
  
}


div { 
 
 
  height:40%;
  width:40%;
  background-image: url(http://scontent.cdninstagram.com/t51.2885-15/e35/12728470_425209597603876_513397964_n.jpg?ig_cache_key=MTE5MDA5Nzg0MjkxOTc4NTAzNg%3D%3D.2);
  background-size: 100% 100%;
  border:2px pink solid;
  margin:40px;
  
}

.inner1 {
  position:absolute;
    top:0px;
  left:0;
}
.inner2 {
  position:absolute;
    top:0px;
  right:0;
}
.inner3 {
  position:absolute;
    bottom:0px;
  left:0;
}
.inner4 {
  position:absolute;
    bottom:0px;
  right:0;
}

@keyframes turner{
  0%   { transform:rotateY(0deg); }
  15%   { transform:rotate(360deg); }
  40%   { transform:skew(23deg,22deg); }
  50%  { transform:translateX(50%);}
  60% { transform:skew(-23deg,-22deg);}
  70% { transform:translateX(-250%);}
  80% { opacity:.9;}
  100% { transform:scale(0);}
}
@keyframes turnerBack{
  0%   { opacity:0; }
  15%   { transform:scale(.3); }
  40%   { transform:skew(-23deg,-22deg); }
  50%  { transform:translateX(-50%);}
  60% { transform:skew(23deg,22deg);}
  70% { transform:translateX(150%);}
  80% { opacity:1;}
  100% { transform:scale(1);}
}
.animationOne {
  animation: turner 3s 1;
  backface-visibility: visible;
  -webkit-animation-fill-mode: forwards; /* Safari 4.0 - 8.0 */
    animation-fill-mode: forwards;
}
.animationOneReversed {
 
  
  animation: turnerBack 3s 1;
  backface-visibility: visible;
  -webkit-animation-fill-mode: forwards; /* Safari 4.0 - 8.0 */
    animation-fill-mode: forwards;
}

.outTopLeft {
  transition:2s;
  transform:translate(-100%,-100%);
}
.outBottomLeft {
  transition:2s;
  transform:translate(-100%,100%);
}
.outTopRight {
  transition:2s;
  transform:translate(200%,-100%);
}
.outBottomRight {
  transition:2s;
  transform:translate(200%,100%);
}
.inAgain {
  transition:1s;
  transform:translate(0);
}
<button id="move">Click for animation</button>
<button id="moveBack">Click to reverse animation</button>
<button id="move2">Click for animation 2</button>
<button id="moveBack2">Click to reverse animation 2</button>
<section class="wrappper">
  <section class="wrappperInner">
  <div class="inner1"></div>
  <div class="inner2"></div>
  <div class="inner3"></div>
  <div class="inner4"></div>
    </section>


</section>

【讨论】:

  • 很棒。现在div怎么能交错飞出去呢?这比在 animationOne 函数中要难得多,我知道。
  • 将过渡更改为 2 秒,它将缓慢动画
  • 我已经用 settimeouts 完成了,但它看起来很冗长,我认为这可以更容易完成,但它现在确实可以按预期工作,检查一下:codepen.io/damianocel/pen/QdKyzm 我的意思不仅仅是动画变慢,我的意思是 div 在不同的时间进行动画处理。
  • 使用转换延迟比 settimeouts 更好,因为前者需要总设置时间才能完成动作,但 settimeout 仅在设置时间后才起作用。尝试使用 css
  • :-) 现在,当单击第二个按钮时,div 会闪烁一下,然后是动画。我希望它们在飞入之前离开屏幕。想法是按钮 1 使它们飞出,按钮 2 使它们飞入。我已将动画填充模式设置为前进,我认为这会起作用,但没有。
猜你喜欢
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-03
  • 2022-12-16
相关资源
最近更新 更多