Animasyon CSS3: görüntü + opaklık


106

CSS3 animasyonuyla ilgili bir sorunum var.

.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;
}

Bu kod yalnızca değişikliklerini kaldırırsam çalışır display.

Fareyle üzerine geldikten hemen sonra ekranı değiştirmek istiyorum, ancak opaklık geçiş kullanılarak değiştirilmelidir.


2
CSS, diğerlerinin önerdiği şekilde çalışmazsa, burada solma için çok basit bir Javascript kodu var.
Abhranil Das

Yanıtlar:


122

Michaels cevabına göre bu kullanılacak gerçek CSS kodudur

.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
tüm tarayıcıları desteklemek için ..?
david_adler

CSS3 tüm tarayıcılarda desteklenmemektedir. Uzatmak istiyorsanız doğru önekleri ekleyin
Chris

17
Fareyle dışarı çıkarken, fadeOutToNone nasıl uygulanır?
Green

4
Yüzde kesirlerini kullanabileceğiniz için,% 1 yerine% 0,001 gibi bir şey kullanmak daha iyi bir uygulamadır çünkü daha uzun animasyon süreleriyle ortaya çıkabilecek "başlatma" gecikmesini en aza indirir
Zach Saucier

1
-O-keyframes yönergesi aslında işe yaramaz çünkü animasyonları destekleyen ilk Opera sürümü zaten webkit'e dayanıyordu.
Rico Ocepek

45

Mümkünse - visibilityyerine kullanındisplay

Örneğin:

.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
Görünürlük özelliğiyle ilgili sorun, bunun öğeyi gizlememesi, yalnızca görünmez hale getirmesidir. Yani yine de yer kaplayacak.
Samuel

6
Yalnızca görünmez değil, aynı zamanda olaylara (tıklamalar vb.) Karşı da şeffaftır. Ekranın değiştirilmemesi, belgenin yeniden düzenlenmemesi anlamına gelir, bu iyi bir şeydir. Opaklık yoluyla belirmesi / kaybolması gereken çoğu öğe, muhtemelen zaten sabit veya mutlak konuma sahip olmalıdır.
Rasmus Kaj

43

CSS animasyonları ile şunları yapabilirsiniz:

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

İyi fikir, fareyle üzerine gelme sırasında öğemi animasyon doldurma modu ile görüntülemeyi başardım, ancak sonra fareyi uzaklaştırdığımda öğe kaybolur.
Alexis Delrieu

2
doldurma modunu kullanabilirsiniz: animasyon bittikten sonra değişiklikleri devam ettirmek için ileriye doğru.
Michael Mullany

13

Bu geçici çözüm çalışır:

  1. bir "anahtar kare" tanımlayın:

    @-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. "Fareyle üzerine gelindiğinde" bu "animasyon karesini" kullanın:

    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

Bunu başarmak için kullandım. Gezinirken kaybolurlar ama gizlendiklerinde yer kaplamazlar, mükemmel!

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

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

6

Biraz değiştim ama sonuç çok güzel.

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

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

Herkese teşekkürler.


4
Bu, ekran okuyucularla iyi oynamıyor: İçeriği okumaya devam edecekler.
ehdv

1
visibility: hidden;Vurgulu .child / öğesine ekleyebilirsiniz visibility:visible;ve bu ekran okuyucu sorununu
çözmelidir

6

İşaretçi olaylarını kullanarak bunu yapmanın başka bir iyi yöntemi vardır:

.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;
}

Maalesef bu, IE10 ve altında desteklenmemektedir.


4

Ben de aynı sorunu yaşadım. @MichaelMullany ve @Chris tarafından önerildiği gibi geçişler yerine animasyonlar kullanmayı denedim, ancak "-moz" ve "-o" önekleriyle kopyalayıp yapıştırsam bile yalnızca webkit tarayıcıları için çalıştı.

Yerine kullanarak sorunu visibilityaşabildim display. Bu benim için işe yarıyor çünkü alt öğem öyle position: absolute, bu nedenle belge akışı etkilenmiyor. Başkaları için de işe yarayabilir.

Çözümüm kullanıldığında orijinal kod şöyle görünecektir:

.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;
}

Görüntü dışında canlandırılırken çocuğun içine geri dönerseniz, öğe yalnızca gizlendiğinden, tekrar yerine oturur. Farenizi yerin etrafında hareket ettiriyorsanız oldukça can sıkıcı.
adamj

4

JS ile değişikliği tetikliyorsanız, diyelim ki tıklama ile, güzel bir çözüm var.

Sorunun, animasyonun ekranda göz ardı edilmesinden kaynaklandığını görüyorsunuz: hiçbir öğe, ancak tarayıcı tüm değişiklikleri bir kerede uygulamaz ve öğe hiçbir zaman görüntülenmez: aynı anda canlandırılmamışken blok .

İşin püf noktası, tarayıcıdan çerçeveyi görünürlüğü değiştirdikten sonra ancak animasyonu tetiklemeden önce oluşturmasını istemektir.

İşte bir JQuery örneği:

    $('.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
Bu soru JavaScript veya jQuery ile etiketlenmemiş
j08691

Biliyorum, bunun nedenini açıklamak için yazdım. Bunu öğrendiğimde benim için çok faydalı oldu ve umarım başkalarına da yardımcı olur.
daniel.sedlacek

2
Btw, Opacity değerleri 0 ile 1 arasındadır
Amr

2

Mutlak veya sabit elemanlarda z-endeksini de kullanabilirsiniz:

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

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

Diğer öğelerin şimdi -100 ile 100 arasında bir z-endeksi olmalıdır.


Ne yazık ki bu type=passwordalanlardaki KeePass şifre göstergesi sembolünü mahvetti . Görünmez.
philk

1
Lütfen rastgele z-endeksi sayılarını kullanmayı bırakabilir miyiz? Burada: z-endeksi: 1; vs z-endeksi: -1 yeterli olacaktır. Büyük z-endeksi sayılarını seçmek, işleri yönetilemez hale getirir.
dudewad

2

Biliyorum, bu gerçekten sorunuz için bir çözüm değil, çünkü siz soruyorsunuz

görüntü + opaklık

Yaklaşımım daha genel bir soruyu çözüyor, ancak belki de bu, displayile birlikte kullanılarak çözülmesi gereken arka plan problemiydi opacity.

Arzum, Elementi görünmezken yoldan çekmekti. Bu çözüm tam olarak şunu yapar: Öğeyi uzağa taşır ve bu geçiş için kullanılabilir:

.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;
}

Bu kod, herhangi bir tarayıcı öneki veya geriye dönük uyumluluk korsanlığı içermez. Artık ihtiyaç duyulmadığından, öğenin nasıl uzaklaştığı kavramını gösteriyor.

İlginç olan kısım, iki farklı geçiş tanımıdır. Fare işaretçisi .parentöğenin üzerine geldiğinde , .childöğenin hemen yerine yerleştirilmesi gerekir ve ardından opaklık değişecektir:

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

Fareyle üzerine gelme olmadığında veya fare işaretçisi öğenin dışına taşındığında, öğe ekrandan taşınmadan önce opaklık değişikliğinin bitmesini beklemek gerekir:

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

Nesneyi uzaklaştırmak, ayarın display:nonedüzeni bozmayacağı bir durumda uygun bir alternatif olacaktır.

Umarım bu soruya cevap vermemiş olsam da kafama çivi çakarım.


Bu Microsoft filtresi IE9'dan beri kullanımdan kaldırıldı. 2016'daki cevaplara eklemek istediğiniz belirli bir neden var mı?
TylerH

@TylerH Birinin kaç kullanıcıya ulaşmak istediği bir zevk meselesidir.
Hannes Morgenstern

Kullanımdan kaldırıldığı ve IE <11'in artık Microsoft tarafından desteklenmediği göz önüne alındığında , bu özelliği kullanmak en iyi ihtimalle şüpheli bir tattır.
TylerH

@TylerH Daha yeni bir tarayıcıya yükseltmeyen veya yükseltemeyen istemcileri barındırmak yaygın bir durumdur. Müşteri olarak hala IE6 kullanan ve "nedenlerle" yükseltmeyi reddeden tanınmış bir bankam var.
Marcus Cunningham

@MarcusCunningham soru ile etiketlenir CSS3 tamamen IE6 (ve IE7 ve IE8) kullanımını engeller. Olası en erken tarayıcıda OP kod yazıyordu, bu yanıttaki MS filtresi kullanımdan kaldırıldı. Ve gelecekteki okuyucular için, desteklenmediği için daha da yararsızdır. Orada hiçbir bu soruya bir cevap onu da dahil olmak üzere argüman. Hannes cevabından çoktan çıkardığı için bu tartışmalı bir nokta.
TylerH

1

Yaptığım bir şey, başlangıç ​​durumunun marjını "margin-left: -9999px" gibi bir şeye ayarlamak, böylece ekranda görünmeyecek ve ardından "margin-left: 0" üzerine gelme durumunda sıfırlandı. Bu durumda "display: block" olarak kalsın. Benim için hile yaptım :)

Düzenle: Durum kaydedilsin ve önceki fareyle üzerine gelme durumuna geri dönülmesin mi? Tamam burada JS'ye ihtiyacımız var:

<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>

İyi fikir, ama sonra
fareyi çekerim

Alexis, yapmak istediğin bu değil mi? Hover, YALNIZCA farenizle gezindiğinizde anlamına gelir. Lütfen neyi başarmaya çalıştığınızı açıklayın.
Joshua

Evet üzgünüm. Solmayı farede bırakmak istiyorum.
Alexis Delrieu

Bu her şeyi değiştirir. Neredeyse. Temelde istediğiniz şey, diğer kullanıcıların da belirttiği gibi, üzerine gelme durumunu algılayacak ve şunu ekleyecek bir JS işlevidir ... iyi ... güncellenmiş cevabıma bakın.
Joshua

1

OnHoverIn / Out üzerinde her iki yönde animasyona sahip olmak için bu çözümü yaptım. Umarım birine yardımcı olur

@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 İLE OPASİTE NASIL ANİMASYON YAPILIR:
bu benim kodum:
CSS kodu

.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>

veya bu demo dosyasını kontrol edin

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


1
displayMülk basitçe kaldırıldığı için soruya cevap vermiyor .
Tost

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.