CSS display özelliğindeki geçişler


1446

Şu anda bir CSS 'mega açılır' menüsü tasarlıyorum - temelde düzenli bir CSS sadece açılır menü, ancak farklı içerik türleri içeren bir menü.

Şu anda, CSS 3 geçişlerinin 'display' özelliği için geçerli olmadığı anlaşılıyor , yani display: noneile display: block(veya herhangi bir kombinasyon) arasında herhangi bir geçiş yapamazsınız .

Yukarıdaki örnekten ikinci katman menüsünün, bir kullanıcı en üst düzey menü öğelerinden birinin üzerine geldiğinde 'kaybolması' için bir yol var mı?

visibility:Mülk üzerindeki geçişleri kullanabileceğinizin farkındayım , ancak bunu etkili bir şekilde kullanmanın bir yolunu düşünemiyorum.

Ayrıca yüksekliği kullanmayı denedim, ama bu sefil bir şekilde başarısız oldu.

Ayrıca JavaScript kullanarak bunu başarmanın önemsiz olduğunu biliyorum, ama sadece CSS kullanmak için kendime meydan okumak istedim ve sanırım biraz kısa geliyorum.


CSS geçişi, görüntüleme yerine opacity özelliğine uygularsanız çalışır mı?
Paul D.Waite

13
pozisyon: mutlak; görünürlük: gizli; display ile aynıdır: none;
Jawad

8
@Jawad: Sadece sizin gibi bir şey eklerseniz z-index:0.
DanMan

7
@Jawad: Ekran okuyucuların okumasını istemediğinizvisibility: hidden sürece asla kullanmamanız önerilir (ancak tipik tarayıcılar bunu yapmaz). Sadece öğenin görünürlüğünü tanımlar (söz söylemek gibi ) ve hala seçilebilir, tıklanabilir ve ne olursa olsun; sadece görünür değil. opacity: 0
Orman Katsch

1
pointer-eventsIE 8,9,10 için destek yok , bu yüzden her zaman iyi değil
Steven Pribilinskiy

Yanıtlar:


1351

İki veya daha fazla geçişi birleştirebilirsiniz ve visibilitybu sefer kullanışlı olan şey budur.

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>

(Satıcıya ait transitionmülk öneklerini unutmayın .)

Daha fazla ayrıntı bu makalede .


10
Bu cevap diğerlerinden daha az iş gibi görünüyor ve ekrandan beklediğimiz şeyi elde ediyor: none / block; Teşekkürler. Beni bir ton kurtardı.
Brendan

21
Evet buradaki sorun, görünür olmasa bile arkasındaki örtüşecek bir şey. Yükseklik kullanarak buldum: 0 çok daha iyi bir çözüm
Josh Bedo

739
Bu güzel ama sorun "görünmez gizli" öğeleri hala "işgal hiçbiri" değil, yer işgal olmasıdır.
Rui Marques

41
Muhtemelen bir şey özlüyorum, ama neden hem görünürlüğü hem de opaklığı değiştiriyorsunuz? Opaklığı öğeyi gizlemek için 0 ayarlamaz - neden görünürlüğü gizli olarak ayarlamanız gerekir?
GMA

21
@GeorgeMillo Yalnızca opaklığı ayarlarsanız, öğe aslında hala sayfa oluşturma üzerindedir (örneğin düşünceyi tıklayamazsınız).
adriendenat

800

Bunun çalışması için öğeyi başka yollarla gizlemeniz gerekir.

Etkiyi her ikisini de <div>kesinlikle konumlandırarak ve gizli olanı ayarlayarak başardım opacity: 0.

Hatta geçiş durumunda displaydan mülk noneiçin block, diğer elemanların üzerinde geçiş gerçekleşmez.

Bu sorunu çözmek için, her zaman öğenin olmasına izin verin display: block, ancak aşağıdaki yöntemlerden herhangi birini ayarlayarak öğeyi gizleyin:

  1. Set heightiçin 0.
  2. Set opacityiçin 0.
  3. Öğeyi, sahip olduğu başka bir öğenin çerçevesinin dışına yerleştirin overflow: hidden.

Muhtemelen daha fazla çözüm var, ancak öğeyi olarak değiştirirseniz geçiş yapamazsınız display: none. Örneğin, böyle bir şey denemeyi deneyebilirsiniz:

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

Ama bu olacak değil çalışır. Deneyimlerime göre, bunu hiçbir şey yapmamak için buldum.

Bu nedenle, her zaman öğeyi tutmanız gerekir display: block- ancak böyle bir şey yaparak etrafta dolaşabilirsiniz:

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

29
Cevabınız için teşekkürler Jim. Display: özelliği hiç değişmezse, TÜM geçişlerinizin çalışmadığı konusunda kesinlikle haklısınız. Bu bir utanç - bunun ardındaki mantığın ne olduğunu merak ediyorum. Bir yan notta, orijinal soruya gönderdiğim bağlantıda, onunla nerede olduğumu görebilirsiniz. Sahip olduğum tek (küçük) sorun sayfa yüklendiğinde Chrome'da [5.0.375.125], öğeler sayfaya yüklendikçe menünün hızla kaybolduğunu görebilirsiniz. Firefox 4.0b2 ve Safari 5.0 kesinlikle iyi ... hata ya da kaçırdığım bir şey mi?
RichardTape

7
Bunun doğru olduğunu ve buna katkıda bulunacağını kabul ediyorum; gelecekteki yolcular için bir kafa. Chrome'da çalışan bir çözüm buldum, ancak iPhone 4'te başarısız olduğunu buldum: visibility:hidden; opacity:0; -webkit-transition: all .2s ease-in-out;Bu sadece doğru bir şekilde geçiş yapmakla kalmıyor, aynı zamanda hedef öğe asla görünmeyecek. KG seni, beni ve anneni başarısızlığa uğratacak.
SimplGy

1
Görünürlük özelliğini de değiştirebilirsiniz .. sadece söyleyerek
Cu7l4ss

2
Gizli durumunuzu olarak ayarlarsanız height: 0;ve geçiş yapmazsanız, geçiş çalışmaz. Ben sadece opaklığı geçmeye çalışırken denedim. Ben kaldırmak zorundaheight: 0;
chovy

10
overflow: hiddenÇok teşekkürler sayesinde oy verdin!
thiagoh

277

Bu gönderi sırasında, displayözelliği değiştirmeye çalışırsanız tüm büyük tarayıcılar CSS geçişlerini devre dışı bırakır , ancak CSS animasyonları hala iyi çalışır, böylece bunları geçici bir çözüm olarak kullanabiliriz.

Örnek Kod (bunu menünüze uygun şekilde uygulayabilirsiniz) Demo :

Stil sayfanıza aşağıdaki CSS'yi ekleyin:

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

Ardından fadeInanimasyonu alt fareyle (ve elbette ayarlanmış display: block) çocuğa uygulayın :

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

Güncelleme 2019 - Solmayı da destekleyen yöntem:

(Bazı JavaScript kodları gereklidir)

// 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
Bunun için teşekkürler. height: 0(Geçişleri için) hile yüksekliği fade out geçiş 0 olarak ayarlanmış olur çünkü işin görünmüyor yukarıda belirtilen, ancak bu hile sadece iyi çalışması gibi görünüyor.
Elliot Winkler

41
Teşekkürler, çok faydalı. Ama bunu nasıl çözebilirim?
Illiou

1
Bu cevabın ilk paragrafı pek mantıklı değil. Tarayıcılar, displayözelliği kullandığınız anda tüm geçişleri tamamen devre dışı bırakmakla kalmaz, bunun için de hiçbir neden yoktur. Ve hatta eğer yaptılar , niçin animasyonlar sonra çalışacak? displayÖzelliği CSS animasyonlarında da kullanamazsınız .
BoltClock

7
En iyi cevap, geçişlerle mümkün değil, animasyonlarla evet.
Mikel

6
Ters animasyona ne dersiniz, eleman ne zaman yavaşça yok olmalıdır?
Yeşil

77

Ben değiştirilirse geçişlerin devre dışı bırakılma nedeninindisplay ekranın gerçekte ne yaptığından şüpheleniyorum . O mu değil makul sorunsuz animasyonlu olabilir herhangi bir değişiklik.

display: none;ve tamamen farklı visibility: hidden;iki şeydir. Her ikisinin de unsuru görünmez yapma etkisi vardır, ancak hala düzende işlenir, ancak görünürde öyle değildir . Gizli eleman hala yer kaplar ve hala satır içi veya blok veya satır içi satır veya tablo ya da öğenin oluşturmasını söylediği herhangi bir şey olarak oluşturulur ve buna göre alan kaplar. Diğer elemanlar bu alanı kaplamak için otomatik olarak hareket etmez . Gizli öğe gerçek piksellerini çıktıya dönüştürmez.
visibility: hidden;
display

display: nonediğer yandan aslında elemanın tamamen oluşturulmasını engeller . O kadar almaz herhangi düzen alanı. Bu elemanın kapladığı alanın bir kısmını veya tamamını işgal edecek diğer unsurlar, artık sanki eleman hiç yokmuş gibi, o alanı işgal edecek şekilde ayarlanır .

displaysadece başka bir görsel özellik değildir.
Bu elemanın tüm oluşturma modunu, kurar böyle olmadığı gibi öyle bir block, inline, inline-block, table, table-row, table-cell, list-item, ya da her neyse!
Bunların her biri çok farklı düzen sonuçları olmayan ve orada canlandırılır için makul bir yol olabilir ya düzgün (yumuşak bir geçiş hayal etmeye çalışın geçişini olacağını blockhiç inlineveya tam tersi, örneğin!).

Ekran değiştiğinde geçişlerin devre dışı bırakılmasının nedeni budur (değişiklik veya görünüme geçiş yapsa bile none- noneyalnızca görünmezlik değildir, kendi öğe oluşturma modudur, bu da hiç oluşturma anlamına gelmez!).


8
Yukarıdaki çözümler olabildiğince iyi, geçişlerin görüntü niteliklerine neden uygulanmadığı konusunda mantıklı bir açıklama almak çok tatmin ediciydi.
kqr

8
Katılmıyorum. Tam mantıklı olabilir. Display: display to none: geçişin başında anında blok oluştu, bu harika olurdu. Ve geri geçiş için, eğer ekrandan çıkacaksa: bloktan ekrana: geçişin sonunda hiçbiri mükemmel olmazdı.
Curtis Yallop

2
Bir noktadan dikdörtgene bir animasyonun nasıl göründüğünü hayal edemiyorsanız sorunlarınız var. Boş yer işgal etmekten dikdörtgen bir yer işgal etmeye geçiş ÇOK açıktır, örneğin her zamanki gibi her bir uygulamada fare ile bir dikdörtgen sürüklediğinizde bunu yaparsınız. Bu başarısızlığın bir sonucu olarak, maksimum yükseklik ve negatif kenar boşluklarını içeren çok sayıda hack var. Çalışan tek şey, 'gerçek' yüksekliği önbelleğe almak ve ardından JavaScript ile sıfırdan önbelleğe alınan değere animasyon yapmaktır. Üzgün.
Triynko

2
Tryniko: display: none, öğenin boyutunu 0 x 0'lık bir dikdörtgene değiştirmez - DOM'dan kaldırır. Genişlik ve yükseklik özelliklerini sıfıra hareket ettirerek bir dikdörtgenden bir noktaya animasyon uygulayabilirsiniz ve daha sonra diğer öğeler, 'display: none' gibi görünüyor, ancak 'display' özelliği 'block' olarak kalacaktı; öğe hâlâ DOM'da. Display: block ve display: arasında animasyon yapma kavramı hiçbiri saçma değildir: Ara durum yoktur. Bir öğe DOM'da bulunur veya ne kadar küçük veya görünmez olursa olsun yoktur.
Steve Thorpe

1
Ayrık özellikleri canlandırmak gülünç değildir. Gibi ayrık özellikler displaydiğer özellikler gibi sorunsuz bir şekilde geçilemez, fakat bu zamanlamanın önemli olmadığı anlamına gelmez. Kontrol edebilme zaman geçiş disply:blockiçin display:noneolur çok önemlidir. @CurtisYallop'un tarif ettiği gibi. Ben geçiş isterseniz opacity:1etmek opacity:0ve daha sonra değişiklik display:blockiçin display:noneI yapmak mümkün olmalıdır.
Jens

56

CSS'de bulunmayan geri aramalar yerine, transition-delayözelliği kullanabiliriz .

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

Peki, burada neler oluyor?

  1. Zaman visiblesınıfı ilave hem edilir heightve opacity(0 ms) gecikmeden animasyon başlamak, ancak height(eşdeğer tam animasyon 0 ms alır display: block) ve opacity600 ms alır.

  2. Tüm visiblesınıfı çıkarılır, opacity(eşdeğer başlangıç değeri geri (0 ms, 400 ms süre gecikme) animasyon başlar ve yüksekliği 400 ms ve ancak bundan sonra hemen (0 ms) bekler display: noneanimasyon geri arama).

Unutmayın, bu yaklaşım kullananlardan daha iyidir visibility. Bu gibi durumlarda, öğe hala sayfadaki alanı kaplar ve her zaman uygun değildir.

Daha fazla örnek için lütfen bu makaleye bakın .


8
Bunun daha fazla oyu olmadığına şaşırdım - bu akıllı çözüm bir şekilde mükemmel çalışıyor.
fanfare

3
Sadece height:100%bazı durumlarda düzeni bozabilecek şekilde çalışır . Harika bir çözüm, eğer bu bir sorun değilse. Birkaç çift yönlü çalışanlardan biri.
Fabian von Ellerts

Bu harika! Benim durumumda daha da basitleştirebildim çünkü solma animasyon zamanının solma zamanıyla aynı olmasını istedim. Kullanmak yerine transition: height 0ms 0ms, opacity 600ms 0ms, sadece kullandım transition-delay: 0s.
Jacob Lockard

52

display geçişin üzerinde çalıştığı özelliklerden biri değildir.

Kendilerine geçişler uygulanabilen CSS özelliklerinin listesi için Animasyonlu CSS özellikleri konusuna bakın . İnterpolasyonun nasıl yapıldığını görmek için bkz. CSS Değerleri ve Birimleri Modül Seviye 4, Değerleri Birleştirme: İnterpolasyon, Toplama ve Birikim .

9.1'de en fazla CSS 3 listelenmiştir . CSS'deki özellikler (uyarı açılır penceresini kapatmanız yeterlidir)

Ayrıca yüksekliği kullanmayı denedim, ama bu sefil bir şekilde başarısız oldu.

Bunu son kez yapmak zorunda kaldım, max-heightbunun yerine, canlandırılabilir bir özellikti (biraz hack olmasına rağmen, işe yaradı), ancak karmaşık sayfalar veya düşük kaliteli mobil cihazlara sahip kullanıcılar için çok gereksiz olabileceğine dikkat ettim. cihazlar.


Bağlantı artık doğrudan canlandırılabilir özellikler bölümüne işaret etmiyor.
Andrew Lam

1
@AndrewLam Düzeltildi. Teşekkürler.
robocat

34

Şimdi block özelliğine özel bir animasyon ekleyebilirsiniz.

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

gösteri

Bu demoda alt menü 'den' display:nonee değişir display:blockve solmaya devam eder.


Meli myfirstolmak showNavburada? Peki ya Firefox? Maalesef, bahsettiğiniz demo sayfasında ilgili bir şey bulamıyorum.
Sebastian vom Meer

Teşekkürler @SebastianG. Düzeltmeyi yaptım ve yukarıda biraz daha bilgi ekledim.
Manish Pradhan

@Sebastian vom Meer: eski Firefox sürümleri "-moz-" satıcı önekine ihtiyaç duyuyor, düzenlenmiş koda bakınız
Herr_Schwabullek

23
Bir şeyi kaçırmadıkça "demo" bağlantısı artık bir alt menü geçişi göstermiyor.
Gerçekçi

1
Yer kaplamayan bir şey için (display: none gibi), alanı kaplayan bir şeye (display: block) doğru geçiş, solma değil boyutların genişlemesidir. Görünür olarak gizlenmiş (alanı kaplayan, ancak görünür olmayan) bir görünürlük meselesi olsaydı, boyut aynı kalır ve bir solma uygun olur. Bu cevapların hiçbiri sorunu çözmez.
Triynko

21

Göre W3C Çalışma Taslağı 19 Kasım 2013 display bir değil canlandırılabilir özellik . Neyse ki, visibilitycanlandırılabilir. Geçişini opaklık geçişiyle ( JSFiddle ) zincirleyebilirsiniz :

  • 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;
    }
  • Test için JavaScript:

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

Bağlantıyı ayar yapmadan saydam yaparsanız, visibility: hiddentıklanabilir kalacağını unutmayın.


1
jsfiddle örneğinde hiç bir geçiş görmüyorum
Gino

@Gino Ben değiştirerek sabit 0için 0s. Görünüşe göre, geçmişte test etmek için kullandığım tarayıcı birimsiz sıfır kez destekliyordu. Ancak, birimsiz süreler 29 Eylül 2016 tarihli W3C Aday Tavsiye Kararının bir parçası değildir .
feklee

Bu daha fazla değerlendirilmelidir. En iyi çözümlerden biri olduğunu gördüm.
Arthur Tarasov

Gecikmenin kullanımı, bunun nasıl çalıştığını anlamak için en iyi mantıktır. Canlandırın ve saklayın. Göster ve canlandır. Benim için mükemmel çözüm
Bruno Pitteli Gonçalves

14

Düzenle: bu örnekte hiçbiri gösterilmiyor.

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

Yukarıda olan şey, opaklık azalırken animasyon ekranının% 99'unun engellenecek şekilde ayarlanmış olmasıdır. Son anda display özelliği yok olarak ayarlanır.

Ve en önemli nokta, animasyon bittikten sonra animasyon-doldurma modunu kullanarak son kareyi korumaktır: ileri

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

İşte iki örnek: https://jsfiddle.net/qwnz9tqg/3/


bu çözüm ile display: noneçalışmıyor?
Bart Calixto

'Animasyon-doldurma modu: ileri' değil 'ileri' olmalıdır
Alex

Düzenlemeler altı karakter olmalı ve sadece yorum önerebilirim bu yüzden yorum
Alex

1
@Alex Ok. Yazım hatası düzeltildi. İlginç olan, cevabımın beklendiği gibi çalışmadığı, ancak bunun olacağını düşünmek mantıklı, bu yüzden tarayıcılar destekleyene kadar saklayacağım.
Pawel

3
Gördüğünüz gibi imleç seti ile bu keman display: none, aslında uygulanmaz. jsfiddle.net/3e6sduqh
robstarbuck

13

Düzgün JavaScript numaram, tüm senaryoyu iki farklı fonksiyona ayırmak !

Bir şeyler hazırlamak için bir global değişken bildirilir ve bir olay işleyici tanımlanır:

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

Sonra, öğeyi gizlerken, böyle bir şey kullanıyorum:

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

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

Elemanı tekrar ortaya çıkarmak için şöyle bir şey yapıyorum:

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

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

Şimdiye kadar çalışıyor!


Bu, javascript komutlarının ayrı işlevlerde olması nedeniyle değil, zaman gecikmesi nedeniyle çalışır. Zaman gecikmeleri birçok durumda iyi bir çözüm gibi görünüyor :)

10

Bugün position: fixedbuna tekrar kullandığım bir yöntemle rastladım . Onu tutamadım display: noneve sonra canlandıramadım, çünkü görünüşe atladı ve ve z-index(negatif değerler, vb.) Garip şeyler de yaptı.

Ben de bir height: 0to kullanıyordum height: 100%, ama sadece mod ortaya çıktığında çalıştı. Bu, kullandığınız gibi bir left: -100%şeydir.

Sonra bana basit bir cevap geldi. Et voila:

İlk olarak, gizli modunuz. Dikkat heightolduğu 0ve kontrol heightgeçişleri bildirgesini ... o vardır 500ms, Artık benim daha hangi opacitygeçiş . Unutmayın, bu giden solmaya geçişi etkiler: modun varsayılan durumuna geri döndürülmesi.

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

İkincisi, görünür kipiniz. Eğer bir kuruyorsunuz Say .modal-activeiçin body. Şimdi heightöyle 100%ve benim geçişim de değişti. İstediğim heightanında değiştirilmesi ve opacityalmaya 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;
}

İşte bu, bir cazibe gibi çalışıyor.


Satıcının ön ekli özelliklerini hizalama stiliniz için onaylama 👍
George Green

9

Bu yanıtlardan ve başka yerlerden bazı önerilerden birkaçını alarak, fareyle üzerine gelme menüleri için aşağıdakiler harika çalışır (  özellikle Bootstrap 3 ile kullanıyorum ):

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

Ayrıca kullanabilirsiniz heightyerine max-heightsen beri hem değerlerini belirtirseniz height:autoile izin verilmez transitions. Vurgulama değerinin menüden max-heightdaha büyük heightolması gerekir.


3
Güzel bir numara ama bir eksiklik var. Geçiş süresi yüksekliğe bağlıdır. Değişken yüksekliğe sahip birden fazla menü varsa, yüksekliği maksimum yüksekliğe yakın olan öğeler güzelce canlandırılır. Ancak kısa olanlar çok hızlı canlandırılarak tutarsız bir deneyim yaşarlar.
kullanıcı

8

Bu sorun için daha iyi bir yol buldum, CSS Animation'ı kullanabilir ve öğeleri göstermek için harika efektinizi yapabilirsiniz.

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

Bu yararlı ipucu için teşekkürler. Mükemmel çalışıyor.
Sedat Kumcu

6

Bu sorunla birkaç kez karşılaştım ve şimdi sadece:

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

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

Sınıfı eklediğinizde, block--invisibletüm Elements tıklanabilir olmayacaktır, ancak arkasındaki tüm Elements pointer-events:none, tüm büyük tarayıcılar tarafından desteklendiği için olacaktır (IE <11 yok).


Bunu bir örnek verebilir misiniz, lütfen?
GarethAS

1
Bu iyi çalışıyor, ancak işaretçi olayların 11'den düşük IE ile çalışmadığını belirtmek gerekir
user1702965

11'in altına IE için not eklendi
DominikAngerer

Her şeyin üstünde bir öğeye (örneğin bir menü) sahip olmanız gerekiyorsa, bu 2019'da desteğin sağlam olduğu için bunu yapmanın en temiz yoludurpointer-events
Josh Davenport

5

Değişim overflow:hiddeniçin overflow:visible. Daha iyi çalışır. Ben böyle kullanın:

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

visibledaha iyi çünkü overflow:hiddentam a display:none.


Bu benim için biletti. Teşekkürler!
Dan Loewenherz

5

JavaScript gerekmez ve aşırı derecede büyük bir maksimum yüksekliğe gerek yoktur. Bunun yerine, max-heightmetin öğelerinizi ayarlayın ve remveya gibi bir font göreceli birim kullanın em. Bu şekilde, menü kapatıldığında gecikmeyi veya "patlatmayı" önlerken kabınızdan daha büyük bir maksimum yükseklik ayarlayabilirsiniz:

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
}

Buradaki bir örneğe bakın: http://codepen.io/mindfullsilence/pen/DtzjE


Buna benzer olarak metninizde satır yüksekliğini ayarlayabilir ve sıfıra dönüştürebilirsiniz. İçinde sadece metin varsa, bu kapsayıcıyı gizler.
vicmortelmans

Neden bu kadar az oy? Bu gerçekten iyi bir cevap ve benim kullandığım cevap bu olabilir.
mwilcox

@mwilcox Sabit bir yükseklik kullandığından dinamik içerikle çalışırken kötü (tahmini bir yükseklik bile). Ve sadece metin içeriğinde faydalıdır.
Fabian von Ellerts

5

Guillermo tarafından kabul edilen cevap yazıldıktan sonra, 2012-04-03'ün CSS geçiş spesifikasyonu görünürlük geçişinin davranışını değiştirdi ve şimdi bu sorunu geçiş gecikmesi kullanmadan daha kısa bir şekilde çözmek mümkün :

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

Her iki geçiş için belirtilen çalışma süresi genellikle aynı olmalıdır (görünürlük için biraz daha uzun bir süre sorun olmasa da).

Çalışan bir sürüm için blog yayınım CSS Geçiş Görünürlüğü'ne bakın .

Wrt "Ekranda geçişler: mülkiyet" sorusunun başlığı ve Rui Marques ve josh tarafından kabul edilen cevaba yapılan yorumlara yanıt olarak:

Bu çözüm , display veya görünürlük özelliğinin kullanılmasının önemsiz olduğu durumlarda işe yarar (muhtemelen bu soruda olduğu gibi).

Öğeyi tamamen display:nonegörünmez kılar, yalnızca görünmez yapar, ancak yine de belge akışında kalır ve aşağıdaki öğelerin konumunu etkiler.

Öğeyi benzer şekilde tamamen kaldıran geçişler display:noneyükseklik (diğer yanıtlarda ve yorumlarda gösterildiği gibi), maksimum yükseklik veya kenar boşluğu üst / alt kullanılarak yapılabilir, ancak bkz. Yüksekliği nasıl değiştirebilirim: 0; yükseklik: otomatik; CSS mi kullanıyorsunuz? ve blog yazım Ekran ve Yükseklik Özelliklerinde CSS Geçişleri için Geçici Çözümler .

GeorgeMillo'dan gelen yoruma yanıt olarak: Her iki özellik ve her iki geçiş de gereklidir: Opaklık özelliği, solma ve solma animasyonu ve öğenin hala fare olaylarına tepki vermesini önlemek için görünürlük özelliği oluşturmak için kullanılır. Görsel efekt için opaklık ve solma bitinceye kadar gizlemeyi geciktirme görünürlüğü üzerinde geçişler gereklidir.


4

Sonunda birleştirerek, benim için bir çözüm buldum opacityile position absolute(gizli zaman boşluğu işgal etmek değil).

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

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

4

Aynı anda display özelliğini (blok / hiçbiri) değiştirirseniz, CSS geçişlerine yeni başlayanların hızlı bir şekilde çalışmadığını keşfeder. Henüz bahsedilmeyen bir çözüm display:block/none, öğeyi gizlemek / göstermek için kullanmaya devam edebilmeniz , ancak opaklığını 0 olarak ayarlayabilmenizdir, böylece bile display:blockgörünmez.

Daha sonra soluklaştırmak için, opaklığı 1 olarak ayarlayan ve opaklık geçişini tanımlayan "on" gibi başka bir CSS sınıfı ekleyin. Tahmin edebileceğiniz gibi, öğeye "on" sınıfını eklemek için JavaScript kullanmanız gerekir, ancak en azından gerçek geçiş için hala CSS kullanıyorsunuz.

PS Kendinizi her ikisini de yapmanız display:blockve "on" sınıfına eklemeniz gereken bir durumda bulursanız , setTimeout'u kullanarak ikincisini erteleyin. Aksi takdirde, tarayıcı her iki şeyi de aynı anda görür ve geçişi devre dışı bırakır.


Mükemmel, teşekkürler! Aslında çalışan bir örnekle başka bir cevap yazdım display:none.
mojuba

4

Aşağıdaki kadar basit :)

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

Kaybolup gitmesini sağlayın height 0;. Ayrıca, son durumda kalması için ileri kullandığınızdan emin olun.


Bu, sınıfı kaldırırken anında sıfırlanır, bu yüzden iyi bir fikir değildir
Sean T

2

Bu çözüm mükemmel bir uyumluluğa sahiptir ve henüz görmedim:

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

Açıklama : Kullandığı visibility: hidden(tek adımda “Göster ve canlandırılır” ile uyumludur) hile, ancak kombinasyonunu kullanır position: absolute; z-index: -1; pointer-events: none;emin gizlenmiş konteyner olmak için yer almaz ve kullanıcı etkileşimlerine cevap vermez .


1
Ama positionhala değişmek , öğeyi sarsacak, değil mi?
Arsylum

Tabii ki, rota dışı: position: absoluteaçıklamanın açıklandığı gibi, elemanın yer kaplamadığı anlamına gelir. Geçip position: staticgöründüğünde, bu sorunun noktası olan normal bir eleman gibi yer alacaktır. Denemenizi öneririm!
Christophe Marois

2
Yaptım. Ama doğru anlarsam, soru geçişler hakkındaydı . "Pürüzsüz animasyonlar" da olduğu gibi.
Arsylum

2

Bunu, ekranı kullanarak - istediğiniz şekilde doğal bir şekilde çalıştırabilirsiniz, ancak Javascript kullanarak veya başkalarının bir etiketi içinde başka bir etiketi olan süslü bir numara önerdiği gibi, tarayıcıyı çalıştırmanız gerekir. CSS ve boyutları daha da karmaşıklaştırdığı için iç etiketi umursamıyorum, işte Javascript çözümü:

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

Gibi bir kutu ile başlayarak:

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

Gizli bir kutu.

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

İlgili q / a'da bulunan bir hileyi kullanacağız, ofseti kontrol ederek tarayıcıyı anında kısmak için:

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

İlk olarak, yukarıdaki numarayı resmileştiren bir kütüphane:

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

Daha sonra, bir kutuyu ortaya çıkarmak için kullanacağız ve solmaya başlayacağız:

$('#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 });
});

Bu kutuyu içeri ve dışarı kaybolur. Yani, .noTrnsn()geçişler kapalı dönüşler, o zaman kaldırmak hiddençevirir sınıf, displaygelen none, varsayılan değere block. Daha sonra solmaya hazırlanmak için opaklığı 0'a ayarladık. Şimdi sahneyi ayarladığımıza göre geçişleri tekrar açıyoruz .resumeTrnsn(). Ve son olarak, opaklığı 1 olarak ayarlayarak geçişe başlayın.

Kütüphane olmasaydı, hem görüntüleme değişikliği hem de opaklık değişikliği bize istenmeyen sonuçlar getirirdi. Sadece kütüphane çağrılarını kaldırsaydık, hiç geçiş olmazdı.

Yukarıdaki, fadeout animasyonunun sonunda görüntüyü bir daha ayarlamaz. Ancak meraklısı alabilirsiniz. Bunu, 0'dan solup yükselen biriyle yapalım.

Fantezi!

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

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

Şimdi hem yüksekliği hem de opaklığı değiştiriyoruz. Yüksekliği ayarlamadığımızı unutmayın, yani varsayılan değerdir auto. Geleneksel olarak bu geçiş yapılamaz - otomatikten piksel değerine (0 gibi) geçmek size geçiş yapmaz. Kütüphane ve bir kütüphane yöntemi ile bunun üzerinde çalışacağız:

$.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();
    });
};

Bu, jQuery 3.x'te hariç tutulan animasyon çerçevelerinden herhangi birine ihtiyaç duymadan jQuery'nin mevcut fx / animasyon kuyruğuna katılmamızı sağlayan bir kolaylık yöntemidir. Ben jQuery nasıl çalışır açıklamak için değil, ama söylemek yeterli, .queue()ve .stop()jQuery sağlayan sıhhi tesisat bizim animasyonlar birbirlerine adım önlemek önlemek yardımcı olur.

Aşağı kaydırma efektini canlandıralım.

$('#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');
        });
    }
});

Bu kod #box, sınıfını kontrol ederek ve şu anda gizli olup olmadığını kontrol ederek başlar . Ancak , gerçekte gizli olup olmadığını bulmayı beklediğiniz kayar / solmaya animasyonun sonuna sınıfı wait()ekleyerek kütüphane çağrısını kullanarak daha fazlasını başarır hidden- yukarıdaki basit örneğin yapamadığı bir şey. Gizli sınıf hiçbir zaman geri yüklenmediği için bu, öğenin tekrar tekrar görüntülenmesini / gizlenmesini sağlar.

Ayrıca, CSS ve sınıf değişikliklerinin .noTrnsn()genellikle #boxçağrılmadan önce, kullanıcıya göstermeden son yüksekliğinin ne olacağını ölçmek .resumeTrnsn()ve tam setten canlandırmak gibi ölçümler de dahil olmak üzere animasyonlar için sahneyi ayarlamak için çağrıldığını görebilirsiniz. hedef CSS değerlerine ulaşır.

Eski Cevap

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

Tıklama ile geçiş yapabilirsiniz:

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 tahmin edeceğiniz şeydir:

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

Anahtar, display özelliğini kısıtlıyor. Gizli sınıfı kaldırarak 50 ms bekledikten sonra , eklenen sınıf yoluyla geçişe başlayarak, herhangi bir animasyon olmadan ekrana bipleme yapmak yerine, görünmesini ve ardından istediğimiz gibi genişlemesini sağlıyoruz. Gizli uygulamadan önce animasyon bitene kadar beklememiz dışında benzer şekilde gerçekleşir.

Not: Yarış koşullarından .animate(maxWidth)kaçınmak için burada kötüye kullanıyorum setTimeout. setTimeoutsiz veya bir başkası farkında olmadan kodu aldığında gizli hataları hızlıca sunar. .animate()ile kolayca öldürülebilir .stop(). Ben sadece bulmak / bunun üzerine inşa diğer kodlayıcılar tarafından çözmek kolay standart fx kuyruğuna 50 ms veya 2000 ms gecikme koymak için kullanıyorum.


1

Cevabını bulamadığım benzer bir sorunum vardı. Birkaç Google araması daha sonra beni buraya getirdi. Umduğum basit cevabı bulamadığım düşünüldüğünde, hem zarif hem de etkili bir çözüm buldum.

visibilityCSS özelliğinin collapsegenellikle tablo öğeleri için kullanılan bir değeri olduğu ortaya çıkıyor . Bununla birlikte, başka herhangi bir elemanda kullanılırsa, bunları etkili bir şekilde gizli hale getirir , display: hiddenancak öğenin herhangi bir yer kaplamaması ve söz konusu öğeyi yine de canlandırabileceğiniz ek yetenek ile.

Aşağıda bunun eylemine basit bir örnek verilmiştir.

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

Sorunun en basit evrensel çözümü: display:noneCSS'nizde belirtmekten çekinmeyin , ancak blockJavaScript'i kullanarak (veya başka bir şekilde) değiştirmeniz gerekecek ve daha sonra söz konusu öğenize gerçekte bir sınıf eklemeniz gerekecek setTimeout () ile geçiş yapar . Bu kadar.

yani:

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

Bu, en son aklı başında tarayıcılarda test edildi. Açıkçası, Internet Explorer 9 veya önceki sürümlerde çalışmamalıdır.


1

Bence SalmanPK en yakın cevaba sahip. Aşağıdaki CSS animasyonlarıyla bir öğeyi içeri veya dışarı soldurur. Ancak, display özelliği sorunsuz bir şekilde canlandırılmaz, yalnızca opaklığı canlandırır.

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

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

Ekran bloğundan hareket eden öğeyi hiçbiri görüntülemek için canlandırmak istiyorsanız, şu anda sadece CSS ile mümkün olduğunu göremiyorum. Yüksekliği almanız ve yüksekliği azaltmak için bir CSS animasyonu kullanmanız gerekir. Bu, aşağıdaki örnekte gösterildiği gibi CSS ile mümkündür, ancak bir öğe için canlandırmanız gereken tam yükseklik değerlerini bilmek zor olacaktır.

jsFiddle örneği

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

JavaScript

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

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

1

Bunu geçiş olaylarıyla yapabilirsiniz, böylece geçiş için iki CSS sınıfı oluşturursunuz. Ve animasyon bittikten sonra onları değiştiriyor musunuz? Benim durumumda, bir düğmeye basar ve her iki sınıfı da kaldırırsam div'leri tekrar görüntüleyebilirim.

Aşağıdaki pasajı deneyin ...

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

Sınıflarınızı ayarlamak için jQuery kullanıyorsanız, bu% 100 çalışır:

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

Tabii ki sadece jQuery kullanabilirsiniz .fadeIn()ve .fadeOut()işlevleri, ancak bunun yerine sınıflar ayarı avantajı dışında bir gösterge değerine geçiş istediğiniz durumda olduğu block(aynı ile varsayılan .fadeIn()ve .fadeOut()).

Burada flexhoş bir solma efekti ile gösterime geçiyorum.


0

Kullanmak yerine, display'ekran dışı' öğesini ihtiyacınız olana kadar saklayabilir ve ardından konumunu istediğiniz yere ayarlayabilir ve aynı zamanda dönüştürebilirsiniz. Bu, diğer tüm tasarım sorunlarını beraberinde getirir, böylece kilometreniz değişebilir.

Muhtemelen displayyine de kullanmak istemezsiniz , çünkü içeriğin ekran okuyucuları tarafından erişilebilir olmasını istersiniz, bu da çoğunlukla görünürlük kurallarına uymaya çalışır - yani, gözle görülmemesi gerekiyorsa, aracıya içerik olarak görünmez.


0

CSS görünürlüğünü kullanabilirsiniz : display yerine hidden / visible : 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
Bu, boş bir delik bırakarak alanı ayırır. Bir alanı daraltmak istiyorsanız, yüksekliği veya başka bir özelliği canlandırmanız gerekir.
Marcy Sutton

0

Toggle Display Animate adlı açık kaynaklı bir iskelet projesine başladım .

Bu iskelet yardımcısı, jQuery gösterisini / gizlemesini kolayca taklit etmenizi sağlayacak, ancak CSS 3 geçiş animasyonlarını içeri / dışarı.

Display dışında öğelerde istediğiniz herhangi bir CSS yöntemini kullanabilmeniz için sınıf geçişleri kullanır: none | block | table | inline, etc ve ayrıca düşünülebilen diğer alternatif kullanımlar.

Ana tasarım amacı, öğe geçiş durumları içindir ve nesnenin gizlenmesinin ana karenizi tersine çalıştırmanıza veya öğeyi gizlemek için alternatif bir animasyon oynatmanıza izin verdiği bir geri dönüş durumunu destekler.

Üzerinde çalıştığım konseptin işaretlemesinin çoğu CSS ve aslında çok az JavaScript kullanılıyor.

Burada bir demo var: http://marcnewton.co.uk/projects/toggle-display-animate/

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.