2014-08-24 4 views
1

디스플레이에서 전환 할 때 페이드 인/페이드 아웃 효과를 추가하려고합니다. 표시하지 않음 : 블록 및 그 반대로합니다. 이 코드 나는이된다디스플레이 전환시 전환 효과 : 없음 - 표시 : 블록

자바 스크립트 :

function showDiv(idInfo) { 
var sel = document.getElementById('contentDivs').getElementsByClassName('x'); 
for (var i=0; i<sel.length; i++) { 
    sel[i].style.display = 'none'; 
} 
document.getElementById('content'+idInfo).style.display = 'block'; 
} 
window.onload = function() {showDiv('1');} 

HTML/PHP :이 수를 만드는 방법에 대한

<div id="menu"> 
    <ul> 
     <a href='' onclick='showDiv("1");return false'><li>Button 1</li></a> 
     <a href='' onclick='showDiv("2");return false'><li>Button 2</li></a> 
     <a href='' onclick='showDiv("3");return false'><li>Button 3</li></a> 
    </ul> 
</div> 

<div id="contentDivs"> 
<?php 
    for($i=1;$i<=3;$i++){ 
     echo(' 
     <div id="content'.$i.'" class="x"> 
      <div id="box1"> 
       <p>Text '.$i.'</p> 
      </div> 
      <div id="box2"> 
       <table> 
        <tr> 
         <td>Content '.$i.'</td> 
         <td>Content '.$i.'</td> 
         <td>Content '.$i.'</td> 
        <tr> 
       </table> 
      </div> 
     </div>'); 
    }?> 
</div> 

어떤 아이디어? 여러 가지 시도를했지만 올바른 방법을 찾아 낼 수 없습니다. 도움을 주시면 감사하겠습니다.

감사합니다.

+0

루프가 밀리 초 단위로 실행되므로 전환이 표시되지 않습니다. – Shahar

+0

루프와 관련이 없지만 디스플레이 간 전환 : 표시 할 대상 없음 : 블록. 루프는 새로 고침시 실행되지만 버튼을 클릭하여 내용을 변경하면 실행됩니다. 그리고 다른 버튼을 클릭 할 때 콘텐츠가 페이드 인/아웃되도록하고 싶습니다. 어떤 아이디어? – Patrick2607

답변

1

이 작업을 수행하는 기본 방법은 없습니다. CSS3의에게 opacity 속성을 사용하여 약간 다른 방법으로이 일을 몇 가지 방법이 있습니다

첫째, 당신이 active 클래스를 추가하는 CSS 선언과 CSS3 전환 추가 : 다음

#menu ul a { 
    opacity: 1; 
    -webkit-transition: opacity 1s; /* For Safari 3.1 to 6.0 */ 
    transition: opacity 1s; 
} 

#menu ul a.inactive { 
    opacity: 0; 
    -webkit-transition: opacity 1s; /* For Safari 3.1 to 6.0 */ 
    transition: opacity 1s; 
} 

을 자바 스크립트에 inactive 클래스를 추가하십시오. 또한 1 초 후 adisplay: none으로 변경하십시오.

function showDiv(idInfo) { 
    var newId = 'content' + idInfo; 
    var sel = document.getElementById('contentDivs').getElementsByClassName('x'); 
    for (var i=0; i<sel.length; i++) { 
     // Fade In all our currently viewable divs 
     sel[i].className += 'inactive'; 
     // If this is NOT our new div, hide after 1 second (transition time) 
     if (sel[i].id !== newId) 
      setTimeout(function() { 
       sel[i].style.display = 'none'; 
      }, 1000); 
     } 
    } 
    var newEl = document.getElementById(newId); 
    // Make sure our new element is being displayed 
    newEl.style.display = 'block'; 
    // Add the `inactive` class in order to make the opacity 0 
    newEl.className += 'inactive'; 
    setTimeout(function() { 
     // Remove the `inactive` className in order to trigger the fade in 
     newEl.className = ''; 
    }, 0); 
} 
window.onload = function() {showDiv('1');} 

또한 자바 스크립트 (NO CSS 필수)와 함께이 작업을 수행 할 수 있습니다 : 요소와 요소의 전환의 디스플레이가 동일한 프레임에 시작하면

function showDiv(idInfo) { 
    var newId = 'content'+idInfo; 
    var $elements = $('#contentDivs').find('.x'); 
    $elements.fadeOut(1000, funciton() { 
     var $newElement = $('#' + newId); 
     $newElement.fadeIn(); 
    }); 
} 
window.onload = function() {showDiv('1');} 
+1

이것은 모두 한 번에 발생하기 때문에 하나의 setTimeout 만 있으면되지만 완전한 대답입니다. 또는 css에서 전환 길이를 정의 할 수 있도록 전환 이벤트를 사용하는 것이 더 좋습니다. –

+0

1)'#menu ul a.inactive'의 전환 규칙은 필요 없습니다. 2) CSS 전환 규칙과 jQuery 페이드 기능을 모두 사용하는 것은 좋지 않습니다 3)'display : none'은'opacity : 0'와 다릅니다 –

+0

방금 ​​편집을 추가했습니다. 내가 말하고자하는 것은 이것들이 두 가지 분리 된 해결책이라는 것입니다. jQuery 솔루션에는 CSS가 필요하지 않습니다. –

1

, 전환이 발생하지 않을 것 .

당신은 요소의 표시를 설정 한 다음 공의의 setTimeout이 전환이 다음 프레임에서 발생하는 원인이됩니다 호출

setTimeout(function() { 
    // start transition 
}, 0); 

해야한다.