jQuery поворот/преобразование

Я хотел бы использовать эту функцию для вращения, а затем остановки в определенной точке или степени. Сейчас элемент просто вращается без остановки. Вот код:

    <script type="text/javascript">
    $(function() {
       var $elie = $("#bkgimg");
       rotate(0);
       function rotate(degree) {

           // For webkit browsers: e.g. Chrome
           $elie.css({ WebkitTransform: 'rotate(' + degree + 'deg)'});
           // For Mozilla browser: e.g. Firefox
           $elie.css({ '-moz-transform': 'rotate(' + degree + 'deg)'});

           // Animate rotation with a recursive call
           setTimeout(function() { rotate(++degree); },65);
       }
    });
    </script>

Спасибо за вашу помощь


person Andrea    schedule 29.10.2011    source источник


Ответы (5)


Просто удалите строку, которая поворачивает ее на один градус за раз и навсегда вызывает скрипт.

// Animate rotation with a recursive call
setTimeout(function() { rotate(++degree); },65);

Затем передайте желаемое значение в функцию... в этом примере 45 для 45 градусов.

$(function() {

    var $elie = $("#bkgimg");
    rotate(45);

        function rotate(degree) {
      // For webkit browsers: e.g. Chrome
           $elie.css({ WebkitTransform: 'rotate(' + degree + 'deg)'});
      // For Mozilla browser: e.g. Firefox
           $elie.css({ '-moz-transform': 'rotate(' + degree + 'deg)'});
        }

});

Измените .css() на .animate(), чтобы анимировать вращение с помощью jQuery. Нам также нужно добавить продолжительность анимации, 5000 на 5 секунд. И обновить исходную функцию, чтобы удалить некоторую избыточность и обеспечить поддержку большего количества браузеров...

$(function() {

    var $elie = $("#bkgimg");
    rotate(45);

        function rotate(degree) {
            $elie.animate({
                        '-webkit-transform': 'rotate(' + degree + 'deg)',
                        '-moz-transform': 'rotate(' + degree + 'deg)',
                        '-ms-transform': 'rotate(' + degree + 'deg)',
                        '-o-transform': 'rotate(' + degree + 'deg)',
                        'transform': 'rotate(' + degree + 'deg)',
                        'zoom': 1
            }, 5000);
        }
});

EDIT: Приведенный выше стандартный код анимации CSS jQuery не работает, поскольку, по-видимому, jQuery .animate() еще не поддерживает CSS3 transforms.

Этот плагин jQuery должен анимировать вращение:

https://github.com/puppybits/QTransform

person Sparky    schedule 29.10.2011
comment
Это просто вращает изображение. Я действительно хочу, чтобы он анимировал/вращался и останавливался в определенной точке или степени. Извините, я должен был упомянуть об этом раньше. Спасибо. - person Andrea; 29.10.2011
comment
@Andrea, я смотрю на твою страницу в Safari, и изображение повернуто на 45 градусов. Глядя на DOM в консоли, он показывает, что был применен правильный CSS -webkit-transform. Возможно, ваш браузер не поддерживает CSS 3. - person Sparky; 29.10.2011
comment
@Андреа, извини, я забыл упомянуть продолжительность, необходимую для анимации. Я отредактировал это снова. - person Sparky; 29.10.2011
comment
@Andrea, jQuery animate() не поддерживает transforms я только что узнал. Вот плагин, который должен это сделать. plugins.jquery.com/project/QTransform - person Sparky; 29.10.2011
comment
Я понял. Придется немного поработать над документом. Спасибо за вашу помощь. Я пробовал некоторые другие плагины, но не смог заставить их работать. Может быть, это тот самый! - person Andrea; 29.10.2011

Это потому, что у вас есть рекурсивная функция внутри rotate. Он снова зовет себя:

// Animate rotation with a recursive call
setTimeout(function() { rotate(++degree); },65);

Уберите это, и он не будет продолжать работать рекурсивно.

Я бы также предложил вместо этого использовать эту функцию:

function rotate($el, degrees) {
    $el.css({
  '-webkit-transform' : 'rotate('+degrees+'deg)',
     '-moz-transform' : 'rotate('+degrees+'deg)',  
      '-ms-transform' : 'rotate('+degrees+'deg)',  
       '-o-transform' : 'rotate('+degrees+'deg)',  
          'transform' : 'rotate('+degrees+'deg)',  
               'zoom' : 1

    });
}

Это намного чище и будет работать для большинства браузеров.

person switz    schedule 29.10.2011

Почему бы просто не использовать toggleClass по клику?

js:

$(this).toggleClass("up");

CSS:

button.up {
    -webkit-transform: rotate(180deg);
       -moz-transform: rotate(180deg);
        -ms-transform: rotate(180deg);
         -o-transform: rotate(180deg);
            transform: rotate(180deg);
               /* IE6–IE9 */
               filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.9914448613738104, M12=-0.13052619222005157,M21=0.13052619222005157, M22=0.9914448613738104, sizingMethod='auto expand');
                 zoom: 1;
    }

вы также можете добавить это в css:

button{
        -webkit-transition: all 500ms ease-in-out;
        -moz-transition: all 500ms ease-in-out;
        -o-transition: all 500ms ease-in-out;
        -ms-transition: all 500ms ease-in-out;
}

который добавит анимацию.

PS...

чтобы ответить на ваш первоначальный вопрос:

Вы сказали, что он вращается, но никогда не останавливается. При использовании set timeout вам нужно убедиться, что у вас есть условие, которое не вызовет settimeout, иначе оно будет работать вечно. Итак, для вашего кода:

<script type="text/javascript">
    $(function() {
     var $elie = $("#bkgimg");
     rotate(0);
     function rotate(degree) {

      // For webkit browsers: e.g. Chrome
    $elie.css({ WebkitTransform: 'rotate(' + degree + 'deg)'});
      // For Mozilla browser: e.g. Firefox
    $elie.css({ '-moz-transform': 'rotate(' + degree + 'deg)'});


    /* add a condition here for the extremity */ 
    if(degree < 180){
      // Animate rotation with a recursive call
      setTimeout(function() { rotate(++degree); },65);
     }
    }
    });
    </script>
person cpi    schedule 24.02.2012

Я придумал какое-то решение проблемы. Он включает jquery и css. Это работает как переключатель, но вместо переключения отображения элементов он просто меняет свои свойства при чередующихся щелчках. При нажатии на div он поворачивает элемент с тегом на 180 градусов, а при повторном нажатии элемент с тегом возвращается в исходное положение. Если вы хотите изменить продолжительность анимации, просто измените свойство transition-duration.

CSS

#example1{
transition-duration:1s;
}

JQuery

$(document).ready( function ()  {  var toggle = 1;
  $('div').click( function () {
      toggle++;
      if ( (toggle%2)==0){
          $('#example1').css( {'transform': 'rotate(180deg)'});
      }
      else{
          $('#example1').css({'transform': 'rotate(0deg)'});
      }
  });

});

person Raza    schedule 12.09.2015

t = setTimeout(function() { rotate(++degree); },65);

и clearTimeout для остановки

clearTimeout(t);

Я использую это с AJAX

success:function(){ clearTimeout(t); }
person Sams    schedule 10.03.2012