2016-08-14 4 views
0

Прежде всего, вы можете найти упрощенную демонстрацию моего кода в этом JSFiddle, а также под вопросом. Я обнаружил, что моя проблема происходит так, как я описываю ее в Google Chrome, поэтому, если вы планируете исправить ошибку, используйте этот браузер. Прошу прощения, если код не очень упрощен; пожалуйста, подумайте, что это фрагмент из более крупного проекта.Анимация TweenLite внезапно меняет положение элементов?

Я работаю над webapp, который использует JQuery и TweenLite от GreenSock для анимации.

Это приложение состоит из нескольких меню, которые управляют всем, которые переходят между использованием функции bodyChange(). Эта функция имеет два параметра:

  • nextOrPrev, которая выполняет одну анимацию или другой на основе значения при условии ("next" или "prev"). Только анимация "next" выполнена, но это пока не важно. Анимация "prev", еще не использованная, просто испускает alert("prev").
  • bodyFunction. Предоставленная функция заполнит тело элементами, необходимыми для этого меню, и оберните их в #bodyWrap.

В демке я обеспечиваю вам есть только два меню: первый, mainMenu, только с #playButton. Когда вы нажимаете на нее, вызывается функция bodyChange() со следующими параметрами: ("next", playSettingsBody), playSettings является вторым меню.

В этом проблема: при нажатии кнопки playButton кнопка поднимается вверх по экрану, а затем выполняет анимацию TweenLite. Однако я не вижу, почему кнопка «прыгает», вместо того, чтобы оставаться в одном месте и выполнять анимацию. Вероятно, это связано с небольшой ошибкой. Что это?

Спасибо за любую помощь.

mainMenuBody(); 
 

 
function mainMenuBody() { 
 
\t $("body").append(
 
\t //BUTTONS 
 
\t "<div id='playButton' class='mainButton'><div class='buttonText mainButtonText text'>PLAY</div></div>" 
 
\t); 
 
\t //WRAP 
 
\t $("body").wrapInner("<div id='bodyWrap'></div>"); 
 
\t //BINDS 
 
\t $("#playButton").bind("click", function() { 
 
\t \t bodyChange("next", playSettingsBody); 
 
\t }); \t 
 
} 
 

 
function bodyChange(nextOrPrev, bodyFunction) { 
 

 
\t switch (nextOrPrev) { 
 
\t \t case "next": 
 
\t \t \t //ANIMATION AND BODY CHANGE 
 
\t \t \t TweenLite.to($("#bodyWrap"), .4, { 
 
\t \t \t \t \t ease: Power2.easeIn, 
 
\t \t \t \t \t transform: "rotateY(90deg)", 
 
\t \t \t \t \t onComplete: function(){ 
 
\t \t \t \t \t \t $("body").empty(); 
 
\t \t \t \t \t //NEW STUFF 
 
\t \t \t \t \t \t bodyFunction(); 
 
\t \t \t \t \t \t TweenLite.from($("#bodyWrap"), .4, { 
 
\t \t \t \t \t \t \t ease: Power2.easeOut, 
 
\t \t \t \t \t \t \t transform: "rotateY(90deg)" 
 
\t \t \t \t \t \t }); 
 
\t \t \t \t \t } 
 
\t \t \t }); 
 
\t \t \t //END OF ANIMATION AND BODY CHANGE 
 
\t \t \t break; 
 

 
\t \t case "prev": 
 
\t \t \t alert("prev"); 
 
\t } 
 
} 
 

 
function playSettingsBody() { 
 
\t $("body").append(
 
\t "<p class='text' id='CYTText'>This is the second menu!</p>" 
 
); 
 
}
body{ 
 
\t background-image: url("../resources/pics/Vignette2.png"); 
 
    background-repeat: no-repeat; 
 
\t background-position: center center; 
 
\t background-attachment: fixed; 
 
\t background-color: #02BFC1; 
 
\t overflow:hidden; 
 
\t margin: 0; 
 
\t 
 
\t } 
 

 
.text { 
 
\t color: #FFFFFF; 
 
\t font-family:Bebas Neue; 
 
\t -webkit-user-select: none; 
 
\t cursor: default; 
 
\t text-shadow: 3px 3px 2px rgba(0,0,0,0.2); 
 

 
\t } 
 
    
 
.mainButton { 
 
\t -webkit-transform:scale(1); 
 
\t width: 200px; 
 
\t height: 200px; 
 
\t border: 10px solid #F1F2F0; 
 
\t text-align:center; 
 
\t background-color: #F37C2B; 
 
\t /*background:#5F4A21;*/ 
 
\t display: table; 
 
\t position: absolute; 
 
\t margin: auto; 
 
\t top: 150px; 
 
    bottom: 0; 
 
\t -webkit-transition: all 0.5s ease; 
 
\t cursor: pointer; 
 
\t box-shadow: 0px 0px 30px rgba(0,0,0,0.4); 
 
\t } 
 
    
 
.mainButtonText { 
 
\t position: relative; 
 
\t display:table-cell; 
 
\t vertical-align:middle; 
 
\t -webkit-transform:scale(1); 
 
\t font-size: 90px; 
 
\t text-shadow: 4px 4px 2px rgba(0,0,0,0.2); 
 
\t -webkit-transition: all 0.5s ease; 
 
\t }
<script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.19.0/TweenMax.min.js"></script>

+0

Является ли мой редактировать что вы после? – Dan

+0

Есть ли что-то, что я могу изменить в ответе, чтобы сделать его более подходящим ответом? – Dan

+0

@ Dan Я пробовал ваш метод, но он не работал в основном проекте. Как я узнал на форуме GSAP, проблема на самом деле связана с querk в CSS и не имеет ничего общего с анимацией. Я решил не делать анимацию на данный момент, поскольку это не является существенным для общего проекта и устраняет проблему на более позднем этапе. Спасибо вам за ответ, так или иначе :) –

ответ

1

Эта проблема вызвана в вашем .mainButton классе. Ваш код выглядит примерно так.

.mainButton { 
    position: absolute; 
    top: 150px; 
    bottom: 0; 
    //rest 
} 

Удаляя линии bottom: 0; ваш JSFiddle теперь работает, как ожидалось. Однако, если вы удалите строку top: 150px; вместо этого и оставьте в bottom: 0 проблема все еще происходит. К сожалению, я не могу объяснить это. Может быть, стоит разместить вопрос на форумах GSAP вопросительно о том, почему это происходит, когда работает позиционирование с помощью bottom, но не при использовании top

Редактировать
Так как вам нужно bottom: 0 и я был не в состоянии исправить код I написал пример, который работает с использованием Timeline, плагина GSAP. Вы можете увидеть это JSFiddle или пример кода ниже.

var tl = new TimelineMax(); 
 
tl.pause(); 
 
tl.fromTo($("#click"), 1, {rotationY: 0, ease: Power2.easeOut}, {rotationY: 90, transformOrigin:"right", ease: Power2.easeOut}) 
 
    .set($("#click2"), {css:{display: "table"}}, "-=0.6") 
 
    .fromTo($("#click2"), 1, {rotationY: -90, ease: Power2.easeOut}, {rotationY: 0, transformOrigin:"left", ease: Power2.easeOut}, "-=0.6"); 
 

 
$("#click").click(function() { 
 
    tl.play(); 
 
}); 
 

 
$("#click2").click(function() { 
 
    tl.reverse(); 
 
});
* { 
 
    margin: 0; 
 
    padding: 0; 
 
} 
 

 
body { 
 
    background-image: url("../resources/pics/Vignette2.png"); 
 
    background-repeat: no-repeat; 
 
    background-position: center center; 
 
    background-attachment: fixed; 
 
    background-color: #02BFC1; 
 
    overflow: hidden; 
 
} 
 

 
div.one, div.two { 
 
    position: absolute; 
 
    bottom: 0; 
 
    height: 200px; 
 
    width: 200px; 
 
    background: #F37C2B; 
 
    text-align: center; 
 
    display: table; 
 
    cursor: pointer; 
 
    border: 10px solid #F1F2F0; 
 
} 
 
div.one .text, div.two .text { 
 
    position: relative; 
 
    display: table-cell; 
 
    vertical-align: middle; 
 
    color: #FFFFFF; 
 
    font-family: Bebas Neue; 
 
    font-size: 90px; 
 
} 
 
div.two { 
 
    display: none; 
 
    border-color: transparent; 
 
    background: none; 
 
} 
 
div.two .text { 
 
    font-size: 40px; 
 
}
<script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/1.19.0/TweenMax.min.js"></script> 
 

 
<div id="click" class="one"> 
 
    <div class="text"> 
 
    Play 
 
    </div> 
 
</div> 
 

 
<div id="click2" class="two"> 
 
    <div class="text"> 
 
    Second Menu 
 
    </div> 
 
</div>

+0

Мне нужно, чтобы 'bottom: 0'. Кроме того, следующее меню также находится выше, где оно должно быть в любом случае. В любом случае, спасибо, если я не смогу найти помощь здесь, я опубликую на форуме GSAP. –

+0

@JocaPinto Я обновил свой ответ рабочим примером, который, как вы хотели, я думаю. Дайте мне знать, если это не – Dan