Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Управление CSS анимацией с помощью JS (https://javascript.ru/forum/dom-window/34982-upravlenie-css-animaciejj-s-pomoshhyu-js.html)

(Sandr) 27.01.2013 00:57

Управление CSS анимацией с помощью JS
 
Приветствую всех.

Есть код

<html>
      <head>
        <title></title>
        <script>
          function rotate() {
            var src = document.getElementById('rotate');
            src.MozTransition = "all 1s";
            src.WebkitTransition = "all 1s";
            src.OTransition = "all 1s";
            src.MsTransition = "all 1s";
            src.Transition = "all 1s";
            
            src.MozTransform = "rotate(360deg)";
            src.WebkitTransform = "rotate(360deg)";
            src.OTransform = "rotate(360deg)";
            src.MsTransform = "rotate(360deg)";
            src.Transform = "rotate(360deg)";
          }
    
        </script>
      </head>
      <body>
        <div id="rotate" style="background-color:black; color:white; width:300px; height:200px">
          TEXT_TEXT_TEXT
        </div>
        <a onclick="rotate(); return false;">Click</a>
      </body>
    </html>


Тут видно, что после нажатия на ссылку, запускается функция rotate() и див с текстом поворачивается.
Проблема в том, что если нажать ещё раз, то див больше не повернётся.

Подскажите, как это можно исправить?

И ещё вопрос, как можно сократить эту часть кода?
src.MozTransition = "all 1s";
src.WebkitTransition = "all 1s";
src.OTransition = "all 1s";
src.MsTransition = "all 1s";
src.Transition = "all 1s";

src.MozTransform = "rotate(360deg)";
src.WebkitTransform = "rotate(360deg)";
src.OTransform = "rotate(360deg)";
src.MsTransform = "rotate(360deg)";
src.Transform = "rotate(360deg)";

danik.js 27.01.2013 05:20

Как вариант:

<html>
      <head>
        <title></title>
        <script>
            function setElementStyle(element, property, value) {
                var prefixes = {'webkit':1, 'moz':1, 'ms':1, 'o':1};
                if (element.style[property] !== undefined) {
                    element.style[property] = value;
                    return;
                }

                property = property.charAt(0).toUpperCase() + property.substring(1);

                for (var prefix in prefixes) {
                    if (element.style[prefix + property] !== undefined) {
                        element.style[prefix + property] = value;
                        break;
                    }
                }
            }

            function rotate() {
                var src = document.getElementById('rotate');
                setElementStyle(src, 'transition', "all 1s");
                setElementStyle(src, 'transform', "rotate(360deg)");
                setTimeout(function(){
                    setElementStyle(src, 'transition', "");
                    setElementStyle(src, 'transform', "");
                }, 1000);
            }
        </script>
      </head>
      <body>
        <div id="rotate" style="background-color:black; color:white; width:300px; height:200px">
          TEXT_TEXT_TEXT
        </div>
        <a onclick="rotate(); return false;">Click</a>
      </body>
    </html>


Но это не очень хороший вариант. Вообще, если кода писать много - лучше использовать готовую библиотеку, а не велосипедить.

(Sandr) 27.01.2013 23:25

danik.js,
да дело не только в велосипедах. Просто хочу разобраться в этом, чтобы ночью нормально спалось))

Ещё есть вариант, вешать обработчик на transitionend. Что насчёт этого думаете?

danik.js 28.01.2013 06:25

Думаю что это луший вариант. Но чуть сложнее чем setTimeout :)
Сам если чесно с этим не работал

(Sandr) 28.01.2013 19:09

danik.js,
да, сложнее) Всё никак не разберусь с тем, как обработчик удалять, а то при каждой анимации эти обработчики накапливаются, что не есть хорошо.

Deff 28.01.2013 19:14

(Sandr),
Не проще ли расписать в css по классам и cкриптом: добавлять - отнимать класс
Заодно и динамику в css прописать ?

(Sandr) 28.01.2013 19:27

Deff,
эмм.. чот я об этом как-то не подумал :) Вот блин, 2 дня убил на это..

Но что если мне нужно переместить элемент из координат XX в XY? Естественно, это можно сделать и на JS, но не хочется его нагружать на сайте и без того напичканном разного рода задачами на JS.


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