2010-08-15 4 views
1

JavaScript/jQuery를 통해 텍스트를 크기 조정하고 이동해야합니다. 페이드 인 및 페이드 아웃을해야하기 때문에 jQuerys animate()를 사용할 수 없습니다. 더 많은 요소 (최종 결과 : 백그라운드에서 "날아 다니는", 다른 방향으로 이동하고 페이드 아웃)을 반복해야합니다.자바 스크립트로 텍스트 크기를 조절하고 부드럽게 이동

내 문제 : 원활하게 실행되지 않아 CPU 사용량이 많이 발생합니다.

<!DOCTYPE html> 
<html> 
<head> 
<script class="jsbin" src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script> 
<meta charset=utf-8 /> 
<title>JS Bin</title> 
<!--[if IE]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
<script type="text/javascript"> 

    var steps = 300; // steps from start to finish 

    // the final css values 
    var endValueTop = 300; 
    var endValueLeft = 300; 
    var endValueFontSize = 100; 

    // the current css values (get encreased in doAnimation()) 
    var currentValueTop = 100; 
    var currentValueLeft = 100; 
    var currentValueFontSize = 0; 

    // the added values in each step 
    var stepsTop = (endValueTop - currentValueTop)/steps; 
    var stepsLeft = (endValueLeft - currentValueLeft)/steps; 
    var stepsFontSize = (endValueFontSize - currentValueFontSize)/steps; 

    function doAnimation() { 

     // increase current values 
     currentValueTop += stepsTop; 
     currentValueLeft += stepsLeft; 
     currentValueFontSize += stepsFontSize; 

     // apply them 
     $("#hello").css({ 
      top: currentValueTop, 
      left: currentValueLeft, 
      fontSize: currentValueFontSize 
     }); 

     // restart if there are steps left 
     if (steps--) { 
      window.setTimeout(function(){ 
       doAnimation(); 
      }, 50); 

     } 

    } 

    // start the first time 
    doAnimation(); 

</script> 

<style> 
    article, aside, figure, footer, header, hgroup, 
    menu, nav, section { display: block; } 
    body { position: relative; } 
    p#hello { position: absolute; top: 100px; left: 100px; font-size: 0px; } 
</style> 
</head> 
<body> 
    <p id="hello">Hello World</p> 
</body> 
</html> 

JS BIN에 예를 실행 : 여기 버전을 박탈합니다.

제안 사항? 보너스 : 어떻게 CPU 부하를 줄이기 위해? 고마워요!

스테

내가 휴대 전화에 매우 성공적으로 몇 년 전에이 라이브러리를 사용했습니다
+0

'.animate()'를 사용하면 무엇이 문제입니까? http://jsbin.com/oxode/2 'animate'를 사용하여 아무런 문제없이 페이드 인/아웃 할 수 있어야합니다. –

+0

@Russ Cam : 한 번의 실행 (및 다른 작업)에서 불투명도 늘리기 및 줄이기 나를시키지 마. 내가 할 수 있었으면 좋겠어 ... –

+0

어떨까요? 텍스트가 연속적으로 늘어나고 페이지의 위치가 오른쪽 아래로 이동하게하는'animate '호출이 여러 번 나뉘었을 때 불투명도를 변경할 호출을 허용하는 방법은 어떻습니까? 페이드 인 및 페이드 아웃? –

답변

2

먼저, 50ms 타이머 내에서 절대 jQuery를 사용하지 마십시오. 높은 CPU 사용량을 유발하는 것이 있다면 그 것입니다. 이와 같은 것을 대신 사용하십시오.

var hello = $('#hello')[0].style; 

function doAnimation() { 

    //code... 

    hello.top = curentValueTop + 'px'; 
    hello.left = currentValueLeft + 'px'; 
    hello.fontSize = currentValueFontSize + 'px'; 

    //rest of code... 

} 

그러나 글꼴의 부드럽고 일관된 스케일링은 대부분의 브라우저가 잘 처리하지 못하는 것입니다. 99 % 웹 페이지의 텍스트가 당신의 얼굴로 날아 가지 않는 이래로 우리는 이것을 알아 채지 못합니다. 필요한 최대 글꼴 크기로 렌더링 된 텍스트 이미지로 인해 더 많은 행운을 누릴 수 있습니다.

또한 50ms ~ = 20fps로 화면의 절반을 가로 지르는 애니메이션의 경우 특히 부드러운 프레임 속도는 아닙니다. jQuery를 사용하지 않으면 CPU 사용량이 현저하게 줄어들어 작은 간격으로 시도 할 수 있습니다. 물론 대부분의 브라우저는 높은 프레임 속도의 애니메이션도 잘 처리하지 못합니다.

20 세 비디오 게임 콘솔이 프레임 속도의 4 분의 1에 아무런 문제가 없었던 일을하기 위해 고군분투하는 최신 웹 브라우저. (브라우저가 유지할 수있는 경우 초당 60 프레임에 대한)

편집 15ms의 타이머가 분수를 받아들이으로이 http://jsbin.com/oxode/4/edit

내가 fontSizeem 장치를 사용 시도하고 사용. 애니메이션 설정을 약간 조정해야하지만, 더 부드럽게 조정됩니다.

+0

나는 이것이 더 잘 수행되어야 함을 알 수있다. 고마워, 나는 뭔가를 배웠다. 그러나 텍스트 건너 뛰기는 해결되지 않습니다. –

+0

도'setTimeout' 호출에서 함수 호출을 감싸는 불필요한 익명 함수를 제거하기 위해'window.setTimeout (doAnimation, 15);'또는'window.setTimeout (arguments.callee, 15);'를 사용하십시오. –

+0

@ Steffen Wenzel은 텍스트 점프가 브라우저에 많이 달려 있습니다. 파이어 폭스에서 나에게 가장 부드럽게 보였다. 또한'setTimeout' (http://jsbin.com/oxode/5/edit) 대신'setInterval'을 사용하면보다 부드러운 애니메이션이 될 수도 있습니다. 그러나 결국 당신은 무엇인가 상관없이 어떤 텍스트를 점프하게 될 것입니다. 그래서 실용적이라면 이미지 대신 사용하는 것이 좋습니다. – MooGoo

0

jQuery를 아니었다 정말 긴 애니메이션을 위해 설계 되었기 때문에 ("느린"은 1 초 미만 임) 너무 높은 CPU로드가 실제로 사라지지 않을 것입니다. 당신이 할 수

한 것은 애니메이션 기능이 이미이 프로그램이 있었는지를 많이하지 http://api.jquery.com/animate/

을 사용하는 것입니다.

+0

네,이 코드를 세 줄로 줄였습니다. 그러나 한 애니메이션에서 불투명도를 높이거나 낮추는 방법도 고려해야합니다. 그리고 5 개 요소에 대해 하나의 간격을 사용하면 평행하게 움직입니다. –

관련 문제