Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   WTF???? Проблема с анимацией (https://javascript.ru/forum/offtopic/52776-wtf-problema-s-animaciejj.html)

cyber 06.01.2015 14:14

WTF???? Проблема с анимацией
 
Возможно я упоротный, но какое то хрень творится.

Есть функция, которая отвечает за добаление класса и вызов другой функции которая установит координаты ( переменные top и left не используются ), все хорошо анимация работает.

пруф

function showAnimateWin( ) {
        var top = ( window.innerHeight - win.offsetHeight ) / 2,
            left = ( window.innerWidth - win.offsetWidth ) / 2;

         win.classList.add("modal-window-animate");

        setTimeout( function (){
             end();
        }, 0);

    };



Но, если сделать так (Просто убрать не используемые переменные), то не анимация не работает, точнее работает, но только 1 раз...
пруф

function showAnimateWin( ) {
        //var top = ( window.innerHeight - win.offsetHeight ) / 2,
         //   left = ( window.innerWidth - win.offsetWidth ) / 2;

         win.classList.add("modal-window-animate");

        setTimeout( function (){
             end();
        }, 0);

    };



Какого фига?

cyber 06.01.2015 14:40

Да ну бред какой то, так тоже работает анимация
Достаточно просто получить win.offsetHeight

function showAnimateWin( ) {
        win.offsetHeight ;
     
         win.classList.add("modal-window-animate");

        setTimeout( function (){
             end();
        }, 0);

    };


Что за наркомания..

ruslan_mart 06.01.2015 15:06

cyber, потому что при получении offsetHeight перерисовывается страничка, поэтому работает. Это такой хак. И setTimeout тут не нужен.

Я сам так делаю:

var elem = document.createElement('div');
elem.className = 'transition';
document.body.appendChild(elem);
elem.clientHeight; //HACK - без него анимации не будет
elem.classList.add('show');

cyber 06.01.2015 15:06

Ruslan_xDD, ну так оно должно и без него работать..
Мне больше интересно почему без него не работает

cyber 06.01.2015 15:40

Ппц короче, так работает

function showAnimateWin( ) {

         end();
         win.classList.add("modal-window-animate");

    };


http://jsfiddle.net/p2wozc8a/9/

Подсказали на stackoverflow , на вопрос почему получил ответ
Цитата:

@cyber_ua unfortunately to be honest I have no idea :)

рони 06.01.2015 15:52

cyber,
http://javascript.ru/forum/misc/5169...tml#post341462

cyber 06.01.2015 15:57

рони, хм, по сути если я перемещаю окно, а потом добавляю transition то окно должно переместится без анимации, но на практике она работает...

cyber 06.01.2015 16:01

рони, что можно почитать на эту тему, про то как работает css анимация?

рони 06.01.2015 16:38

cyber,
по теме ничего не могу добавить

Malleys 06.01.2015 17:18

Цитата:

Сообщение от cyber
что можно почитать на эту тему, про то как работает css анимация?

Читать можно тут, тут и тут

cyber 06.01.2015 17:48

Malleys, эм это все примитивная фигня, меня интересуют более технические детали

Malleys 06.01.2015 18:26

Цитата:

elem.clientHeight; //HACK - без него анимации не будет

почему без него не работает
На мой взгляд работает, даже если elem.clientHeight случайно пропустить.
Пример http://codepen.io/Malleys/pen/yyVroo

ruslan_mart 06.01.2015 18:34

Malleys, в таких случаях - да. Но если элемент только добавлен в DOM, то анимация не сработает, пока не дёрнешь какой-нибудь геттер для перерисовки. Ну или в setTimeout можно обернуть, так как он сработает минимум через 4мс - за это время браузер уже сам успевает перерисовать всё. :)

ruslan_mart 06.01.2015 19:07

От нечего делать набросал свой вариант с окошком. :)

http://learn.javascript.ru/play/X0G0c

<!DOCTYPE HTML>
<html>
  <head>
    <style type="text/css">
      .window {
          background: #FFF;
          border: 1px solid #DDD;
          border-radius: 10px;
          box-shadow: 0 0 15px #CCC;
          left: 0;
          height: 200px;
          margin: 0 auto;
          opacity: 0;
          position: fixed;
          right: 0;
          top: -200px;
          -webkit-transition: all 0.5s;
          -moz-transition: all 0.5s;
          -o-transition: all 0.5s;
          -ms-transition: all 0.5s;
          transition: all 0.5s;
          -webkit-transform: scale(0);
          -moz-transform: scale(0)
          -o-transform: scale(0);
          -ms-transform: scale(0);
          transform: scale(0);
          visiblity: hidden;
          width: 300px;
      }
      .window button {
          background: #EEE;
          border: none;
          border-radius: 0 0 10px 10px;
          bottom: 0;
          color: #AAA;
          cursor: pointer;
          height: 25px;
          margin: 0;
          outline: none;
          position: absolute;
          width: 100%;
      }
      .window-show {
          opacity: 1;
          top: 20%;
          -webkit-transform: scale(1);
          -moz-transform: scale(1)
          -o-transform: scale(1);
          -ms-transform: scale(1);
          transform: scale(1);
          visibility: visible;
      }
    </style>
  </head>
  
  <body>
    <input onclick="showWindow(true)" type="button" value="Show Window">
    
    <div class="window">
      <button onclick="showWindow(false)">Close window</button>
    </div>

    <script type="text/javascript">
      var windowSelf = document.querySelector('.window');
      
      function showWindow(to) {
     	  windowSelf.classList.toggle('window-show', to);
      };
    </script>

  </body>
</html>

melky 06.01.2015 20:05

Цитата:

Сообщение от cyber (Сообщение 349878)
рони, что можно почитать на эту тему, про то как работает css анимация?

исчо
http://javascript.ru/forum/css-html-...eflow-bug.html

cyber 07.01.2015 15:57

Ruslan_xDD,
http://jsfiddle.net/dyL78o6k/3/ с моим скриптом)

ruslan_mart 07.01.2015 16:53

cyber, а чего по "Close" анимацию не сделал? :) Можно по "Close" сделать просто плавное исчезновение fade, эффектно получится. :)

cyber 07.01.2015 18:29

Ruslan_xDD, потом допилю, основные фичи поправил, пока основная фича лёгкое управление анимацией вроде получилась + минимальные размеры https://github.com/cyberua/modalJS

Octane 07.01.2015 19:20

Цитата:

Сообщение от cyber
transitions = {
    'transition':'transitionend',
    'OTransition':'oTransitionEnd',
    'MozTransition':'transitionend',
    'WebkitTransition':'webkitTransitionEnd'
};

тебе привет от android 4.0–4.1, в которых есть CSS-свойство transition, но нет события transitionend, есть только webkitTransitionEnd

cyber 07.01.2015 19:41

Octane, збс, обожаю этот зоопарк.
спасибо, поправил.


Часовой пояс GMT +3, время: 21:41.