#javascript #jquery #animation
#javascript #jquery #Анимация
Вопрос:
Итак, я работал над анимацией предупреждений javascript,
function addalert(text){
if(alertid >= 100){
alertid = 0;
}
document.body.innerHTML = ("<div id="" alertid "" " "class="alert">" text "</div>");
var top = parseInt($("#" alertid).css('top'));
while($("#" alertid).css('top') > 0){
setInterval($("#" alertid).css({"top": $("#" alertid).css("top") - 1,"opacity":$("#" alertid).css("opacity") -0.1}), 100);
}
$("#" alertid).css({"top":"0","opacity":"0"});
alertid ;
return;
}
проблема в том, что когда вы вызываете эту функцию, когда функция уже вызвана и анимация продолжается, кажется, что она просто выходит из анимации.
Редактировать:
я пытался использовать jquery animate, это не сработало
function addalert(text){
if(alertid >= 100){
alertid = 0;
}
document.body.innerHTML = ("<div id="" alertid "" " "class="alert">" text "</div>");
$("#" alertid).animate({"top":"0px","opacity":"0"}, {easing: "linear", duration: 2000, complete: function(){$("#" alertid).remove()} });
/*$("#" alertid).css({"top":"0","opacity":"0"});*/
alertid ;
}
Комментарии:
1. почему вы не используете
$('#' alertid).animate(...)
?2. Вам лучше переосмыслить и сделать это другим (лучшим) способом. Попробуйте использовать больше CSS.
3. Я полагаю, что ваше понимание
setInterval
… неверно.setInterval
не «приостанавливает» ваш код.4. Пожалуйста, добавьте немного HTML и CSS, чтобы мы могли воспроизвести ваш случай.
Ответ №1:
Вот демонстрационное использование animate()
. Обратите внимание, что в коде также должен быть правильно установлен CSS, иначе он не будет работать. Точнее div
, для анимируемого должен быть position
установлен его стиль.
Чтобы прервать текущую анимацию, когда должна начаться новая, используйте .finish()
. Вот рабочий фрагмент, который показывает два предупреждения, где второе прерывает первое, когда оно выполняется только на полпути:
var alertid = 0;
function addalert(text){
if(alertid >= 100){
alertid = 0;
}
// Finish any ongoing alert animation
$('.alert:last()').finish();
// Add the div in the jQuery way:
$("<div>").attr('id', alertid).addClass('alert').text(text)
.appendTo(document.body)
.animate({
top: "0px",
opacity: "0"
}, {
easing: "linear",
duration: 2000,
complete: function(){
// You can use `this` here:
$(this).remove();
}
});
alertid ;
}
// Demo
$(function() {
addalert('first alert');
setTimeout(function () {
addalert('second alert interrupted the first');
}, 1000);
});
.alert {
position: absolute;
top: 100px;
left: 0px;
background: orange;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Ответ №2:
Я бы предложил использовать библиотеку анимации вместо создания подобных собственных анимаций. Например, есть velocity js, который работает действительно хорошо.
Я не уверен, хорошо ли я понял вашу анимацию, но я думаю, что это то, что он тоже сделал:
Для части stop я создал небольшую пустышку, которую нужно улучшить, но вы поняли идею. Очевидно, что элемент также должен быть удален и так далее…
var animation;
$('#start').on('click', function() {
var el = document.createElement('div');
el.style.position = 'absolute';
el.style.bottom = '10px';
el.style.right = '10px';
el.appendChild(document.createTextNode('Alert text'));
el.style.backgroundColor = 'red';
document.body.appendChild(el);
animation = $(el).velocity({
translateY: document.body.scrollHeight * -1 'px',
opacity: 0
}, {
duration: 4000
});
});
$('#stop').on('click', function() {
$(animation).velocity('stop');
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/velocity/1.3.1/velocity.min.js"></script>
<button id="start">
Start animation
</button>
<button id="stop">Stop</button>