2016-11-27 25 views
7

好吧,我有一種情況,我已經基本建立了一個小通知下拉框,當用戶做了一些事情時,最終轉換到opacity: 0;狀態。從元素中刪除類而不影響正在進行的css轉換

但是,因爲用戶可能點擊其他的東西,將再次觸發此通知框我試圖想出一種方法來重置它恢復正常,而不影響任何正在進行的轉換並嘗試保持動畫完成CSS而不是JavaScript

CodePen:http://codepen.io/gutterboy/pen/WoEydg

HTML:

<a href="#">Open Notify Window</a> 

<div id="top_notify" class="top-notify"> 
    <div class="container-fluid"> 
     <div class="row"> 
      <div class="content col-xs-12"> 
       <div class="alert" role="alert"></div> 
      </div> 
     </div> 
    </div> 
</div> 

SCSS:

body { 
    text-align: center; 
    padding-top: 150px; 
} 

.top-notify { 
    position: fixed; 
    top: 0; 
    width: 100%; 
    z-index: 9999; 

    .content { 
     text-align: center; 
     background-color: transparent; 
     transform-style: preserve-3d; 
    } 

    .alert { 
     display: inline-block; 
     transform: translateY(-100%); 
     min-width: 250px; 
     max-width: 500px; 
     border-top-left-radius: 0; 
     border-top-right-radius: 0; 

     &.visible { 
      transform: translateY(0%); 
      transition: 0.8s 0s, opacity 1s 3.8s; 
      opacity: 0; 
     } 

    } 

} 

JS:

$('a').on('click', function(e){ 
    e.preventDefault(); 
    myFunc(); 
}); 

function myFunc() { 

    // Set file to prepare our data 
    var loadUrl = "https://crossorigin.me/http://codepen.io/gutterboy/pen/ObjExz.html"; 

    // Run request 

    getAjaxData(loadUrl, null, 'POST', 'html') 

      .done(function(response) { 

       var alert_el = $('#top_notify').find('.alert'); 

       // Update msg in alert box 
       alert_el.text(response); 
       alert_el.addClass('alert-success'); 

       // Slide in alert box 
       alert_el.addClass('visible'); 

      }) 

      .fail(function() { 
       alert('Problem!!'); 
      }); 

    // End 

} 

function getAjaxData(loadUrl, dataObject, action, type) { 

    return jQuery.ajax({ 
     type: action, 
     url: loadUrl, 
     data: dataObject, 
     dataType: type 
    }); 

} 

我知道我可以在JS這樣重置回其正常:

$('#top_notify').find('.alert').removeClass().addClass('alert'); // The classes it ends up with vary 

...但是做之前的過渡完成後淡出的不透明度,它只是消失這消除類馬上。

我知道我可以延遲JS來抵消CSS延遲,但這樣做似乎並不是一個很好的方法,因爲您在2個不同的地方有計時。

有沒有什麼辦法可以實現這一點,同時保持由CSS完成的動畫,或者我將不得不移動到使用jQuery的animate,所以我可以在動畫完成後運行重置過程?

+0

你有沒有想過爲第二個通知開啓一個新實例並將它們垂直堆疊在屏幕上? –

+0

這篇文章是有點老了,但仍可能在這裏適用:https://css-tricks.com/pop-from-top-notification/ –

+0

@NathanielFlick嗯,我寧願只使用相同的通知框中的所有情況而不是必須創建額外的;我想這是一個選項。也感謝您的鏈接。 – Brett

回答

1

好吧,我想出了一個簡單的解決方案後,想出了一個錯綜複雜的一個公頃。

簡單的解決方案,我應該在第一時間紛紛拿出了ajax調用之前除去任何額外添加的類;我太專注於在ajax區塊內做這件事,當然這並沒有奏效,但直到我開始嘗試其他解決方案時,我從未嘗試過。

任何方式,簡單的解決方案是簡單的移動驗證碼:

var alert_el = $('#top_notify').find('.alert'); 

...的ajax調用上面,而不是在它的內部。

然後直屬添加此:

alert_el.removeClass('visible alert-success alert-info alert-danger alert-warning'); 

有了完整的功能代碼的存在:

function myFunc() { 

    // Set file to prepare our data 
    var loadUrl = "https://crossorigin.me/http://codepen.io/gutterboy/pen/ObjExz.html"; 

    var alert_el = $('#top_notify').find('.alert'); 

    alert_el.removeClass('visible alert-success alert-info alert-danger alert-warning'); 

    // Run request 

    getAjaxData(loadUrl, null, 'POST', 'html') 

      .done(function(response) { 

       // Update msg in alert box 
       alert_el.text(response); 
       alert_el.addClass('alert-success'); 

       // Slide in alert box 
       alert_el.addClass('visible'); 

      }) 

      .fail(function() { 
       alert('Problem!!'); 
      }); 

    // End 

} 

CodePen:http://codepen.io/gutterboy/pen/xRXbXy

我想出了其他的解決辦法,而現在不是真的需要,我想我會發布它,以防萬一它適合我(或某人)其他人在未來。

刪除visible類動畫結束後(因爲沒有辦法,我知道的提醒JS當它這樣做),但visible類 - 我會改變的,如果名字你使用這種方法 - 不添加任何新的樣式,它只是運行動畫。

這是我如何做的:

中的JavaScript保持相同上述方案中,這一切都在CSS。

TLDR;

基本上使用多個CSS動畫來控制效果運行期間的不同狀態; CodePen在底部。

該變化在.visible類和添加一些@keyframes

。可見類:

&.visible { 
    animation: slideDown 0.8s 0s, keepThere 3s 0.8s, fadeAway 1s 3.8s; 
} 

正如你可以看到我們已經擺脫了這裏的任何額外的造型 - 這意味着當動畫完成,它本質上重置恢復正常,這是我們想要什麼。

現在,讓我們打破這個代碼:

我們在這裏運行3個不同的動畫,並注意它們不運行一前一後是很重要的 - 這意味着他們沒有等到一個結束,直到它開始下一個,因此我們需要包含delay設置。

信息首先我們先從slideDown動畫:

slideDown 0.8s 0s

如果你是新來的CSS動畫,它開始運行且動畫運行之前那麼基本上這是什麼做的是套0s延遲對於0.8s,這是動畫:

@keyframes slideDown { 
    0% { 
     transform: translateY(-100%); 
    } 
    100% { 
     transform: translateY(0%); 
    } 
} 

所以,很簡單,只需用transform滑了下去,從-100%0%,並且此動畫需要0.8s,正如我們在此動畫中的設置。現在

,我想這對留可見3秒纔開始逐漸消失,但我們有一個問題;一旦動畫結束,然後它可以追溯到它的標準造型,這在我們的情況下,意味着它消失,因爲它可以追溯到transform: translateY(-100%)因爲我們在.visible類沒有多餘的風格,我們不能把任何額外的風格在那裏,然後我們將無法將重置爲它回到它的原始狀態(風格明智)。

但我們該怎麼辦? fadeAway動畫不會再開始3秒鐘,並且此時它沒有任何東西可以消失(它確實如此,但是因爲它隱藏,所以看不到它)。

的解決方案,這是增加一個動畫 - 這在技術上並沒有真正動畫任何東西,它只是保持它可見,直到fadeAway動畫開始。

這就是我們得到:

keepThere 3s 0.8s

現在,回想起我們fadeAway動畫的設置是:fadeAway 1s 3.8s這意味着我們有3秒在此之前的動畫就要開始了,因此之前我們可以用它來控制任何樣式。

這就是這些參數值進來的地方 - 我們將延遲設置爲0.8s,因此keepThere動畫不會開始,直到slideDown之一完成;那麼我們設定的時間爲3s反擊的等待時間,直到fadeAway動畫開始,這就是keepThere動畫:

@keyframes keepThere { 
    0%, 100% { 
     transform: translateY(0%); 
    } 
} 

由於它具有相同的起點和終點的造型,我們結合成的0%, 100%一個選擇正如你所看到的,這只是它所做的事情,使元素在設置的持續時間3s之前保持可見,直到我們可以用fadeAway動畫控制樣式爲止。

我想技術上你可以將這個功能合併到fadeAway動畫中,如果你想做什麼%數學等於3秒,因此知道什麼時候開始淡化元素。

最後我們有fadeAway動畫:

fadeAway 1s 3.8s

現在,當我們上面的討論,我們已經知道了爲什麼我們已經設置了delay3.8s0.8s偏移,允許slideDown動畫運行,額外的延遲,因爲這是我們希望元素可見多久,直到它開始消失,然後當然淡入完成需要1s

這個動畫是:

@keyframes fadeAway { 
    0%, 100% { 
     transform: translateY(0%); 
    } 
    0% { 
     opacity: 1; 
    } 
    100% { 
     opacity: 0; 
    } 
} 

現在,由於keepThere動畫完成後,我們必須確保,保持元件可見,所以淡出有一些可見的實際消逝,這就是爲什麼我們確保從開始到結束包含樣式transform: translateY(0%);作爲值;在那之後,我認爲這很明顯。

把它放在一起,你會得到:

.top-notify { 
    position: fixed; 
    top: 0; 
    width: 100%; 
    z-index: 9999; 

    .content { 
     text-align: center; 
     background-color: transparent; 
     transform-style: preserve-3d; 
    } 

    .alert { 
     display: inline-block; 
     transform: translateY(-100%); 
     min-width: 250px; 
     max-width: 500px; 
     border-top-left-radius: 0; 
     border-top-right-radius: 0; 

     &.visible { 
      animation: slideDown 0.8s 0s, keepThere 3s 0.8s, fadeAway 1s 3.8s; 
     } 

    } 

} 

@keyframes slideDown { 
    0% { 
     transform: translateY(-100%); 
    } 
    100% { 
     transform: translateY(0%); 
    } 
} 

@keyframes keepThere { 
    0%, 100% { 
     transform: translateY(0%); 
    } 
} 

@keyframes fadeAway { 
    0%, 100% { 
     transform: translateY(0%); 
    } 
    0% { 
     opacity: 1; 
    } 
    100% { 
     opacity: 0; 
    } 
} 

CodePen:http://codepen.io/gutterboy/pen/QGqwBg

那當然要能夠再次運行它的類被重新添加了,因此這是除去在每次運行開始時.visible類(前Ajax調用),然後當它得到在阿賈克斯重新添加再次調用它運行的目的。

感謝@Nathaniel弗裏克共享,導致我沿着這條道路的鏈接與:)

開始好了,希望這派上用場有人看到,因爲我不再打算使用該選項哈!

相關問題