CSS 표시 속성의 전환


1446

현재 CSS '메가 드롭 다운'메뉴를 디자인하고 있습니다. 기본적으로 일반적인 CSS 전용 드롭 다운 메뉴이지만 다른 유형의 내용이 포함되어 있습니다.

지금이 순간, 이 세 전환은 '디스플레이'속성에 적용되지 않는 CSS 표시 , 즉, 당신은에서 전환의 모든 종류의 할 수 없습니다 display: nonedisplay: block(또는 조합).

누군가가 최상위 메뉴 항목 중 하나를 가리킬 때 위 예제의 2 단계 메뉴가 '페이드 인'하는 방법이 있습니까?

visibility:속성에서 전환을 사용할 수 있다는 것을 알고 있지만 효과적으로 사용하는 방법을 생각할 수 없습니다.

나는 또한 높이를 사용해 보았지만 비참하게 실패했습니다.

또한 JavaScript를 사용 하여이 작업을 수행하는 것은 사소한 일이라는 것을 알고 있지만 CSS 만 사용하도록 도전하고 싶었고 조금 짧아지고 있다고 생각합니다.


CSS 전환을 표시하지 않고 opacity 속성에 적용하면 작동합니까?
Paul D. Waite

13
위치 : 절대; 가시성 : 숨겨진; 디스플레이와 동일 : none;
Jawad

8
@Jawad : 같은 것을 추가하는 경우에만 z-index:0.
DanMan

7
@Jawad : 스크린 리더가 읽지 visibility: hidden않으 려면 사용 하지 않는 것이 좋습니다 (일반 브라우저는 그렇지 않음). 요소 의 가시성 만 정의하고 (말하기와 같이 opacity: 0) 여전히 선택 가능하고 클릭 가능하며 이전에 사용했던 모든 것을 선택할 수 있습니다. 보이지 않습니다.
Forest Katsch

1
pointer-eventsIE 8,9,10에서는 지원 되지 않으므로 항상 괜찮지는 않습니다.
Steven Pribilinskiy

답변:


1351

두 가지 이상의 전환을 연결할 수 있으며 visibility이번에는 편리합니다.

div {
  border: 1px solid #eee;
}
div > ul {
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity 0.5s linear;
}
div:hover > ul {
  visibility: visible;
  opacity: 1;
}
<div>
  <ul>
    <li>Item 1</li>
    <li>Item 2</li>
    <li>Item 3</li>
  </ul>
</div>

(공급 업체 접두사 transition속성 을 잊지 마십시오 .)

자세한 내용은 이 기사에 있습니다.


10
이 답변은 다른 것보다 적은 작업처럼 보이고 디스플레이에서 기대할 수있는 것을 달성합니다. 감사. 많은 시간을 절약했습니다.
Brendan

21
그래, 이것의 문제는 보이지 않는 경우에도 겹칠 것입니다. 나는 height : 0을 사용하는 것이 훨씬 더 나은 해결책이라는 것을 발견했다
Josh Bedo

739
이것은 좋지만 문제는 "표시 없음"요소는 여전히 공간을 차지하지만 "표시 없음"은 그렇지 않습니다.
Rui Marques

41
아마도 뭔가 빠졌지 만 가시성과 불투명도를 모두 변경하는 이유는 무엇입니까? 불투명도를 0으로 설정하지 않으면 요소가 숨겨집니다. 가시성을 숨김으로 설정해야하는 이유는 무엇입니까?
GMA

21
@GeorgeMillo 불투명도 만 설정하면 요소가 실제로 페이지 렌더링에 표시됩니다 (예를 들어, 생각을 클릭 할 수 없음).
adriendenat

800

이 기능을 사용하려면 다른 방법으로 요소를 숨겨야합니다.

나는 <div>s를 절대적 으로 배치 하고 숨겨진 것을로 설정 하여 효과를 달성 했습니다 opacity: 0.

display속성을에서 (으) none로 전환해도 block다른 요소에 대한 전환이 발생하지 않습니다.

이 문제를 해결하려면 항상 요소를 허용 display: block하지만 다음 방법 중 하나를 조정하여 요소를 숨기십시오.

  1. (가) 설정 height0.
  2. (가) 설정 opacity0.
  3. 요소를 다른 요소의 프레임 외부에 배치 overflow: hidden .

더 많은 솔루션이있을 수 있지만 요소를 토글하면 전환을 수행 할 수 없습니다 display: none . 예를 들어, 다음과 같은 것을 시도 할 수 있습니다.

div {
    display: none;
    transition: opacity 1s ease-out;
    opacity: 0;
}
div.active {
    opacity: 1;
    display: block;
}

그러나 그것은 없습니다 . 내 경험상, 나는 이것이 아무것도하지 않는 것을 발견했다.

이 때문에 항상 요소를 유지해야 display: block하지만 다음과 같이하면 해결할 수 있습니다.

div {
    transition: opacity 1s ease-out;
    opacity: 0;
    height: 0;
    overflow: hidden;
}
div.active {
    opacity: 1;
    height: auto;
}

29
철저한 답변을 주신 Jim에게 감사드립니다. display : 속성이 전혀 변경되지 않으면 모든 전환이 작동하지 않는다는 사실에 대해 옳습니다. 부끄러운 일입니다-그 이유가 무엇인지 궁금합니다. 참고로, 원래 질문에 게시 한 것과 동일한 링크에서 내가 어디에 있는지 알 수 있습니다. 내가 가지고있는 유일한 (작은) 문제는 페이지가로드 될 때 Chrome [5.0.375.125]에 있습니다. 페이지에 요소가로드되면 메뉴가 빠르게 사라지는 것을 볼 수 있습니다. Firefox 4.0b2와 Safari 5.0은 절대적으로 훌륭합니다 ... 버그 또는 내가 놓친 것입니까?
RichardTape

7
본인은 이것이 옳고 이에 기여할 것에 동의합니다. 미래의 여행자를 위해 향하고 있습니다. Chrome에서 작동하는 솔루션을 찾았지만 iPhone 4에서 실패했습니다. visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out;이 기능이 올바르게 전환되지 않을뿐만 아니라 대상 요소가 표시되지 않습니다. QA는 당신, 저, 그리고 당신의 엄마를 실망시킬 것입니다.
SimplGy

1
당신은 실제로 단지 말을 ..뿐만 아니라 가시성 속성을 전환 할 수
Cu7l4ss

2
숨겨진 상태를 설정 height: 0;하고 전환하지 않으면 전환이 작동하지 않습니다. 불투명도를 전환하려고 시도했습니다. height: 0;
chovy

10
당신은 정말 overflow: hidden감사합니다 때문에 투표를했습니다 !
thiagoh

277

이 게시물을 게시 할 때 display속성 을 변경하려고하면 모든 주요 브라우저에서 CSS 전환이 비활성화 되지만 CSS 애니메이션은 여전히 ​​잘 작동하므로 해결 방법으로 사용할 수 있습니다.

예제 코드 (따라서 메뉴에 적용 할 수 있음) 데모 :

스타일 시트에 다음 CSS를 추가하십시오.

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}
@keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

그런 다음 fadeIn부모 호버의 자식에 애니메이션을 적용하십시오 (물론 set display: block).

.parent:hover .child {
    display: block;
    -webkit-animation: fadeIn 1s;
    animation: fadeIn 1s;
}

2019 업데이트-페이드 아웃을 지원하는 방법 :

(일부 JavaScript 코드가 필요합니다)

// We need to keep track of faded in elements so we can apply fade out later in CSS
document.addEventListener('animationstart', function (e) {
  if (e.animationName === 'fade-in') {
      e.target.classList.add('did-fade-in');
  }
});

document.addEventListener('animationend', function (e) {
  if (e.animationName === 'fade-out') {
      e.target.classList.remove('did-fade-in');
   }
});
div {
    border: 5px solid;
    padding: 10px;
}

div:hover {
    border-color: red;
}

.parent .child {
  display: none;
}

.parent:hover .child {
  display: block;
  animation: fade-in 1s;
}

.parent:not(:hover) .child.did-fade-in {
  display: block;
  animation: fade-out 1s;
}

@keyframes fade-in {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

@keyframes fade-out {
  from {
    opacity: 1;
  }
  to {
    opacity: 0;
  }
}
<div class="parent">
    Parent
    <div class="child">
        Child
    </div>
</div>


3
고마워 height: 0(전환 용) 트릭은 높이가 페이드 아웃 전환에 0으로 설정됩니다 있기 때문에 작동하지 않는 것 위에서 언급하지만,이 트릭은 잘 작동하는 것 같다.
Elliot Winkler 2014 년

41
감사합니다. 매우 유용합니다. 그러나 그것을 희미하게하는 방법?
Illiou

1
이 답변의 첫 번째 단락은 의미가 없습니다. 브라우저는 display속성 을 사용하는 순간 모든 트랜지션을 완전히 비활성화하지 않습니다 . 실제로 그럴 이유가 없습니다. 그리고이 경우에도 않았다 , 왜 애니메이션은 다음 일 것이다? displayCSS 애니메이션에서도이 속성을 사용할 수 없습니다 .
BoltClock

7
최상의 대답은 전환으로는 불가능하지만 애니메이션에서는 가능합니다.
Mikel

6
요소가 천천히 사라져야하는 리버스 애니메이션은 어떻습니까?
Green

77

나는 것으로 의심되는 이유 전환이 경우 사용할 수 있음을 display실제로 수행 표시 어떤 변화 때문에이다. 부드럽게 애니메이션 될 수있는 것은 변경 하지 않습니다 .

display: none;그리고 visibility: hidden;두 가지 완전히 다른 것입니다.
둘 다 요소를 보이지 않게 만드는 효과가 있지만 visibility: hidden;레이아웃에서 여전히 렌더링되지만 눈에 띄게 표시 되지는 않습니다 .
숨겨진 요소는 여전히 공간을 차지하며 여전히 인라인으로 또는 블록 또는 블록 인라인 또는 테이블 display로 렌더링 되거나 요소가 렌더링하도록 지시 한대로 공간을 차지합니다.
다른 요소는 해당 공간을 차지하도록 자동으로 이동 하지 않습니다 . 숨겨진 요소는 실제 픽셀을 출력으로 렌더링하지 않습니다.

display: none반면에 실제로 는 요소가 완전히 렌더링 되는 것을 방지 합니다 . 그것은 차지하지 않는 어떤 레이아웃 공간. 이 요소가 차지하는 공간의 일부 또는 전부를 차지한 다른 요소는 이제 해당 요소 가 전혀 존재하지 않는 것처럼 해당 공간을 차지하도록 조정됩니다 .

display또 다른 시각적 속성이 아닙니다.
이 요소의 전체 렌더링 모드, 설정 등의 여부로의 block, inline, inline-block, table, table-row, table-cell, list-item, 또는 무엇이든!
그 각각은 매우 다른 레이아웃 파급 효과를 가지고 있고,이 애니메이션에 더 합리적인 방법이 될 수 없습니다 또는 부드럽게 (에서 원활한 전환 상상하는 시도를 전환 할 blockinline또는 그 반대의 예를 들어!).

이 전환은 불가능 이유 인 경우의 표시 변경 (변화가 또는에서 경우에도 none- none!, 그것은 수단이없는 전혀 렌더링하는 것이 자신의 요소 렌더링 모드는 단지 투명의되지 않음).


8
위의 해결책만큼 좋은 것은 전환이 디스플레이 속성에 적용되지 않는 이유에 대한 합리적인 설명을 얻는 것이 매우 만족 스러웠습니다.
kqr

8
동의하지 않습니다. 완벽하게 이해할 수 있습니다. 전환이 시작될 때 display : none to display : block이 즉시 발생하면 훌륭합니다. 그리고 전환을 위해 전환이 끝나면 display : block에서 display : none으로 전환하지 않으면 완벽합니다.
커티스 얄롭

2
점에서 사각형까지의 애니메이션이 무엇인지 상상할 수 없다면 문제가있는 것입니다. 공간을 차지하지 않고 직사각형 공간을 차지하는 것으로의 전환은 매우 분명합니다. 마치 모든 응용 프로그램처럼 마우스로 직사각형을 드래그 할 때마다 수행됩니다. 이 실패의 결과로 최대 높이와 ​​음수 마진과 관련된 많은 해킹이 발생합니다. 작동하는 유일한 것은 '실제'높이를 캐싱 한 다음 JavaScript를 사용하여 0에서 캐시 된 값으로 애니메이션하는 것입니다. 슬퍼.
Triynko

2
Tryniko : display : none은 요소의 크기를 0 x 0의 사각형으로 변경하지 않으며 DOM에서 제거합니다. width 및 height 속성을 0으로 애니메이션하여 사각형에서 점으로 애니메이션을 적용한 다음 다른 요소는 마치 'display : none'이 있지만 'display'속성은 'block'으로 유지되는 것처럼 주변을 흐릅니다. 요소는 여전히 DOM에 있습니다. display : block과 display : none 사이의 애니메이션 개념은 말도 안됩니다. 중간 상태가 없습니다. 요소는 DOM에 존재하거나 아무리 작거나 보이지 않더라도 DOM에 존재하지 않습니다.
Steve Thorpe

1
별개의 속성에 애니메이션을 적용하는 것은 어리석지 않습니다. 이산 속성은 display다른 속성처럼 부드럽게 전환 할 수 없지만 타이밍이 중요하지 않다는 것을 의미하지는 않습니다. 제어 할 수있는 경우 의 전환 disply:blockdisplay:none일이 매우 중요합니다. @CurtisYallop이 설명한 것처럼. 난에서 전환하려는 경우 opacity:1opacity:0다음 변화 display:blockdisplay:none나는 그것을 할 수 있어야합니다.
Jens

55

CSS에 존재하지 않는 콜백 대신 transition-delay속성 을 사용할 수 있습니다 .

#selector {
    overflow: hidden; // Hide the element content, while height = 0
    height: 0; opacity: 0;
    transition: height 0ms 400ms, opacity 400ms 0ms;
}
#selector.visible {
    height: auto; opacity: 1;
    transition: height 0ms 0ms, opacity 600ms 0ms;
}

무슨 일이야?

  1. 언제 visible 클래스 추가 둘 모두 heightopacity(0 MS) 지연없이 애니메이션을 시작하지만 height(당량 완전한 애니메이션 0 MS 소요 display: block)과 opacity600 밀리 초 걸린다.

  2. 경우 visible클래스가 제거된다 opacity(당량의 초기 값으로 복원 (0, MS가 400 밀리 초 시간 지연)의 애니메이션을 시작하고, 높이가 400 밀리 초 만 후 즉시 (0 밀리 초)을 대기 display: none애니메이션 콜백하여).

이 방법은을 사용하는 방법보다 낫습니다 visibility. 이러한 경우 요소가 여전히 페이지의 공간을 차지하므로 항상 적합하지는 않습니다.

더 많은 예는 이 기사 를 참조 하십시오 .


8
이것은 더 많은지지를받지 못한다는 것에 놀랐습니다.이 영리한 솔루션은 어떻게 든 완벽하게 작동합니다.
fanfare

3
height:100%경우에 따라 레이아웃을 파괴 할 수있는 경우 에만 작동합니다 . 문제가되지 않으면 훌륭한 솔루션입니다. 몇 가지 양방향 작업 중 하나입니다.
Fabian von Ellerts

대단해! 페이드 아웃 애니메이션 시간이 페이드 인 시간과 동일하게되기를 원했기 때문에 제 경우에는 더 단순화 할 수있었습니다. 사용하는 대신 transition: height 0ms 0ms, opacity 600ms 0ms방금 사용했습니다 transition-delay: 0s.
Jacob Lockard

52

display 전환이 작동하는 속성 중 하나가 아닙니다.

전환을 적용 할 수있는 CSS 속성 목록은 애니메이션 가능 CSS 속성 을 참조하십시오 . 보간 방법 은 CSS 값 및 단위 모듈 레벨 4, 값 결합 : 보간, 덧셈 및 누적 을 참조하십시오.

CSS 3까지는 9.1 에 나열되었습니다 . CSS의 속성 (경고 팝업을 닫으십시오)

나는 또한 높이를 사용해 보았지만 비참하게 실패했습니다.

마지막 으로이 작업을 수행 할 max-height때 애니메이션 대신 사용할 수있는 속성 인 대신 사용 했지만 약간의 해킹이 있었지만 작동하지는 않았지만 복잡한 페이지 또는 저가형 모바일 사용자에게는 매우 위험 할 수 있습니다 장치.


링크가 더 이상 애니메이션 가능 속성 섹션을 직접 가리 키지 않습니다.
앤드류 램

1
@AndrewLam 수정되었습니다. 감사.
robocat

34

이제 블록 특성에 사용자 정의 애니메이션을 추가 할 수 있습니다.

@keyframes showNav {
  from {opacity: 0;}
  to {opacity: 1;}
}
.subnav-is-opened .main-nav__secondary-nav {
  display: block;
  animation: showNav 250ms ease-in-out both;
}

데모

이 데모에서는 하위 메뉴가에서 display:none로 변경되어 display:block여전히 페이드로 관리됩니다.


해야 myfirstshowNav여기? 그리고 Firefox는 어떻습니까? 불행히도 언급 한 데모 페이지에서 관련 내용을 찾을 수 없습니다.
Sebastian vom Meer

감사합니다 @SebastianG. 수정하고 위의 정보를 추가했습니다.
Manish Pradhan

@Sebastian vom Meer : 이전 Firefox 버전에는 "-moz-"공급 업체 접두사가 필요합니다. 편집 된 코드 참조
Herr_Schwabullek

23
내가 빠진 것이 아니라면 "데모"링크에 더 이상 하위 메뉴 전환이 표시되지 않습니다.
현실적인

1
공간을 차지하지 않는 (디스플레이 : none의 경우) 공간을 차지하는 (디스플레이 : 블록) 로의 올바른 전환은 페이드 인이 아닌 치수의 확장입니다. 가시성을 숨기고 (공간을 차지하지만 보이지 않는) 가시성 문제인 경우 크기는 동일하게 유지되며 페이드 인이 적절합니다. 이 답변 중 어느 것도 문제를 해결하지 못합니다.
Triynko

21

W3C Working Draft 에 따르면 2013 년 11 월 19display 일은 애니메이션이 가능한 자산 이 아닙니다 . 다행히도 visibility애니메이션이 가능합니다. 불투명도 전환 ( JSFiddle )을 사용하여 전환을 연결할 수 있습니다.

  • HTML :

    <a href="http://example.com" id="foo">Foo</a>
    <button id="hide-button">Hide</button>
    <button id="show-button">Show</button>
  • CSS :

    #foo {
        transition-property: visibility, opacity;
        transition-duration: 0s, 1s;
    }
    
    #foo.hidden {
        opacity: 0;
        visibility: hidden;
        transition-property: opacity, visibility;
        transition-duration: 1s, 0s;
        transition-delay: 0s, 1s;
    }
  • 테스트를위한 JavaScript :

    var foo = document.getElementById('foo');
    
    document.getElementById('hide-button').onclick = function () {
        foo.className = 'hidden';
    };
    
    document.getElementById('show-button').onclick = function () {
        foo.className = '';
    };

설정하지 않고 링크를 투명하게 만들면 visibility: hidden클릭 할 수 있습니다.


1
나는 jsfiddle 예제에서 전혀 변화가 보이지 않는다
Gino

@Gino로 변경 0하여 수정했습니다 0s. 분명히 과거에는 테스트에 사용한 브라우저가 단위가없는 0 번을 지원했습니다. 그러나, 단위없는 시간은 하지 의 부분 W3C 후보 추천 2016 9월 29일 .
feklee

이것은 더 많이지지되어야한다. 나는 그것이 최고의 솔루션 중 하나라는 것을 알았습니다.
Arthur Tarasov

지연 사용법은 이것이 어떻게 작동하는지 이해하는 가장 좋은 논리입니다. 애니메이션하고 숨 깁니다. 숨기기를 해제하고 애니메이션을 적용하십시오. 나에게 완벽한 솔루션
Bruno Pitteli Gonçalves

14

편집 :이 예제에서는 표시 없음이 적용되지 않습니다.

@keyframes hide {
  0% {
    display: block;
    opacity: 1;
  }
  99% {
    display: block;
  }
  100% {
    display: none;
    opacity: 0;
  }
}

위에서 일어나는 일은 불투명도가 사라지는 동안 애니메이션 디스플레이의 99 %가 차단되도록 설정되어 있다는 것입니다. 마지막 순간에 표시 속성이 없음으로 설정되어 있습니다.

가장 중요한 비트는 애니메이션 채우기 모드를 사용하여 애니메이션이 끝난 후 마지막 프레임을 유지하는 것입니다.

.hide {
   animation: hide 1s linear;
   animation-fill-mode: forwards;
}

다음은 두 가지 예입니다. https://jsfiddle.net/qwnz9tqg/3/


이 솔루션으로 display: none작동하지 않습니까?
Bart Calixto

'애니메이션 채우기 모드 : 전달'이 아니어야합니다.
Alex

편집은 6 자 여야하며 편집 만 제안 할 수 있습니다.
Alex

1
@Alex Ok. 오타 수정. 흥미로운 점은 제 답변이 예상대로 작동하지 않는다는 것입니다. 그러나 브라우저가 지원할 때까지 계속 유지할 것이라고 생각하는 것이 논리적입니다.
Pawel

3
이 바이올린에서 알 수 있듯이 커서가 설정된 상태에서는 display: none실제로 구현되지 않습니다. jsfiddle.net/3e6sduqh
robstarbuck

13

내 깔끔한 JavaScript 트릭은 전체 시나리오를 두 개의 다른 함수로 분리하는 것입니다 !

일을 준비하기 위해 하나의 전역 변수가 선언되고 하나의 이벤트 핸들러가 정의됩니다.

  var tTimeout;
  element.addEventListener("transitionend", afterTransition, true);//firefox
  element.addEventListener("webkitTransitionEnd", afterTransition, true);//chrome

그런 다음 요소를 숨길 때 다음과 같이 사용합니다.

function hide(){
  element.style.opacity = 0;
}

function afterTransition(){
  element.style.display = 'none';
}

요소를 다시 나타 내기 위해 다음과 같이하고 있습니다.

function show(){
  element.style.display = 'block';
  tTimeout = setTimeout(timeoutShow, 100);
}

function timeoutShow(){
  element.style.opacity = 1;
}

지금까지 작동합니다!


이것은 자바 스크립트 명령이 별도의 기능에 있기 때문에 시간 지연 때문에 작동합니다. 많은 경우에 시간 지연이 좋은 해결책 인 것 같습니다 :)

10

나는 오늘 position: fixed재사용 하고있는 모달 로 이것을 만났습니다 . 나는 그것이 display: none외모로 뛰어 들었고 z-index(음수 값 등) 이상한 일을 했기 때문에 그것을 유지하고 애니메이션 할 수 없었습니다.

나는 또한 사용하던 height: 0하는 height: 100%모달가 나타 났을 때,하지만 그것은 단지했다. 이것은 당신이 사용하는 것과 동일 left: -100%합니다.

그런 다음 간단한 답변이 있음을 알게되었습니다. Et Voila :

먼저 숨겨진 모달. (가) 공지 사항 height입니다 0및 체크 아웃 height전환의 선언을 ... 그것은을 가지고 500ms, 더 이상 내보다하는 opacity전환 . 이것은 나가는 페이드 아웃 전환에 영향을 미칩니다. 모달을 기본 상태로 되돌립니다.

#modal-overlay {
    background: #999;
    background: rgba(33,33,33,.2);
    display: block;
    overflow: hidden;
    height: 0;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    opacity: 0;
    z-index: 1;
    -webkit-transition: height 0s 500ms, opacity 300ms ease-in-out;
       -moz-transition: height 0s 500ms, opacity 300ms ease-in-out;
            -ms-transition: height 0s 500ms, opacity 300ms ease-in-out;
         -o-transition: height 0s 500ms, opacity 300ms ease-in-out;
        transition: height 0s 500ms, opacity 300ms ease-in-out;
}

둘째, 보이는 모달. 당신이 설정하는 말 .modal-active받는 사람을 body. 지금은 height이다 100%, 내 전환도 변경되었습니다. 내가 원하는 height즉시 변경해야하고,이 opacity걸릴 300ms.

.modal-active #modal-overlay {
    height: 100%;
    opacity: 1;
    z-index: 90000;
    -webkit-transition: height 0s, opacity 300ms ease-in-out;
       -moz-transition: height 0s, opacity 300ms ease-in-out;
        -ms-transition: height 0s, opacity 300ms ease-in-out;
         -o-transition: height 0s, opacity 300ms ease-in-out;
            transition: height 0s, opacity 300ms ease-in-out;
}

그것은 매력처럼 작동합니다.


공급 업체 접두사 속성을 정렬하는 스타일에 대한지지 👍
George Green

9

이 답변 중 일부와 다른 곳에서 제안한 것을 취하면 다음은 호버 메뉴에 효과적입니다 (  특히 Bootstrap 3 과 함께 사용 하고 있습니다).

nav .dropdown-menu {
    display: block;
    overflow: hidden;
    max-height: 0;
    opacity: 0;
    transition: max-height 500ms, opacity 300ms;
    -webkit-transition: max-height 500ms, opacity 300ms;
}
nav .dropdown:hover .dropdown-menu {
    max-height: 500px;
    opacity: 1;
    transition: max-height 0, opacity 300ms;
    -webkit-transition: max-height 0, opacity 300ms;
}

s로 허용되지 않으므로 두 값을 모두 지정하면 height대신 사용할 수 있습니다 . 호버 값은 메뉴의 값보다 커야 합니다.max-heightheight:autotransitionmax-heightheight


3
좋은 트릭이지만 단점이 있습니다. 전환 시간은 높이에 따라 다릅니다. 높이가 가변적 인 메뉴가 여러 개인 경우 높이가 최대 높이에 가까운 요소는 멋지게 애니메이션됩니다. 그러나 짧은 것이 너무 빨리 애니메이션되어 일관성이없는 경험을 제공합니다.
사용자

8

이 문제에 대한 더 좋은 방법을 찾았습니다. CSS 애니메이션을 사용하고 항목을 표시하는 데 멋진 효과를 줄 수 있습니다.

    .item {
     display: none;
}

.item:hover {
     display: block;
     animation: fade_in_show 0.5s
}

@keyframes fade_in_show {
     0% {
          opacity: 0;
          transform: scale(0)
     }
     100% {
          opacity: 1;
          transform: scale(1)
     }
}

이 유용한 팁에 감사드립니다.
Sedat Kumcu

6

나는이 문제를 여러 번 겪었고 이제는 단순히 다음과 같이 갔다.

.block {
  opacity: 1;
  transition: opacity 250ms ease;
}

.block--invisible {
  pointer-events: none;
  opacity: 0;
}

클래스를 추가하면 block--invisible전체 요소를 클릭 할 수 없지만 그 뒤에있는 모든 요소 pointer-events:none는 모든 주요 브라우저 (IE <11 없음)에서 지원하는 요소 때문입니다 .


이것을 예로 들어 주시겠습니까?
GarethAS

1
이것은 잘 작동하지만 포인터 이벤트는 11 미만의 IE에서는 작동하지 않습니다.
user1702965

11 이하 IE에 대한 메모를 추가
DominikAngerer

메뉴 (예 : 메뉴) 위에 모든 요소에 대해 언급해야하는 경우, 2019 년에 대한 지원이 pointer-events
Josh Davenport

5

변경 overflow:hiddenoverflow:visible. 더 잘 작동합니다. 나는 이렇게 사용한다 :

#menu ul li ul {
    background-color:#fe1c1c;
    width:85px;
    height:0px;
    opacity:0;
    box-shadow:1px 3px 10px #000000;
    border-radius:3px;
    z-index:1;
    -webkit-transition:all 0.5s ease;
    -moz-transition:all 0.6s ease;
}

#menu ul li:hover ul  {
    overflow:visible;
    opacity:1;
    height:140px;
}

visibleoverflow:hidden정확히처럼 행동 하기 때문에 더 좋습니다 display:none.


이것은 나를위한 표이었다. 감사!
Dan Loewenherz

5

JavaScript는 필요하지 않으며 엄청나게 큰 최대 높이가 필요하지 않습니다. 대신, 설정 max-height텍스트 요소와 같은 글꼴 상대 기기를 사용 rem하거나 em. 이렇게하면 메뉴가 닫힐 때 지연 또는 "팝핑"을 피하면서 컨테이너보다 최대 높이를 설정할 수 있습니다.

HTML

<nav>
  <input type="checkbox" />
  <ul>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
    <li>Link 1</li>
  </ul>
</nav>

CSS

nav input + ul li { // Notice I set max-height on li, not ul
   max-height: 0;
}

nav input:checked + ul li {
   max-height: 3rem; // A little bigger to allow for text-wrapping - but not outrageous
}

여기 예를 참조하십시오 : http://codepen.io/mindfullsilence/pen/DtzjE


이것과 유사하게 텍스트에 줄 높이를 설정하고 0으로 변환 할 수 있습니다. 안에 텍스트 만 있으면 컨테이너가 숨겨집니다.
vicmortelmans

왜 그렇게 적은 투표? 이것은 정말 좋은 답변이며 내가 사용하는 것일 수 있습니다.
mwilcox

@mwilcox 고정 된 높이를 사용하기 때문에 동적 내용 (예상 높이조차도)으로 작업 할 때 좋지 않습니다. 텍스트 내용에만 유용합니다.
Fabian von Ellerts

5

Guillermo의 답변이 작성된 후 2012-04-03의 CSS 전환 사양은 가시성 전환의 동작을 변경했으며 이제 전환 지연을 사용하지 않고 더 짧은 방법으로이 문제를 해결할 수 있습니다 .

.myclass > div {
                   transition:visibility 1s, opacity 1s;
                   visibility:hidden;  opacity:0
               }
.myclass:hover > div
               {   visibility:visible; opacity:1 }

두 전이에 대해 지정된 런타임은 일반적으로 동일해야합니다 (시정을 위해 약간 더 긴 시간은 문제가되지 않지만).

실행중인 버전은 내 블로그 게시물 CSS 전환 표시를 참조하십시오 .

"디스플레이의 화면 전환 : 속성" 이라는 질문의 제목 과 Rui Marques 및 josh의 답변에 대한 대답 :

이 솔루션은 디스플레이 또는 가시성 속성을 사용 하는 경우 (이 질문의 경우와 같이) 관련이없는 경우에 작동합니다 .

로 요소를 완전히 제거하지 않고 display:none보이지 않게 만들지 만 여전히 문서 플로우에 남아 있으며 다음 요소의 위치에 영향을줍니다.

display:none높이 와 비슷한 요소를 완전히 제거하는 전환은 높이 (다른 답변과 설명으로 표시), 최대 높이 또는 여백 상단 / 하단을 사용하여 수행 할 수 있지만 높이를 전환하는 방법 : 0; 높이 : 자동; CSS를 사용합니까? 내 블로그 게시물 디스플레이 및 높이 속성에 CSS 전환에 대한 대안 .

GeorgeMillo의 의견에 대한 답변 : 두 속성과 두 전환 모두 필요합니다. 불투명도 속성은 페이드 인 및 페이드 아웃 애니메이션과 가시성 속성을 생성하여 요소가 마우스 이벤트에 여전히 반응하지 않도록합니다. 시각 효과의 불투명도와 페이드 아웃이 끝날 때까지 숨기기를 지연시키는 가시성에 전환이 필요합니다.


4

나는 마침내 (숨겨 졌을 때 공간을 차지하지 않음)을 결합 opacity하여 나를위한 해결책을 찾았습니다 position absolute.

.toggle {
  opacity: 0;
  position: absolute;
  transition: opacity 0.8s;
}

.parent:hover .toggle {
  opacity: 1;
  position: static;
}

4

CSS 전환을 시작한 사람은 디스플레이 속성 (블록 / 없음)을 동시에 수정하면 작동하지 않는다는 것을 빨리 알게됩니다. 아직 언급되지 않은 한 가지 해결 방법 display:block/none은 요소를 숨기거나 표시하는 데 계속 사용할 수 있지만 불투명도를 0으로 설정하여 display:block의 경우에도 여전히 보이지 않습니다.

그런 다음 페이드 인하려면 불투명도를 1로 설정하고 불투명도의 전환을 정의하는 "on"과 같은 다른 CSS 클래스를 추가하십시오. 상상할 수 있듯이, "on"클래스를 요소에 추가하려면 JavaScript를 사용해야하지만 최소한 실제 전환에는 여전히 CSS를 사용하고 있습니다.

추신 : 두 가지를 동시에 수행 display:block하고 "on"클래스를 추가 해야하는 상황에 처한 경우 setTimeout을 사용하여 후자를 연기하십시오. 그렇지 않으면 브라우저는 두 가지 상황을 한 번에 발생하는 것으로보고 전환을 비활성화합니다.


감사합니다! 실제로 작동하는 예제로 다른 답변을 썼습니다 display:none.
mojuba

4

다음과 같이 간단합니다 :)

@keyframes fadeout {
    0% { opacity: 1; height: auto; }
    90% { opacity: 0; height: auto; }
    100% { opacity: 0; height: 0;
}
animation: fadeout linear 0.5s 1 normal forwards !important;

그것을 사라지게하고 그것을 만드십시오 height 0;. 또한 최종 상태를 유지하도록 전달을 사용해야합니다.


클래스를 제거하면 즉시 재설정되므로 좋은 생각이 아닙니다.
Sean T

2

이 솔루션은 뛰어난 호환성을 가지고 있으며 아직 보지 못했습니다.

.hidden-element {
  position: absolute;
  z-index: -1;
  pointer-events: none;
  visibility: hidden;
  opacity: 0;
  transition: visibility 0s, opacity .5s ease-out;
}

.hidden-element.visible {
  position: static;
  z-index: auto;
  pointer-events: auto;
  visibility: visible;
  opacity: 1;
}

설명 : 그것이 사용 visibility: hidden(한 단계에서 "쇼 -와 - 애니메이션"와 호환) 트릭을하지만 조합을 사용 position: absolute; z-index: -1; pointer-events: none;하십시오 숨겨진 컨테이너가 있는지 확인하는 공간을 차지하지 않습니다사용자 상호 작용에 응답하지 않습니다 .


1
그러나 position여전히 변화로 인해 요소가 멍청해질 것입니다.
Arsylum

물론, 물론 : position: absolute설명에 설명 된대로 요소가 공간을 차지하지 않음을 의미합니다. 스위치로 position: static바뀌면이 요소가 일반 요소처럼 공간을 차지하게됩니다. 나는 당신이 그것을 시도하는 것이 좋습니다!
Christophe Marois

2
나는했다. 그러나 내가 올바르게 이해한다면 문제는 전환 에 관한 것이 었습니다 . "부드러운 애니메이션"에서와 같이.
Arsylum 2019

2

디스플레이를 사용하여 자연스럽게 예상대로 작동하도록 할 수 있지만 Javascript를 사용하거나 다른 태그가 다른 태그를 사용하여 멋진 트릭을 제안한 것처럼 브라우저를 작동시켜 브라우저가 작동하도록해야합니다. CSS와 크기가 더 복잡해 지므로 내부 태그는 신경 쓰지 않으므로 Javascript 솔루션은 다음과 같습니다.

https://jsfiddle.net/b9chris/hweyecu4/17/

다음과 같은 상자로 시작하십시오.

<div id="box" class="hidden">Lorem</div>

숨겨진 상자.

div.hidden {
    display: none;
}
#box {
    transition: opacity 1s;
}

관련 q / a에서 찾은 트릭을 사용하여 브라우저를 즉시 조절하기 위해 offsetHeight를 확인합니다.

https://stackoverflow.com/a/16575811/176877

먼저 위의 트릭을 공식화하는 라이브러리 :

$.fn.noTrnsn = function () {
    return this.each(function (i, tag) {
        tag.style.transition = 'none';
    });
};
$.fn.resumeTrnsn = function () {
    return this.each(function (i, tag) {
        tag.offsetHeight;    
        tag.style.transition = null;
    });
};

다음으로 상자를 표시하고 페이드 인하는 데 사용할 것입니다.

$('#button').on('click', function() {
    var tag = $('#box');
    if (tag.hasClass('hidden'))
        tag.noTrnsn().removeClass('hidden')
        .css({ opacity: 0 })
        .resumeTrnsn().css({ opacity: 1 });
    else
        tag.css({ opacity: 0 });
});

상자가 안팎으로 희미 해집니다. 그래서, .noTrnsn()전환 오프 회전은, 우리는 제거 hidden뒤집 클래스 display에서 none, 기본에를 block. 그런 다음 불투명도를 0으로 설정하여 페이드 인을 준비합니다. 이제 스테이지를 설정 했으므로 다음과 같이 전환을 다시 설정합니다..resumeTrnsn() . 마지막으로 불투명도를 1로 설정하여 전환을 시작하십시오.

라이브러리가 없으면 표시 변경과 불투명도 변경으로 인해 바람직하지 않은 결과가 나타납니다. 라이브러리 호출을 단순히 제거하면 전환이 전혀 발생하지 않습니다.

위의 내용은 페이드 아웃 애니메이션이 끝날 때 디스플레이를 다시 없음으로 설정하지 않습니다. 그래도 더 좋아질 수 있습니다. 페이드 인하 고 0에서 높이가 커지는 것으로 그렇게합시다.

공상!

https://jsfiddle.net/b9chris/hweyecu4/22/

#box {
    transition: height 1s, opacity 1s;
}

이제 높이와 불투명도를 모두 전환하고 있습니다. 우리는 높이를 설정하지 않습니다 auto. 이는 기본값 인을 의미합니다 . 일반적으로 이것은 전환 될 수 없습니다. 자동에서 0과 같은 픽셀 값으로 이동하면 전환이 발생하지 않습니다. 우리는 라이브러리를 사용하여 그 문제를 해결하고 또 하나의 라이브러리 방법을 사용할 것입니다.

$.fn.wait = function (time, fn) {
    if (time)
        this.delay(time);
    if (!fn)
        return this;

    var _this = this;
    return this.queue(function (n) {
        fn.call(_this);
        n();
    });
};

이는 jQuery 3.x에서 제외 된 애니메이션 프레임 워크 없이도 jQuery의 기존 fx / animation 대기열에 참여할 수있는 편리한 방법입니다. 내가 jQuery를 작동 방법을 설명하지 않을거야,하지만 충분할 말,받는 사람 .queue().stop() jQuery를 우리가 서로 스테핑에서 우리의 애니메이션을 방지하는 데 도움을 제공 배관 것이다.

슬라이드 다운 효과에 애니메이션을 적용합시다.

$('#button').on('click', function() {
    var tag = $('#box');
    if (tag.hasClass('hidden')) {
        // Open it
        // Measure it
        tag.stop().noTrnsn().removeClass('hidden').css({
            opacity: 0, height: 'auto'
        });
        var h = tag.height();
        tag.css({ height: 0 }).resumeTrnsn()
        // Animate it
        .css({ opacity: 1, height: h })
        .wait(1000, function() {
            tag.css({ height: 'auto' });
        });
    } else {
        // Close it
        // Measure it
        var h = tag.noTrnsn().height();
        tag.stop().css({ height: h })
        .resumeTrnsn()
        // Animate it
        .css({ opacity: 0, height: 0 })
        .wait(1000, function() {
            tag.addClass('hidden');
        });
    }
});

이 코드는 #box클래스를 확인하여 확인하고 현재 숨겨져 있는지 여부로 시작 합니다. 그러나 슬라이드 아웃 / 페이드 애니메이션의 끝에 클래스를 wait()추가 하여 라이브러리 호출을 사용하여 더 많은 것을 달성 hidden합니다. 실제로 숨겨진 지 알 수 있습니다. 위의 간단한 예제로는 할 수 없었습니다. 이것은 숨겨진 요소가 결코 복원되지 않았기 때문에 이전 예제의 버그 인 요소를 반복하여 표시 / 숨기기를 가능하게합니다.

또한 호출하기 전에 사용자에게 표시하지 않고 .noTrnsn()최종 높이를 측정하는 것과 같은 측정 수행을 포함하여 일반적으로 애니메이션의 스테이지를 설정하기 위해 CSS 및 클래스 변경이 호출되는 것을 볼 수 있습니다.#box.resumeTrnsn() , 그 완벽한 세트에서 애니메이션 목표 CSS 값으로 단계.

기존 답변

https://jsfiddle.net/b9chris/hweyecu4/1/

다음을 클릭하여 전환 할 수 있습니다.

function toggleTransition() {
  var el = $("div.box1");

  if (el.length) {
    el[0].className = "box";
    el.stop().css({maxWidth: 10000}).animate({maxWidth: 10001}, 2000, function() {
        el[0].className = "box hidden";
    });
  } else {
    el = $("div.box");
    el[0].className = "box";
    el.stop().css({maxWidth: 10001}).animate({maxWidth: 10000}, 50, function() {
        el[0].className = "box box1";
    });
  }

  return el;
}

someTag.click(toggleTransition);

CSS는 당신이 추측 할 것입니다 :

.hidden {
    display: none;
}
.box {
    width: 100px;
    height: 100px;
    background-color: blue;
    color: yellow;
    font-size: 18px;
    left: 20px;
    top: 20px;
    position: absolute;
    -webkit-transform-origin: 0 50%;
    transform-origin: 0 50%;
    -webkit-transform: scale(.2);
    transform: scale(.2);
    -webkit-transition: transform 2s;
    transition: transform 2s;
}
.box1{
    -webkit-transform: scale(1);
    transform: scale(1);
}

핵심은 디스플레이 속성을 조절하는 것입니다. 숨겨진 클래스를 제거한 다음 50ms를 기다린 다음 추가 된 클래스를 통해 전환 시작하면 애니메이션없이 화면에 표시되는 대신 표시되고 원하는대로 확장됩니다. 숨겨진 방식으로 적용하기 전에 애니메이션이 끝날 때까지 기다리는 것을 제외하고는 다른 방식으로 진행됩니다.

참고 : 경쟁 조건 .animate(maxWidth)을 피하기 위해 여기에서 학대하고 있습니다 setTimeout. setTimeout본인이나 다른 사람이 알지 못하는 코드를 선택하면 숨겨진 버그를 신속하게 도입 할 수 있습니다. .animate()로 쉽게 죽일 수 있습니다 .stop(). 나는 그것을 사용하여 표준 FX 대기열에 50ms 또는 2000ms 지연을두기 위해이를 사용하여 다른 코더가 쉽게 찾을 수 있습니다.


1

비슷한 답을 얻지 못했습니다. 나중에 몇 번의 Google 검색으로 나를 이끌었습니다. 내가 원했던 간단한 대답을 찾지 못했을 때, 나는 우아하고 효과적인 해결책을 발견했습니다.

그것은 밝혀 visibilityCSS 속성 값이 collapse일반적으로 테이블 항목에 사용됩니다. 그러나 다른 요소에 사용되는 경우 요소를 공간을 차지하지 않는 요소가 추가 된 기능과 거의 동일 하지만 숨겨진 요소로 효과적으로 렌더링하여 display: hidden문제의 요소에 애니메이션을 적용 할 수 있습니다.

아래는 이에 대한 간단한 예입니다.

function toggleVisibility() {
  let exampleElement = document.querySelector('span');
  if (exampleElement.classList.contains('visible')) {
    return;
  }
  exampleElement.innerHTML = 'I will not take up space!';
  exampleElement.classList.toggle('hidden');
  exampleElement.classList.toggle('visible');
  setTimeout(() => {
    exampleElement.classList.toggle('visible');
    exampleElement.classList.toggle('hidden');
  }, 3000);
}
#main {
  display: flex;
  flex-direction: column;
  width: 300px;
  text-align: center;
}

.hidden {
  visibility: collapse;
  opacity: 0;
  transition: visibility 2s, opacity 2s linear;
}

.visible {
  visibility: visible;
  opacity: 1;
  transition: visibility 0.5s, opacity 0.5s linear;
}
<div id="main">
  <button onclick="toggleVisibility()">Click Me!</button>
  <span class="hidden"></span>
  <span>I will get pushed back up...</span>
</div>


1

이 문제에 대한 가장 보편적 인 해결책은 display:noneCSS에서 자유롭게 지정할 수 있지만 blockJavaScript를 사용하여 (또는 다른 것)으로 변경 한 다음 실제로 문제가되는 요소에 클래스를 추가해야한다는 것입니다 setTimeout ()으로 전환 합니다. 그게 다야.

즉 :

<style>
    #el {
        display: none;
        opacity: 0;
    }
    #el.auto-fade-in {
        opacity: 1;
        transition: all 1s ease-out; /* Future, future, please come sooner! */
        -webkit-transition: all 1s ease-out;
        -moz-transition: all 1s ease-out;
        -o-transition: all 1s ease-out;
    }
</style>

<div id=el>Well, well, well</div>

<script>
    var el = document.getElementById('el');
    el.style.display = 'block';
    setTimeout(function () { el.className = 'auto-fade-in' }, 0);
</script>

이것은 최신 제정신 브라우저에서 테스트되었습니다. 분명히 Internet Explorer 9 이전 버전에서는 작동하지 않아야합니다.


1

SalmanPK가 가장 가까운 답변이라고 생각합니다. 다음 CSS 애니메이션으로 항목을 페이드 인 또는 페이드 아웃합니다. 그러나 표시 속성은 불투명하게 만 부드럽게 애니메이션되지 않습니다.

@-webkit-keyframes fadeIn {
    from { opacity: 0; }
      to { opacity: 1; }
}

@-webkit-keyframes fadeOut {
    from { opacity: 1; }
      to { opacity: 0; }
}

표시 블록에서 움직이는 요소를 표시하여 아무것도 표시하지 않으려면 현재 CSS에서만 가능하다는 것을 알 수 없습니다. 높이를 가져와 CSS 애니메이션을 사용하여 높이를 줄여야합니다. 아래 예제와 같이 CSS를 사용하면 가능하지만 요소에 애니메이션을 적용하는 데 필요한 정확한 높이 값을 아는 것은 까다로울 수 있습니다.

jsFiddle 예제

CSS

@-webkit-keyframes pushDown {
  0% {
    height: 10em;
  }
  25% {
    height: 7.5em;
  }
  50% {
    height: 5em;
  }
  75% {
    height: 2.5em;
  }
  100% {
    height: 0em;
  }
}

.push-down {
    -webkit-animation: pushDown 2s forwards linear;
}

자바 스크립트

var element = document.getElementById("element");

// Push item down
element.className = element.className + " push-down";

1

전환 이벤트를 사용하여이 작업을 수행 할 수 있으므로 전환에 대한 두 개의 CSS 클래스를 작성합니다. 하나는 애니메이션을 보유하고 하나는 표시 없음 상태를 유지합니다. 그리고 당신은 애니메이션이 끝난 후에 전환합니까? 필자의 경우 버튼을 누르면 div를 다시 표시하고 두 클래스를 모두 제거 할 수 있습니다.

아래의 스 니펫을 사용해보십시오 ...

$(document).ready(function() {
  // Assign transition event
  $("table").on("animationend webkitAnimationEnd", ".visibility_switch_off", function(event) {
    // We check if this is the same animation we want
    if (event.originalEvent.animationName == "col_hide_anim") {
      // After the animation we assign this new class that basically hides the elements.
      $(this).addClass("animation-helper-display-none");
    }

  });

  $("button").click(function(event) {

    $("table tr .hide-col").toggleClass(function() {
      // We switch the animation class in a toggle fashion...
      // and we know in that after the animation end, there
      // is will the animation-helper-display-none extra
      // class, that we nee to remove, when we want to
      // show the elements again, depending on the toggle
      // state, so we create a relation between them.
      if ($(this).is(".animation-helper-display-none")) {
        // I'm toggling and there is already the above class, then
        // what we want it to show the elements , so we remove
        // both classes...
        return "visibility_switch_off animation-helper-display-none";
      }
      else {
        // Here we just want to hide the elements, so we just
        // add the animation class, the other will be added
        // later be the animationend event...
        return "visibility_switch_off";
      }
    });
  });
});
table th {
  background-color: grey;
}

table td {
  background-color: white;
  padding: 5px;
}

.animation-helper-display-none {
  display: none;
}

table tr .visibility_switch_off {
  animation-fill-mode: forwards;
  animation-name: col_hide_anim;
  animation-duration: 1s;
}

@-webkit-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-moz-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@-o-keyframes col_hide_anim {
  0% {opacity: 1;}
  100% {opacity: 0;}
}

@keyframes col_hide_anim {
  0%   {opacity: 1;}
  100% {opacity: 0;}
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<table>
  <theader>
    <tr>
      <th>Name</th>
      <th class='hide-col'>Age</th>
      <th>Country</th>
    </tr>
  </theader>
  <tbody>
    <tr>
      <td>Name</td>
      <td class='hide-col'>Age</td>
      <td>Country</td>
    </tr>
  </tbody>
</table>

<button>Switch - Hide Age column with fadeout animation and display none after</button>


0

jQuery를 사용하여 클래스를 설정하는 경우 100 % 작동합니다.

$(document).ready(function() {
  $('button').click(function() {
    var container = $('.container');
    
    if (!container.hasClass('active')) {
      container.addClass('show').outerWidth();
      container.addClass('active');
    }
    else {
      container.removeClass('active').one('transitionend', function() {
        container.removeClass('show');
      });
    }
  });
});
.container {
  display: none;
  opacity: 0;
  transition: opacity 0.3s ease;
}

.container.show {
  display: flex;
}
 
.container.active {
  opacity: 1;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button type="button">Toggle</button>

<div class="container">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</div>

물론 당신은 그냥 jQuery를 사용할 수 .fadeIn().fadeOut()기능을 대신 클래스를 설정의 장점은 당신이 아닌 다른 디스플레이 값으로 전환하려는 경우입니다 block(같은과 기본값 .fadeIn().fadeOut()).

여기서 나는 flex멋진 페이드 효과 로 디스플레이 로 전환하고 있습니다 .


0

사용하는 대신 display'off-screen'요소를 필요할 때까지 저장 한 다음 원하는 위치로 설정하고 동시에 변환 할 수 있습니다. 이로 인해 다른 많은 디자인 문제가 발생하므로 마일리지가 다를 수 있습니다.

display스크린 리더가 콘텐츠에 액세스 할 수 있기를 원할 때 어쨌든 사용 하고 싶지 않을 것입니다. 대부분의 경우 가시성 규칙을 준수하려고합니다. 즉, 눈에 보이지 않아야하는 경우 상담원에게 콘텐츠로 표시되지 않습니다.


0

CSS 가시성 : 표시 대신 숨겨진 / 표시 가능 : none / block

div {
    visibility:hidden;
    -webkit-transition: opacity 1s ease-out;
    -moz-transition: opacity 1s ease-out;
    -o-transition: opacity 1s ease-out;
    transition: opacity 1s ease-out;
    opacity: 0;
}

parent:hover > div {
    opacity: 1;
    visibility: visible;
}

5
빈 공간을 남겨두고 공간을 확보합니다. 공간을 축소하려면 높이 또는 다른 속성에 애니메이션을 적용해야합니다.
Marcy Sutton

0

Toggle Display Animate 라는 오픈 소스 골격 프로젝트를 시작했습니다 .

이 스켈레톤 헬퍼를 사용하면 jQuery 표시 / 숨기기를 쉽게 모방 할 수 있지만 CSS 3 전환 애니메이션을 사용하거나 사용하지 않을 수 있습니다.

클래스 토글을 사용하므로 display : none | block | inline 등의 요소 외에 원하는 CSS 메소드를 사용할 수있을뿐만 아니라 다른 대체 용도도 사용할 수 있습니다.

주요 디자인 목적은 요소 토글 상태를위한 것이며, 개체를 숨기면 키 프레임을 반대로 실행하거나 요소를 숨기기 위해 대체 애니메이션을 재생할 수있는 되돌리기 상태를 지원합니다.

내가 작업하고있는 개념에 대한 대부분의 마크 업은 CSS이며 실제로 사용되는 JavaScript는 거의 없습니다.

여기 데모가 있습니다 : http://marcnewton.co.uk/projects/toggle-display-animate/

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