2010-04-15 3 views
4

간단한 애니메이션을 만들려고합니다.jQuery UI - addClass removeClass - CSS 값이 고정되어 있습니다.

  1. div를 표시합니다. 그것은 정확하게 움직입니다.
  2. div를 숨 깁니다. 옳은.
  3. div를 다시 표시합니다. 그것은 보여 주지만 애니메이션은 없습니다. 처음 중단했을 때의 가치를 고수합니다.

어쨌든 [add | remove] 클래스에서 발생하는 보간 CSS가 막히게됩니다. 두 번째로, [add | remove] 클래스가 실제로 실행 중이지만, 클래스에서 설정 한 CSS가 무시되고 있습니다 (나는 그림자가있는 것 같음). .animate 및 하드 코딩 된 스타일 값을 사용하지 않고 어떻게 해결할 수 있습니까? 전체 요점은 CSS 클래스에 애니메이션 끝점을 배치하는 것이 었습니다.

감사합니다.

<!doctype html> 

<style type="text/css"> 
div { 
    width: 400px; 
    height: 200px; 
} 
.green { 
    background-color: green; 
} 
</style> 

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/javascript"></script> 
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.8/jquery-ui.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
$(function() { 
    $('#show').bind({ 
     click: function() { 
      showAndRun() 
     } 
    }) 
    $('#hide').bind({ 
     click: function() { 
      $('div').stop(true, false).fadeOut('slow') 
     } 
    }) 

    function showAndRun() { 
     function pulse() { 
      $('div').removeClass('green', 2000, function() { 
       $(this).addClass('green', 2000, pulse) 
      }) 
     } 
     $('div').stop(true, false).hide().addClass('green').fadeIn('slow', pulse) 
    } 
}) 
</script> 

<input id="show" type="button" value="show" /><input id="hide" type="button" value="hide" /> 
<div style="display: none;"></div> 

당신은 또한 here at jsbin

+1

@Jason은 jsbin에서 추가 한 링크입니다. 맞습니까? 그것은 당신의 묘사 문제 같은데. – Earlz

+0

예, 내 문제를 정확하게 반영합니다. 감사합니다. –

답변

2

무엇을 나는 해결책을 알아 냈다고 볼 수 있습니다. 내가 아직 행복하다면 잘 모르겠다. show을 클릭하면 본질적으로 CSS의 "재설정"이 매우 불량합니다.

애니메이션이 영원히 반복됩니다. 그래서 나는 jQuery 큐 (유한 길이)에 의존 할 수 없다. 코드에 표시된대로 콜백을 통해 루프를 완료해야합니다. 원인이되는 문제 : .stop(true, true) 수 없습니다. 첫 번째 true는 대기열을 지우지 만 현재 실행중인 애니메이션 이후 대기열에는 아무 것도 없습니다. 그래서 그건 쓸모가 없다. 두 번째 사실은 대기열의 마지막 애니메이션으로 점프합니다. 다시 쓸모가 없습니다. 실제로 우리는 그 자체로 반복되는 한 가지에 머물러 있기 때문입니다. 두 번째 인수는 false이어야하며 그렇지 않으면 무한 루프를 중단해야합니다.

중단 문제. 그것은 CSS가있는 곳입니다. 애니메이션이 보간 된 것이 무엇이든지 (여기서는 background-color)에 무작위 CSS 소품이 붙어 있습니다. 또한 나는 방해가 순간적 이길 바랬다. 그래서 다른 방법은 없었습니다.

필자의 경우 애니메이션 중에 background-colorelement.style (브라우저 도구에서 검사하여 발견 됨)에 설정되어 있었는데, 이는 다른 작업보다 우선합니다. 이 소품은 첫 번째 애니메이션이 실행되기 전까지는 존재하지 않았습니다. 그 다음 그것은 중단되었고 임시 스타일은 가정되어있었습니다 (아마도).

그래서 애니메이션을 다시 실행하십시오. 녹색 등급이 적용됩니다. jQuery는 진행할 색상 범위를 파악합니다. 붙은 element.styles 값이 클래스에서 제공하는 값보다 우선하기 때문에 #shadeofgreen에서 #thesameshadeofgreen으로 바뀝니다. 따라서 애니메이션은 같은 색상의 두 슬라이드 사이를 이동합니다. 달리고 있어요! 그러나 변경할 색깔이 없습니다.

제 경우의 수정 사항은 끔찍하지 않지만 다양한 상황에 쉽게 적용될 수 있는지 확신 할 수 없기 때문에 여전히 마음에 들지 않습니다.

변경

$('div').stop(true, false).hide().addClass('green').fadeIn('slow', pulse) 

$('div').stop(true, false).removeAttr('style').hide().addClass('green').fadeIn('slow', pulse) 

의 핵심은 본질적으로 당신의 CSS를 재설정입니다

.removeAttr('style').hide().addClass('green') 

입니다. 물건이 다시 표시되기 전에 항상 일어나기 때문에 필요할 때 항상있을 수 있습니다. 그 (것) 때문에 green CSS 클래스의 색상에 !important 퍼팅

참고 (JQuery와 애니메이션에서 사용하는) element.styles 우선합니다 작동하지 않습니다, 당신은 원하는 결과를 얻을 수 없습니다.

물론 나는 아직 제안을하고 있습니다. 나는 CSS와 jQuery를 처음으로 살펴보기 시작한 이래로 아마도 뭔가를 놓쳤을 것입니다.

.removeAttr('style')의 영향을 고정 코드 here on jsbin에서 확인할 수 있습니다.