애니메이션 CSS3 : 디스플레이 + 불투명도


102

CSS3 애니메이션에 문제가 있습니다.

.child {
    opacity: 0;
    display: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    display: block;
}

이 코드는 변경 사항을 제거하는 경우에만 작동합니다 display.

호버 직후 디스플레이를 변경하고 싶지만 전환을 사용하여 불투명도를 변경해야합니다.


2
CSS가 다른 사람들이 제안한대로 작동하지 않는 경우 여기 에 페이딩을위한 매우 간단한 Javascript 코드가 있습니다.
Abhranil Das 2011

답변:


119

Michaels 답변을 기반으로 이것은 사용할 실제 CSS 코드입니다.

.parent:hover .child
{
    display: block;

    -webkit-animation: fadeInFromNone 0.5s ease-out;
    -moz-animation: fadeInFromNone 0.5s ease-out;
    -o-animation: fadeInFromNone 0.5s ease-out;
    animation: fadeInFromNone 0.5s ease-out;
}

@-webkit-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-moz-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@-o-keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

@keyframes fadeInFromNone {
    0% {
        display: none;
        opacity: 0;
    }

    1% {
        display: block;
        opacity: 0;
    }

    100% {
        display: block;
        opacity: 1;
    }
}

1
모든 브라우저를 지원합니다 ..?
david_adler 2013-10-25

CSS3는 모든 브라우저에서 지원되지 않습니다. 확장 할 경우 바로 올바른 접두사를 추가
크리스

17
마우스를 가져갈 때 fadeOutToNone을 구현하는 방법은 어떻습니까?
Green

4
퍼센트의 일부를 사용할 수 있으므로 "시작"지연을 최소화하기 때문에 1 %가 아닌 0.001 %와 같은 것을 사용하는 것이 더 좋습니다. 애니메이션 지속 시간이 길수록 분명해질 수 있습니다
Zach Saucier

1
-o-keyframes 지시문은 애니메이션을 지원하는 첫 번째 Opera 버전이 이미 웹킷을 기반으로했기 때문에 실제로 쓸모가 없습니다.
Rico Ocepek

43

CSS 애니메이션으로 할 수 있습니다.

0% display:none ; opacity: 0;
1% display: block ; opacity: 0;
100% display: block ; opacity: 1;

좋은 생각입니다. 애니메이션 채우기 모드로 호버링하는 동안 요소를 계속 표시했지만 마우스 아웃하면 요소가 사라집니다.
Alexis Delrieu 2011

2
fill-mode : forwards를 사용하여 애니메이션이 끝난 후에도 변경 사항을 유지할 수 있습니다.
Michael Mullany 2012

42

가능하면 visibility대신 사용하십시오.display

예를 들면 :

.child {
    visibility: hidden;
    opacity: 0;
    transition: opacity 0.3s, visibility 0.3s;
}

.parent:hover .child {
    visibility: visible;
    opacity: 1;
    transition: opacity 0.3s, visibility 0.3s;
}

24
가시성 속성의 문제는 이것이 요소를 숨기지 않고 보이지 않게 만든다는 것입니다. 따라서 여전히 공간을 차지합니다.
Samuel

6
보이지 않을뿐만 아니라 이벤트 (클릭 등)에도 투명합니다. 디스플레이를 변경하지 않는다는 것은 문서를 리플 로우하지 않는 것을 의미합니다. 이는 좋은 일입니다. 불투명도를 통해 페이드 인 / 아웃되어야하는 대부분의 요소는 어쨌든 고정 또는 절대 위치를 가져야합니다.
Rasmus Kaj

13

이 해결 방법은 다음과 같습니다.

  1. "키 프레임"정의 :

    @-webkit-keyframes fadeIn { 
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
    
    @keyframes fadeIn {
      0% { opacity: 0; }
      20% { opacity: 0; }
      40% { opacity: 0.3; }
      60% { opacity: 0.5; }
      80% { opacity: 0.9; }
      100% { opacity: 1; }
    }
    
  2. "호버"에이 "키 프레임"을 사용하십시오.

    div a span { 
      display: none;
    }
    
    div a:hover span {
      display: block;
    
      -webkit-animation-name: fadeIn;
      -webkit-animation-duration: 1s;
      animation-name: fadeIn;
      animation-duration: 1s;
    }
    

9

나는 그것을 달성하기 위해 이것을 사용했습니다. 호버링하면 사라지지만 숨겨지면 공간을 차지하지 않습니다. 완벽합니다!

.child {
    height: 0px;
    opacity: 0;
    visibility: hidden;
    transition: all .5s ease-in-out;
}

.parent:hover .child {
    height: auto;
    opacity: 1;
    visibility: visible;
}

6

조금 변했지만 결과는 아름답습니다.

.child {
    width: 0px;
    height: 0px;
    opacity: 0;
}

.parent:hover child {
    width: 150px;
    height: 300px;
    opacity: .9;
}

모두에게 감사합니다.


4
이것은 스크린 리더에서 잘 작동하지 않습니다. 그들은 콘텐츠를 계속 읽을 것입니다.
ehdv 2013

1
당신은 추가 할 수 visibility: hidden;/ .child하는 visibility:visible;호버과이 화면 판독기 문제 해결해야
csilk

6

포인터 이벤트를 사용하여이를 수행하는 또 다른 좋은 방법이 있습니다.

.child {
    opacity: 0;
    pointer-events: none;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    opacity: 0.9;
    pointer-events: all;
}

안타깝게도 IE10 이하에서는 지원되지 않습니다.


4

나는 같은 문제가 있었다. @MichaelMullany와 @Chris가 제안한대로 전환 대신 애니메이션을 사용해 보았지만 "-moz"및 "-o"접두사를 복사하여 붙여 넣은 경우에도 웹킷 브라우저에서만 작동했습니다.

visibility대신을 사용하여 문제를 해결할 수있었습니다 display. 이것은 내 자식 요소가 position: absolute이므로 문서 흐름에 영향을 미치지 않기 때문에 저에게 효과적입니다 . 다른 사람들에게도 효과가있을 수 있습니다.

이것은 내 솔루션을 사용하는 원본 코드의 모습입니다.

.child {
    position: absolute;
    opacity: 0;
    visibility: hidden;

    -webkit-transition: opacity 0.5s ease-in-out;
    -moz-transition: opacity 0.5s ease-in-out;
    transition: opacity 0.5s ease-in-out;
}

.parent:hover .child {
    position: relative;
    opacity: 0.9;
    visibility: visible;
}

애니메이션이 보이지 않는 동안 자식으로 다시 마우스를 가져 가면 요소가 숨겨져 있기 때문에 다시 스냅됩니다. 그 장소에서 마우스를 움직이면 꽤 짜증납니다.
adamj

4

JS로 변경을 트리거하는 경우 클릭시 좋은 해결 방법이 있습니다.

display : none 요소에서 애니메이션이 무시되지만 브라우저가 모든 변경 사항을 한 번에 적용하고 요소가 동시에 애니메이션되지 않는 동안 display : block 이되지 않기 때문에 문제가 발생하는 것을 볼 수 있습니다 .

트릭은 가시성을 변경 한 후 애니메이션을 트리거하기 전에 브라우저에 프레임을 렌더링하도록 요청하는 것입니다.

다음은 JQuery 예제입니다.

    $('.child').css({"display":"block"});
    //now ask the browser what is the value of the display property
    $('.child').css("display"); //this will trigger the browser to apply the change. this costs one frame render
    //now a change to opacity will trigger the animation
    $('.child').css("opacity":100);

2
이 질문은 자바 스크립트 나 jQuery를 태그하지 않습니다
j08691

나는 이것이 일어나는 이유를 설명하기 위해 그것을 썼습니다. 제가 이것에 대해 알게되었을 때 매우 유용했고 다른 사람들에게도 도움이되기를 바랍니다.
daniel.sedlacek

1
Btw, 불투명도 값은 0과 1 사이입니다
Amr

2

절대 또는 고정 요소에서 Z- 색인을 사용할 수도 있습니다.

.item {
    position: absolute;
    z-index: -100;
}

.item:hover {
    z-index: 100;
}

이제 다른 요소의 Z- 색인은 -100에서 100 사이 여야합니다.


불행히도 type=password필드 에 KeePass 암호 표시기 기호를 망쳐 놓았습니다 . 보이지 않습니다.
philk

1
임의의 Z- 색인 번호 사용을 중지 할 수 있습니까? 여기 : z-index : 1; vs z-index : -1은 괜찮습니다. 거대한 Z- 색인 번호를 선택하면 관리가 어려워집니다.
dudewad 2015 년

2

나는 이것이 당신의 질문에 대한 해결책이 아니라는 것을 알고 있습니다.

디스플레이 + 불투명도

내 접근 방식은 더 일반적인 질문을 해결하지만 아마도 이것은와 display함께 사용하여 해결해야 할 배경 문제였습니다 opacity.

내 소망은 요소가 보이지 않을 때 방해가되지 않도록하는 것이 었습니다. 이 솔루션은 정확히 다음을 수행합니다. 요소를 멀리 이동 하고 전환에 사용할 수 있습니다.

.child {
  left: -2000px;
  opacity: 0;
  visibility: hidden;
  transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;
}

.parent:hover .child {
  left: 0;
  opacity: 1;
  visibility: visible;
  transition: left 0s, visibility 0s, opacity 0.8s;
}

이 코드에는 브라우저 접두사 또는 이전 버전과의 호환성 해킹이 포함되어 있지 않습니다. 더 이상 필요하지 않기 때문에 요소가 어떻게 이동하는지 개념을 보여줍니다.

흥미로운 부분은 두 가지 전환 정의입니다. 마우스 포인터가 .parent요소를 가리키면 요소를 .child즉시 제자리에 배치해야하며 불투명도가 변경됩니다.

transition: left 0s, visibility 0s, opacity 0.8s;

호버가 없거나 마우스 포인터가 요소 밖으로 이동 한 경우 요소를 화면 밖으로 이동하려면 불투명도 변경이 완료 될 때까지 기다려야합니다.

transition: left 0s 0.8s, visibility 0s 0.8s, opacity 0.8s;

설정으로 display:none인해 레이아웃이 깨지지 않는 경우 개체를 멀리 이동하는 것이 실행 가능한 대안이 될 것입니다.

나는 대답하지 않았지만이 질문에 대해 머리에 못을 박 았으면 좋겠다.


해당 Microsoft 필터는 IE9 이후로 사용되지 않습니다. 2016 년에 답변에 추가하고 싶은 특별한 이유가 있습니까?
TylerH

@TylerH 얼마나 많은 사용자가 도달하고자 하는가는 취향의 문제입니다.
Hannes Morgenstern

더 이상 사용되지 않고 IE <11이 Microsoft에서 더 이상 지원되지 않는다는 점을 고려하면 해당 속성을 사용하는 것은 기껏해야 의심스러운 취향입니다.
TylerH

@TylerH 최신 브라우저로 업그레이드하지 않거나 업그레이드 할 수없는 클라이언트를 수용해야하는 것이 일반적입니다. 나는 여전히 IE6를 사용하고 "이유"를 위해 업그레이드를 거부하는 클라이언트로 잘 알려진 은행을 가지고 있습니다.
Marcus Cunningham

@MarcusCunningham 질문 에는 IE6 (및 IE7 및 IE8)의 사용을 완전히 배제하는 css3 태그가 지정되어 있습니다. 가능한 초기 브라우저 OP에서 코드를 작성했을 수 있었지만이 답변의 MS 필터는 더 이상 사용되지 않았습니다. 그리고 미래의 독자들에게는 지원조차되지 않기 때문에 훨씬 더 쓸모가 없습니다. 없습니다 에는 이 질문에 대한 대답을 포함한 인수. 그러나 Hannes가 이미 답변에서 제거했기 때문에 논쟁의 여지가 있습니다.
TylerH

1

내가 한 한 가지는 초기 상태의 여백을 "margin-left : -9999px"와 같이 설정하여 화면에 나타나지 않도록 한 다음 호버 상태에서 "margin-left : 0"을 재설정했습니다. 이 경우 "display : block"으로 유지하십시오. 나를 위해 트릭을 했습니까 :)

편집 : 상태를 저장하고 이전 호버 상태로 되 돌리지 않습니까? 좋아 여기에 JS가 필요합니다.

<style>
.hovered { 
    /* hover styles here */
}
</style>

<script type="text/javascript">
$('.link').hover(function() {
   var $link = $(this);
   if (!$link.hasclass('hovered')) { // check to see if the class was already given
        $(this).addClass('hovered');
   } 
});
</script>

좋은 생각,하지만 그때 내가 마우스를 이동하면, 요소는 ... 사라
알렉시스 Delrieu에게

알렉시스, 그게 당신이 원하는 거 아니에요? 호버는 마우스로 호버링 할 때만 의미합니다. 달성하려는 작업을 명확히하십시오.
Joshua

맞아 미안해. 마우스 아웃에서 페이드를 저장하고 싶습니다.
Alexis Delrieu 2011

그것은 모든 것을 바꿉니다. 거의. 기본적으로 원하는 것은 다른 사용자가 지적했듯이 호버 상태를 감지하고 추가하는 JS 기능입니다 ... 음 ... 업데이트 된 답변을 참조하십시오.
Joshua

1

onHoverIn / Out 양방향에 애니메이션을 적용하기 위해이 솔루션을 사용했습니다. 누군가에게 도움이되기를 바랍니다.

@keyframes fadeOutFromBlock {
  0% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }

  90% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }
}

@keyframes fadeInFromNone {
  0% {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
  }

  1% {
    position: relative;
    opacity: 0;
    transform: translateX(0);
  }

  100% {
    position: relative;
    opacity: 1;
    transform: translateX(0);
  }
}

.drafts-content {
  position: relative;
  opacity: 1;
  transform: translateX(0);
  animation: fadeInFromNone 1s ease-in;
  will-change: opacity, transform;

  &.hide-drafts {
    position: absolute;
    opacity: 0;
    transform: translateX(-999px);
    animation: fadeOutFromBlock 0.5s ease-out;
    will-change: opacity, transform;
  }
}

0

CSS로 투명성을 애니메이션하는 방법 :
이것은 내 코드입니다 :
CSS 코드

.item {   
    height:200px;
    width:200px;
    background:red;
    opacity:0;
    transition: opacity 1s ease-in-out;
}

.item:hover {
    opacity: 1;
}
code {
    background: linear-gradient(to right,#fce4ed,#ffe8cc);
}
<div class="item">

</div>
<p><code> move mouse over top of this text</code></p>

또는이 데모 파일을 확인하십시오.

function vote () {
var vote = getElementById ( "yourOpinion")
if (this.workWithYou) :
vote + = 1};
ㅋㅋ


1
display속성이 단순히 제거 되었으므로 질문에 대답하지 않습니다 .
토스트

-4

display:전환 할 수 없습니다. 원하는 작업을 수행하려면 jQuery를 사용해야 할 것입니다.


3
당신은 어디에서나 jQuery를 옹호하는 것을 그만둬야한다.
Benjamin Gruenbaum

1
@BenjaminGruenbaum jQuery는 놀라운 사람입니다. 훌륭하고 모든 일을합니다.
Madara 's Ghost
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.