요소 변형 회전 애니메이션


82

jQuery를 사용하여 요소를 어떻게 회전 .animate()합니까? 현재 불투명도를 올바르게 애니메이션하는 아래 줄을 사용하고 있지만 CSS3 변환을 지원합니까?

$(element).animate({
   opacity: 0.25,
   MozTransform: 'rotate(-' + -amount + 'deg)',
   transform: 'rotate(' + -amount + 'deg)'
});

1
CSS 변환에 애니메이션을 적용하는 jQuery 플러그인이 있습니다. Firefox, Chrome, Safari, Opera 및 Internet Explorer에서 작동합니다. github.com/puppybits/QTransform
puppybits 2011-06-03

같은 주제에 대한 검색으로 여기에서 끝났고 플러그인을 다운로드했습니다. 잘 작동하지만 내가 만든 다른 플러그인에서이 명령과 충돌을 일으켰습니다. $ ( "#"+ self.id) .css ( "transform", "scale (1)"); 이 줄을 변경했습니다. elem.style [$. cssProps.transform] = val + '%'; 이것에 : if (isNaN (val)) elem.style [$. cssProps.transform] = val; else elem.style [$. cssProps.transform] = val + '%'; 추가 설명이 필요하지 않다고 생각하십시오.
sergio0983

답변:


95

내가 아는 한 기본 애니메이션은 숫자가 아닌 CSS 속성에 애니메이션을 적용 할 수 없습니다.

단계 함수와 사용자 브라우저에 적합한 css3 변환을 사용하여이 작업을 수행 할 수 있다고 생각 합니다. CSS3 변환은 모든 브라우저를 다루기에는 약간 까다 롭습니다 (예를 들어 IE6에서는 Matrix 필터를 사용해야 함).

편집 : 다음은 웹킷 브라우저 (Chrome, Safari)에서 작동하는 예입니다. http://jsfiddle.net/ryleyb/ERRmd/

IE9 만 지원하려는 경우 transform대신을 사용 -webkit-transform하거나 -moz-transformFireFox를 지원할 수 있습니다 .

사용되는 트릭은 우리가 신경 쓰지 않는 CSS 속성 ( text-indent) 에 애니메이션을 적용한 다음 단계 함수에서 해당 값을 사용하여 회전을 수행하는 것입니다.

$('#foo').animate(
..
step: function(now,fx) {
  $(this).css('-webkit-transform','rotate('+now+'deg)'); 
}
...

이것은 코드 유지 관리와 속도 모두에서 고통스러운 솔루션입니다. 노래 jQuery하는 동안 잊어 버리고 transform내 솔루션을 확인하십시오.
Dyin

고정 된 것이 아니라 회전 할 때마다 변하는 가치가 있다면 어떨까요?
edonbajrami 2014 년

78

Ryley의 대답 은 훌륭하지만 요소 내에 텍스트가 있습니다. 다른 모든 것과 함께 텍스트를 회전하기 위해 텍스트 들여 쓰기 대신 border-spacing 속성을 사용했습니다.

또한 요소의 스타일에서 약간을 명확히하기 위해 초기 값을 설정합니다.

#foo {
    border-spacing: 0px;
}

그런 다음 애니메이션 청크에서 최종 값 :

$('#foo').animate({  borderSpacing: -90 }, {
    step: function(now,fx) {
      $(this).css('transform','rotate('+now+'deg)');  
    },
    duration:'slow'
},'linear');

제 경우에는 시계 반대 방향으로 90도 회전합니다.

다음은 라이브 데모 입니다.


3
Z- 색인을 사용하는 것도 다른 곳에서 사용하지 않는 경우 좋은 옵션입니다. 그러나 당신은 그것에 대해 부정적으로 가고 싶지 않을 것입니다.
Sherzod

4
-ms- 및 -o- 확장명도 추가 할 수 있습니다 ( css3please.com 참조 )
Joram van den Boezem

동시에 추가 속성에 애니메이션을 적용하려면 어떻게해야합니까?
MadTurki

@MadTurki, 아래 질문에 대한 답변을 썼습니다!
skagedal

5
jQuery는 실제로 모든 -moz-, -webkit- 등의 접두사를 추가 할 수있을만큼 똑똑하므로이 코드를 약간 단순화 할 수 있습니다. 아주 좋은 대답입니다. +1
Octopus

48

제 생각에 jQuery animatetransition2D 또는 3D 속성에서 이러한 애니메이션을 수행 하는 CSS3에 비해 약간 과도하게 사용 됩니다. 또한 브라우저에 남겨두고 JavaScript라는 레이어를 잊어 버리면 특히 애니메이션을 사용하고 싶을 때 여분의 CPU 주스로 이어질 수 있습니다 . 따라서 JavaScript로 기능을 정의하기 때문에 스타일 정의가있는 애니메이션을 좋아합니다 . JavaScript에 더 많은 프레젠테이션을 삽입할수록 나중에 더 많은 문제에 직면하게됩니다.

addClass애니메이션을 적용하려는 요소 를 사용 하기 만하면 CSS transition속성 이있는 클래스를 설정할 수 있습니다. 당신은 단지 애니메이션 "활성화" 숙박은, 순수한 프리젠 테이션 계층에서 구현을 .

.js

// with jQuery
$("#element").addClass("Animate");

// without jQuery library
document.getElementById("element").className += "Animate";

하나는 easly 수 와 jQuery 클래스를 제거 하거나 라이브러리없이 클래스를 제거합니다 .

.css

#element{
    color      : white;
}

#element.Animate{
    transition        : .4s linear;
    color             : red;
    /** 
     * Not that ugly as the JavaScript approach.
     * Easy to maintain, the most portable solution.
     */
    -webkit-transform : rotate(90deg);
}

.html

<span id="element">
    Text
</span>

이것은 대부분의 사용 사례에 빠르고 편리한 솔루션입니다.

또한 다른 스타일 (대체 CSS 속성)을 구현하고 글로벌 .5s 애니메이션으로 즉석에서 스타일을 변경하고 싶을 때 이것을 사용합니다. 다음 BODY과 같은 형식으로 대체 CSS를 사용하면서에 새 클래스를 추가합니다 .

.js

$("BODY").addClass("Alternative");

.css

BODY.Alternative #element{
    color      : blue;
    transition : .5s linear;
}

이렇게하면 다른 CSS 파일을로드하지 않고도 애니메이션에 다른 스타일을 적용 할 수 있습니다. 당신은 class.


1
괜찮지 만 CSS3 전환을 지원 하는 브라우저 로 제한됩니다 . 따라서 IE8 또는 IE9는 없습니다. 포기하기에는 꽤 큰 부분입니다.
Ryley

11
@Ryley 당신은 사용자의 12 % 에 대해 이야기하고 있습니다. IE8 또는 IE9 사용자는 5 % 미만입니다. 우리가 여전히 기능이 아닌 프레젠테이션 레이어에 대해 이야기하고 있기 때문에 포기해야 할 큰 부분은 아닙니다. 방문자의 약 5 %가 3D 애니메이션을 볼 수 없습니다. 또한 브라우저 (IE)가를 지원하지 않는 경우에도 transition변환을 지원하지 않습니다.
죽을

그것은 전적으로 사실이 아닙니다 transform-IE9에서 지원됩니다. 하지만 포기하는 것이 가장 큰 사용자 그룹 (IE8)이 아니라는 데 동의합니다.
Ryley

2
@Dyin 12 %가 아니라 대상 인구 통계에 따라 다릅니다. google-analytics에 따르면 회사 사용자의 50 %가 IE8을 사용합니다. 핵심은 청중을 아는 것입니다. 즉, 브라보 친구! 이 답변은 상위 2 개보다 훨씬 낫습니다. "거친 다이아몬드"가되는 방법.
Ziggy

2
이것은 또한 동적 회전 값을 고려하지 않습니다.
Yuschick 2014-08-27

19

Ryley와 atonyc의 답변에 추가하려면, 당신은 실제로 같은 실제 CSS 속성을 사용할 필요가 없습니다 text-index거나 border-spacing, 대신 당신은 같은 가짜의 CSS 속성을 지정할 수 있습니다 rotation또는 my-awesome-property. 나중에 실제 CSS 속성이 될 위험이없는 것을 사용하는 것이 좋습니다.

또한 누군가는 동시에 다른 것을 애니메이션하는 방법을 물었습니다. 이 작업은 평소와 같이 수행 할 수 있지만 step모든 애니메이션 속성에 대해 함수가 호출되므로 다음과 같이 속성을 확인해야합니다.

$('#foo').animate(
    {
        opacity: 0.5,
        width: "100px",
        height: "100px",
        myRotationProperty: 45
    },
    {
        step: function(now, tween) {
            if (tween.prop === "myRotationProperty") {
                $(this).css('-webkit-transform','rotate('+now+'deg)');
                $(this).css('-moz-transform','rotate('+now+'deg)'); 
                // add Opera, MS etc. variants
                $(this).css('transform','rotate('+now+'deg)');  
            }
        }
    });

(참고 : jQuery 문서에서 "Tween"개체에 대한 문서를 찾을 수 없습니다. 애니메이션 문서 페이지 에는 http://api.jquery.com/Types#Tween에 대한 링크 가 있습니다. 존재하지 않는 것 같습니다. 여기 Github 에서 Tween 프로토 타입에 대한 코드를 찾을 수 있습니다 ).


myRotationProperty는 무엇입니까 ... 사용자가 정의한 것입니까? 그리고 무엇이 이것에 now달려 있습니다.
Muhammad Umer 2014 년

@MuhammadUmer-예, myRotationProperty맞춤 제작 된 "가짜"CSS 속성입니다. now단계 콜백 함수에 대한 첫 번째 인수이며이 단계에서 속성 값의 변경을 지정합니다.
skagedal

그런 다음 CSS 에서도이 속성을 초기화 했습니까? 아니면 그냥 애니메이션으로 넣을 수 있습니다.
Muhammad Umer 2014 년

7

CSS 전환을 사용하십시오.

$(element).css( { transition: "transform 0.5s",
                  transform:  "rotate(" + amount + "deg)" } );

setTimeout( function() { $(element).css( { transition: "none" } ) }, 500 );

예를 들어 애니메이션 기간을 0.5 초로 설정했습니다.

애니메이션이 끝난 후 (500ms) css 속성 setTimeout을 제거하려면 주의하십시오.transition


가독성을 위해 공급 업체 접두사를 생략했습니다.

이 솔루션은 브라우저의 전환 지원이 필요합니다.


고마워, 나를 위해 일했다. 닫는 괄호 뒤에 세미콜론도 잊어 버렸습니다.
Devin Carpenter

@ Sorrow123444 나는 그것이 당신을 위해 일했다 기쁘다. 누락 된 세미콜론을 수정했습니다. 감사합니다
Paolo

3

무한 루프 애니메이션을 위해 jQuery에서 CSS 변환을 사용하려는이 게시물을 우연히 발견했습니다. 이것은 나를 위해 잘 작동했습니다. 그래도 얼마나 전문적인지 모르겠습니다.

function progressAnim(e) {
    var ang = 0;

    setInterval(function () {
        ang += 3;
        e.css({'transition': 'all 0.01s linear',
        'transform': 'rotate(' + ang + 'deg)'});
    }, 10);
}

사용 예 :

var animated = $('#elem');
progressAnim(animated)

1
//this should allow you to replica an animation effect for any css property, even //properties //that transform animation jQuery plugins do not allow

            function twistMyElem(){
                var ball = $('#form');
                document.getElementById('form').style.zIndex = 1;
                ball.animate({ zIndex : 360},{
                    step: function(now,fx){
                        ball.css("transform","rotateY(" + now + "deg)");
                    },duration:3000
                }, 'linear');
            } 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.