Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.01.2013, 21:58
Аватар для LEGIONus
Новичок на форуме
Отправить личное сообщение для LEGIONus Посмотреть профиль Найти все сообщения от LEGIONus
 
Регистрация: 23.01.2013
Сообщений: 8

Баг с остановкой анимации (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/

Последний раз редактировалось LEGIONus, 25.01.2013 в 22:04. Причина: Добавление ссылок на примеры
Ответить с цитированием
  #2 (permalink)  
Старый 25.01.2013, 23:12
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

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

Последний раз редактировалось Deff, 25.01.2013 в 23:33.
Ответить с цитированием
  #3 (permalink)  
Старый 26.01.2013, 05:08
Интересующийся
Отправить личное сообщение для yurik417 Посмотреть профиль Найти все сообщения от yurik417
 
Регистрация: 31.08.2011
Сообщений: 17

Воспользуйтесь этим скриптом, здесь есть и остановка при наведении, и перетаскивание строки, и еще много полезных настроек http://masscode.ru/index.php/k2/item/44-limarquee
Ответить с цитированием
  #4 (permalink)  
Старый 26.01.2013, 20:54
Аватар для LEGIONus
Новичок на форуме
Отправить личное сообщение для LEGIONus Посмотреть профиль Найти все сообщения от LEGIONus
 
Регистрация: 23.01.2013
Сообщений: 8

Здравствуйте.
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>
Ответить с цитированием
  #5 (permalink)  
Старый 27.01.2013, 15:10
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

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

Последний раз редактировалось DjDiablo, 27.01.2013 в 16:16.
Ответить с цитированием
  #6 (permalink)  
Старый 27.01.2013, 16:04
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

как вариант формула для расчёта времени на оставшуюся часть анимации
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>
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 27.01.2013 в 16:12.
Ответить с цитированием
  #7 (permalink)  
Старый 30.01.2013, 06:33
Аватар для LEGIONus
Новичок на форуме
Отправить личное сообщение для LEGIONus Посмотреть профиль Найти все сообщения от LEGIONus
 
Регистрация: 23.01.2013
Сообщений: 8

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Баг в Опере (select и onclick) Dimox Opera, Safari и др. 20 25.01.2013 00:39
функция stop() cyklop77 jQuery 1 08.09.2012 08:47
Баг анимации в Safari B~Vladi jQuery 6 31.08.2012 21:33
Очередной баг jQuery? monolithed jQuery 8 27.01.2011 10:16
Баг с jpeg в ie6 JsLoveR Элементы интерфейса 20 28.01.2010 20:57