#javascript #jquery #animation #scroll
#javascript #jquery #Анимация #прокрутка
Вопрос:
У меня есть div, который перемещается по странице в прослушивателе событий keydown. Я пытаюсь найти способ остановить ее либо после определенного количества нажатий клавиш (вычисляется по шагу * щелчки> размер экрана), либо когда анимированный div достигает конца экрана, что, я полагаю, должно соответствовать размеру экрана.
В настоящее время анимация продолжает запускаться при нажатии клавиши, и div будет прокручиваться вне поля зрения.
Примером этого является вторая демонстрация на этой странице: http://api.jquery.com/animate/Вы можете нажимать влево или вправо, пока блок не исчезнет из поля зрения. Как бы я поместил это в контейнер?
вот мой jsfiddle: https://jsfiddle.net/vidro3/1a8tnuer /
var count1 = 0;
var count2 = 0;
// 1. Get two divs to move on different key presses;
$(function(){
$(document).keydown(function(e){
switch (e.which){
case 39: //lright arrow key
count2 ;
$('.box2').animate({
left: ' =50'
});
break;
case 90: //z key
count1 ;
$('.box1').animate({
left: ' =50'
});
break;
}
});
});
// 2. Get one div to move on button click;
$(function(){
$( '#start' ).click(function() {
alert('Chug that Duff!');
var rabbit = $(".rabbit");
rabbit.animate({left: ' =100%'}, 'slow');
});
});
$(function(){
var winPos = $('#background').width();
if (winPos/50 > count1)
alert('Homer Wins!');
else if (winPos/50 > count2)
alert('Barney Wins!');
});
Ответ №1:
Просто добавьте условие к анимации:
var maxLeft = $(window).width() - $('.box1').width();
// If the box's x-position is less than the max allowed, then animate
if ($('.box1').position().left < maxLeft) {
$('.box1').animate({
left: ' =50'
});
}
Значение (ширина окна — ширина окна) — это точка, в которой окно находится в конце экрана. Обратите внимание, что размер вашего шага может занимать поле за пределами экрана в зависимости от текущего размера окна (например, он, вероятно, не делится на 50), поэтому вместо этого вам может понадобиться что-то вроде этого:
var stepSize = 50;
var maxLeft = $(window).width() - $('.box1').width();
// If the box's x-position is less than the max allowed, then animate
if ($('.box1').position().left < maxLeft) {
var diff = maxLeft - $('.box1').position().left;
// If the next step would take the box partially off the screen
if (diff < stepSize) {
$('.box1').animate({
left: ' =' diff
});
} else {
$('.box1').animate({
left: ' =' stepSize
});
}
}
Редактировать: вот более короткая версия, использующая троичный оператор:
var stepSize = 50;
var maxLeft = $(window).width() - $('.box1').width();
// If the box's x-position is less than the max allowed, then animate
if ($('.box1').position().left < maxLeft) {
var diff = maxLeft - $('.box1').position().left;
$('.box1').animate({
left: ' =' (diff < stepSize ? diff : stepSize)
});
}
Комментарии:
1. хм, я понимаю, что «left» не определено
2. Это работает так, как задумано для меня, и я не получаю никаких ошибок, где вы видите, что left не определено?
3. это было в первом экземпляре left во втором примере. где вы размещаете это в JS? Затем я добавил, что оператор if в каждом случае оператора switch, и я клянусь, что это сработало один раз, но затем не при перезагрузке.
4. ах, максимальная левая величина, конечно, должна находиться внутри функции. Спасибо!