CSS: Как спрятаться после завершения затухания? - PullRequest
0 голосов
/ 29 февраля 2020

Я использую здесь код закуски https://www.w3schools.com/howto/tryit.asp?filename=tryhow_js_snackbar, который имеет функцию тайм-аута для скрытия div после завершения fadeout. Работает нормально, но не очень синхронизировано. Иногда я вижу, что затухание резко останавливается, в то время как в других случаях оно появляется после затухания, а затем быстро исчезает.

Было бы неплохо синхронизировать затухание со скрытием, а не полагаться на жестко запрограммированное время ожидания, но я не знаю, как это сделать. добиться этого после нескольких испытаний. Обратите внимание, что из-за некоторых технических ограничений я не могу использовать расширенные функции css или html, а не jquery.

<html>
<head>
<meta http-equiv='X-UA-Compatible' content='IE=11'>
<style type='text/css'>
#snackbar {
  visibility: hidden;
  min-width: 250px;
  margin: auto;
  background-color: #c8bed9;
  color: #000000;
  text-align: center;
  transform: translateX(-50%);
  border-radius: 2px;
  padding: 16px;
  position: fixed;
  z-index: 1;
  left: 50%;
  bottom: 30px;
  font-weight: bold;
  font-family: "Arial", Times, serif;
  font-size: 20px;
}

#snackbar.show {
  visibility: visible;
  animation: fadein 0.5s, fadeout 0.5s 2.5s;
}

@keyframes fadein {
  from {bottom: 0; opacity: 0;}
  to {bottom: 30px; opacity: 1;}
}

@keyframes fadeout {
  from {bottom: 30px; opacity: 1;}
  to {bottom: 0; opacity: 0;}
} 
</style>
</head>
<body>
<div id="snackbar">This should show some text and some message if needed...</div>
<script>
function terminate()
{
    var elm = document.getElementById("snackbar");
    setTimeout(function() {
        elm.className = "show";
        document.getElementById("loading_wheel").style.display = "none";
    }, 200);     
    setTimeout(function() {
        elm.className = "";
    }, 3000);
    return false;
}
window.onload = terminate;
</script>
</body>
</html>

Ответы [ 2 ]

3 голосов
/ 29 февраля 2020

Вместо использования from и to используйте проценты, как показано ниже:

@keyframes fadein {
    0% {bottom: 0; opacity: 0; display: none;}
    1% {bottom: 0; opacity: 0; display: block;}
    100% {bottom: 30px; opacity: 1; display: block;}
}

@keyframes fadeout {
    0% {bottom: 30px; opacity: 1; display: block;}
    99% {bottom: 0; opacity: 0; display: block;}
    100% {bottom: 0; opacity: 0; display: none;}
} 

Это позволит вам обойтись без возможности анимировать display, в то же время будучи в состоянии исчезать в и вне. Возможно, вам придется поиграть с процентами, но обычно вы просто хотите перевернуть дисплей сразу в начале или прямо в конце.

0 голосов
/ 29 февраля 2020

вы можете использовать конец обнаружения анимации.
Document: animationend event -> https://developer.mozilla.org/en-US/docs/Web/API/Document/animationend_event

Особенность вашего кода в том, что это двойная анимация, которая подразумевает, что вам нужно дождаться окончания второй анимации, чтобы удалить класс "show"

пример кода:

const snackbar  = document.getElementById('snackbar')
  ,   btShowMsg = document.getElementById('bt-ShowMessage')
  ;
btShowMsg.onclick = e =>
  {
  let EndTransitionNumber = 0;
  snackbar.addEventListener('animationend',AnimationEnded)

  snackbar.className = "show";

  function AnimationEnded(e)
    {
    if (++EndTransitionNumber===2)
      {
      snackbar.className = '';
      snackbar.removeEventListener('animationend', AnimationEnded)
      }
    }
  }
#snackbar {
  visibility      : hidden;
  min-width       : 250px;
  margin          : auto;
  background-color: #c8bed9;
  color           : #000000;
  text-align      : center;
  transform       : translateX(-50%);
  border-radius   : 2px;
  padding         : 16px;
  position        : fixed;
  z-index         : 1;
  left            : 50%;
  bottom          : 30px;
  font-weight     : bold;
  font-family     : "Arial", Times, serif;
  font-size       : 20px;
}
#snackbar.show {
  visibility      : visible;
  animation       : fadein 0.5s, fadeout 1.5s 2.5s;
}
@keyframes fadein {
  from { bottom: 0;    opacity: 0; }
  to   { bottom: 30px; opacity: 1; }
}
@keyframes fadeout {
  from { bottom: 30px; opacity: 1; }
  to   { bottom: 0;    opacity: 0; }
} 
  <button id="bt-ShowMessage">Show Message</button>

  <div id="snackbar">This should show some text and some message if needed...</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...