jQuery를 사용하여 addClass / removeClass 애니메이션


225

jQuery와 jQuery-ui를 사용하고 있으며 다양한 객체의 다양한 속성에 애니메이션을 적용하고 싶습니다.

여기서 문제를 설명하기 위해 사용자가 마우스를 가져 가면 파란색에서 빨간색으로 변경되는 하나의 div로 단순화했습니다.

을 사용할 때 원하는 동작을 얻을 수 animate()있지만 그렇게 할 때 애니메이션 스타일이 애니메이션 코드에 있어야하므로 스타일 시트와 별개입니다. ( 예 1 참조 )

대안은 사용 addClass()하고 removeClass()있지만 내가 함께 얻을 수있는 정확한 동작을 다시 만들 수 없었다 animate(). ( 예제 2 참조 )


실시 예 1

내가 가진 코드를 살펴 보겠습니다 animate().

$('#someDiv')
  .mouseover(function(){
    $(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
  })
  .mouseout(function(){
    $(this).stop().animate( {backgroundColor:'red'}, {duration:500});
  });

그것은 내가 찾고있는 모든 행동을 표시합니다 :

  1. 빨강과 파랑 사이에서 부드럽게 움직입니다.
  2. 사용자가 마우스를 div 안팎으로 빠르게 움직일 때 애니메이션 '과다 대기열'이 없습니다.
  3. 애니메이션이 계속 재생되는 동안 사용자가 마우스를 밖으로 움직이거나 움직이면 현재 '하프 웨이'상태와 새로운 '목표'상태 사이에서 마우스가 올바르게 완화됩니다.

그러나 스타일 변경이 정의되어 animate()있으므로 스타일 값을 변경해야하며 스타일 시트를 가리킬 수는 없습니다. 스타일이 정의되는이 '조각'은 실제로 나를 귀찮게하는 것입니다.


실시 예 2

여기에 내 현재의 최선 사용하여 시도 addClass()하고 removeClass(애니메이션이 작동하려면 당신이 jQuery를-UI를 필요로합니다)

//assume classes 'red' and 'blue' are defined

$('#someDiv')
  .addClass('blue')
  .mouseover(function(){
    $(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
  })
  .mouseout(function(){
    $(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
  });

이것은 원래 요구 사항 중 1과 2를 모두 나타내지 만 3은 작동하지 않습니다.

나는 그 이유를 이해한다 :

애니메이션 때 addClass()removeClass()jQuery를이 요소에 임시 스타일을 추가하고, 그들이 제공하는 클래스의 값에 도달 할 때까지 적절한 값을 증가하고, 그런 다음에야 실제로 추가 / 클래스를 제거한다.

이 때문에 스타일 속성을 제거해야합니다. 그렇지 않으면 애니메이션이 중간에 중지 된 경우 태그의 스타일 속성이 클래스 스타일보다 중요하기 때문에 스타일 속성이 유지되고 클래스 값을 영구적으로 덮어 씁니다.

그러나 애니메이션이 반쯤 완료되면 아직 새 클래스가 추가되지 않았으므로이 솔루션을 사용하면 애니메이션이 완료되기 전에 사용자가 마우스를 움직이면 색상이 이전 색상으로 이동합니다.


내가 이상적으로 원하는 것은 다음과 같은 작업을 수행하는 것입니다.

$('#someDiv')
  .mouseover(function(){
    $(this).stop().animate( getClassContent('blue'), {duration:500});
  })
  .mouseout(function(){
    $(this).stop().animate( getClassContent('red'), {duration:500});
  });

getClassContent제공된 클래스의 내용을 어디에서 반환합니까? 요점은 이런 식으로 스타일 정의를 계속 유지할 필요는 없지만 스타일 시트의 클래스에 유지할 수 있다는 것입니다.


1
어떤 버전의 IE를 지원해야합니까? IE9에 만족하십니까? 아니면 더 낮은 것을 지원해야합니까?
tw16

1
나는 솔직히 IE에 관심이 없습니다. 이것은 모두 웹킷 브라우저 (safari / chrome)에서만 테스트되었습니다.
Johannes

어떻게 getClassContent모습이 좋아입니까?
sreginogemoh

답변:


311

IE에 대해 걱정하지 않으려면 CSS 전환을 사용하여 애니메이션을 제공하고 클래스를 변경하는 jQuery를 사용하십시오. 라이브 예 : http://jsfiddle.net/tw16/JfK6N/

#someDiv{
    -webkit-transition: all 0.5s ease;
    -moz-transition: all 0.5s ease;
    -o-transition: all 0.5s ease;
    transition: all 0.5s ease;
}

14
2015-06-12 현재 - IE 10+ - Chrome 26+ - FireFox 16+ - Safari 6.1+ - Opera 12.1+ -webkit, -moz 에서 지원되며 -o는 이전 브라우저에서도 필요합니다. 공간을 절약하기 위해 남겨 둘 수도 있습니다.
clst 2016 년

3
@clst, 나는 몇 바이트의 공간을 절약하는 것보다 오래된 브라우저와의 하위 호환성을 선호합니다.
Arman H

95

또 다른 솔루션 (그러나 Richard Neil Ilagan이 지적한 jQueryUI가 필요합니다) :-

addClass, removeClass 및 toggleClass도 두 번째 인수를 허용합니다. 한 상태에서 다른 상태로 이동하는 시간

$(this).addClass('abc',1000);

jsfiddle 참조 : - http://jsfiddle.net/6hvZT/1/


28
여기에는 jQuery UI가 필요합니다. 즉시 사용 가능한 jQuery는 xxxClass()함수에 대한 애니메이션 트위닝을 지원하지 않습니다 .
Richard Neil Ilagan

@Richard Neil Ilagan : 알려 주셔서 감사합니다. 나는 그 점을 정말로 놓쳤다.
Omar Tariq

4
xxxClass이 방법으로 애니메이션 트윈에 jQueryUI를 사용할 수 있도록 .html 파일에 어떤 파일을 다운로드하여 포함시킬 수 있습니까?
질산 나트륨

[jqueryui.com] (jqueryui.com) @sodiumnitrate
joe_young

1
이 솔루션은 slide () 또는 animate ()와 같은 방식으로 애니메이션을 적용하지 않습니다. 밀리 초 값은 지연이며 애니메이션이 아닙니다.
Solona 암스트롱

38

jquery ui 's switchClass, Heres 예제를 사용할 수 있습니다 .

$( "selector" ).switchClass( "oldClass", "newClass", 1000, "easeInOutQuad" );

또는이 jsfiddle을 참조하십시오 .


1
-1. 원래 게시물에 나열된 제한 1, 2 및 3을 충족하지 않았습니다. 특히 switchClass는 요구 사항 2와 3을 제대로 처리하지 못합니다.
Johannes

12

추가 기간을 활성화 하려면 jQuery UI 효과 코어 (13KB) 가 필요합니다 (Omar Tariq이 지적한 것처럼)


5

나는 이것을 조사하고 있었지만 입 / 출력에 대한 다른 전환 속도를 원했습니다.

이것이 내가 한 일입니다.

//css
.addedClass {
    background: #5eb4fc;
}

// js
function setParentTransition(id, prop, delay, style, callback) {
    $(id).css({'-webkit-transition' : prop + ' ' + delay + ' ' + style});
    $(id).css({'-moz-transition' : prop + ' ' + delay + ' ' + style});
    $(id).css({'-o-transition' : prop + ' ' + delay + ' ' + style});
    $(id).css({'transition' : prop + ' ' + delay + ' ' + style});
    callback();
}
setParentTransition(id, 'background', '0s', 'ease', function() {
    $('#elementID').addClass('addedClass');
});

setTimeout(function() {
    setParentTransition(id, 'background', '2s', 'ease', function() {
        $('#elementID').removeClass('addedClass');
    });
});

그러면 배경색이 즉시 # 5eb4fc로 바뀐 다음 2 초에 걸쳐 천천히 정상으로 되돌아갑니다.

여기 바이올린이 있습니다


2

질문이 상당히 오래되었지만 다른 답변에없는 정보를 추가하고 있습니다.

OP는 이벤트가 완료되는 즉시 stop ()을 사용하여 현재 애니메이션을 중지합니다. 그러나 함수와 매개 변수의 올바른 조합을 사용하면 도움이됩니다. 예. 큐 애니메이션에 영향을 미치기 때문에 stop (true, true) 또는 stop (true, false).

다음 링크는 stop ()에서 사용할 수있는 다양한 매개 변수와 finish ()와의 차이점을 보여주는 데모를 보여줍니다.

http://api.jquery.com/finish/

OP는 JqueryUI를 사용하는 데 아무런 문제가 없었지만 유사한 시나리오를 경험할 수 있지만 JqueryUI를 사용하여 IE7 및 8을 지원할 수없는 다른 사용자를위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.