애니메이션 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.