Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Баг с остановкой анимации (stop()) (https://javascript.ru/forum/jquery/34958-bag-s-ostanovkojj-animacii-stop.html)

LEGIONus 25.01.2013 21:58

Баг с остановкой анимации (stop())
 
Здравствуйте, уважаемые.
Столкнулся со следующей проблемой. Нашел скрипт бегущей строки (вроде бы даже на этом форуме):
$(document).ready(function(){
	$(function(){
		var marquee = $('#scrolling-text');
//Создаем обертки и т.д
		marquee.wrapInner('<span>');
		marquee.find('span').css({'width':'50%', 'display':'inline-block', 'text-align':'center'});
		marquee.append(	marquee.find('span').clone());
		marquee.wrapInner('<div>');
		marquee.find('div').css('width', '200%');
//Анимация
		var reset = function(){
			$(this).css('margin-left', '0%');
			$(this).animate({'margin-left': '-100%'}, 10000, 'linear', reset);
		};

		reset.call(marquee.find('div'));
	});
});

Структура html:
<div id="header-scrolling-text">
		<div id="scrolling-text" class="container">
			<p>
				<a title="Якорь ссылки" href="#">Пример ссылки</a> - текст новости или рекламного объявления или краткой информации и фирме.
			</p>
		</div>
	</div>

Все отлично куриться-вертится. Решил его немного доработать добавив возможность остановки строки при наведении курсора мыши (например чтобы ссылку нажать):
$('div#header-scrolling-text').hover(function(){
//Останавливаем анимацию
	$(this).find('div.container > div').stop();
},
function(){
//Запускаем заново, но не обнуляем значение margin-left
	var reset = function(){
		$(this).animate({'margin-left': '-100%'}, 10000, 'linear', reset);
	};
	reset.call($('#scrolling-text').find('div'));
});

Вроде бы тоже все нормально останавливается-запускается, но остановив\запустив строку раз десять становиться заметно (особенно в IE, там вообще раза 3 надо) что скорость ее "бега" значительно уменьшается, а если продолжать "покрывать" ее курсором то и вообще останавливается.
Пытался и
.stop(true);

и
.stop(true, true);

Не помогло, все равно замедляется.
Дополнение:
Песочница: http://learn.javascript.ru/play/14fyZb
Тестовая страница: http://aboutfilmz.ru/sandbox/js/2/

Deff 25.01.2013 23:12

marquee.append(marquee.find('span').clone())

Т.е число объектов наращивается и не удаляется
Имхо скрипт кривоват

yurik417 26.01.2013 05:08

Воспользуйтесь этим скриптом, здесь есть и остановка при наведении, и перетаскивание строки, и еще много полезных настроек http://masscode.ru/index.php/k2/item/44-limarquee

LEGIONus 26.01.2013 20:54

Здравствуйте.
2 yurik417:
Спасибо, когда делал строку я пробовал и этот скрипт и еще один, который элементы списка крутит (для организации что то типа новостных лент). И оба работали неплохо на первый взгляд, но проблема как раз в том что там "много полезных настроек". Подключать скрипт на 150 строк ради того чтобы крутилась одна, как то несколько расточительно.:)
Да и вообще, мне не столько важно чтобы работало, сколько интересно понять в чем же загвоздка "моего" скрипта, логика то вроде в нем правильная.
2 Deff:
Я и не спорю:)
Не знаю правильно ли я понял что имелось ввиду, но он число объектов не наращивает, изначально создает 2 span'а и их "крутит". Результирующий html будет такой:
<div id="header-scrolling-text">
<div id="scrolling-text" class="container">
<div style="width: 200%; margin-left: -62.94%;">
<span style="width: 50%; display: inline-block; text-align: center;">
<p>
<a href="#" title="Якорь ссылки">Пример ссылки</a>
- текст новости или рекламного объявления или краткой информации и фирме.
</p>
</span>
<span style="width: 50%; display: inline-block; text-align: center;">
<p>
<a href="#" title="Якорь ссылки">Пример ссылки</a>
- текст новости или рекламного объявления или краткой информации и фирме.
</p>
</span>
</div>
</div>
</div>

DjDiablo 27.01.2013 15:10

прикольно ))
короче при каждом наведении ты даёшь ровно 10000мс для достижения -100%.
и как бы близко к -100% значение небыло, пусть даже 1 пиксель остаётся, ты всё равно даш 10 000мс чтобы он прополз этот один пиксель )))

DjDiablo 27.01.2013 16:04

как вариант формула для расчёта времени на оставшуюся часть анимации
var time=10000+parseInt( $(this).css('margin-left') ) / ( $(this).width()/2 )*10000

фактически считаю число пройденных процентов
умножаю на время чтобу узнать сколько времени потрачено
затем вычитаю потраченное время из отведённого на анимацию (+ потомучто потраченное время это отрицательное число)

результат
<!DOCTYPE HTML>
<html>
  <head> 
     <script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.js"></script>
  <style>
    /*-- Menu Styles Start --*/
*{margin:0;padding:0;}
body{background-color: #C0C0C0;color:#CCC;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:18px;padding:100px 0;width:100%;}
.content{
    background-color: #333333;
    height: 55px;
    margin: 0 auto;
    overflow: hidden;
    padding: 50px 0;
    width: 1200px;}
div#header-scrolling-text {
    border-left: 1px solid #828282;
    border-right: 1px solid #828282;
    display: inline;
    float: right;
    height: 29px;
    margin: 13px 150px 13px 0;
    overflow: hidden;
    padding: 0;
    position: relative;
    width: 350px;
}
div#header-scrolling-text div.container {
    overflow: hidden;
    position: relative;
    top: 5px;
    width: 600px;/* -- Ширина блока с текстом -- */
}
div#header-scrolling-text div.container div {
}
div#header-scrolling-text div.container div span {
    display: -moz-inline-box;
}
div#header-scrolling-text div.container div span p {
    margin: 0;
    }
   
    
div#header-scrolling-text div.container div span p a {
    color: #FF0000;
    text-decoration: none;
}
div#header-scrolling-text div.container div span p a:hover {
    color: #FF0000;
}
/*-- Menu Styles End --*/
    </style>
    </head>
  <body>

    <script>
      
$(document).ready(function(){

//Scrolling Text
	$(function(){
		//Initial Settings
		var marquee = $('#scrolling-text');
		marquee
			.wrapInner('<span>');
		marquee
			.find('span')
			.css({'width':'50%', 'display':'inline-block', 'text-align':'center'});
		marquee
			.append(
				marquee
					.find('span')
					.clone()
			);
		marquee
			.wrapInner('<div>');
		marquee
			.find('div')
			.css('width', '200%');
		//
		var reset = function(){
          //alert(жreset);
			$(this)
				.css('margin-left', '0%');
			$(this)
				.animate({'margin-left': '-100%'}, 10000, 'linear', reset);
		};
		//
		reset.call(
          marquee.find('div') 
        );
	
      //Stop/Start Scrolling
      marquee.find('div').hover(
        function(){
            $(this).stop(false,false);
        },
                                             
        function(){     
          var time=10000+parseInt( $(this).css('margin-left') )/($(this).width()/2)*10000          
           $(this).animate({'margin-left': '-100%'}, time, 'linear',reset);
        });                                
    });


});

    </script>

    <div class="content">

<!-- Scrolling Text Start -->
	<div id="header-scrolling-text">
		<div id="scrolling-text" class="container">
			<p>
				<a title="Якорь ссылки" href="#">Пример ссылки</a> - текст новости или рекламного объявления или краткой информации и фирме.
			</p>
		</div>
	</div>
<!-- Scrolling Text End -->

</div>

  </body>
</html>

LEGIONus 30.01.2013 06:33

Нда, сам бы я до этого не скоро допер.
Огромное спасибо, теперь работает как положено.


Часовой пояс GMT +3, время: 11:10.