Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 17.12.2009, 17:03
Интересующийся
Отправить личное сообщение для paratrooper1981 Посмотреть профиль Найти все сообщения от paratrooper1981
 
Регистрация: 10.09.2009
Сообщений: 20

Как сделать нормальное анимированное скрытие элемента
Помогите пожалуйста написать грамотный скрипт скрытия элемента со страницы.



var time_closepixel=50; //время в мс
var hstep=1; //количество пикселей, на которые элемент будет уменьшаться при одном выполнении функции closeitem
function closeitem(div_name, heightEl)
{
var d_apply=document.getElementById(div_name);

if (heightEl=='begin')
{
var heightEl2=d_apply.offsetHeight;
d_apply.style.height=heightEl2+'px';
var heightEl3=heightEl2-hstep;
closeitem(div_name, i, heightEl3);
}
else if (heightEl<=0)
{
removeitem(div_name); //функция удаляет элемент из страницы (здесь эту функцию не привожу)
}
else
{
d_apply.style.height=heightEl+'px';
var heightEl2=heightEl-hstep;
setTimeout(function(){closeitem(div_name, i, heightEl2)}, time_closepixel);
}
}


Для скрытия элемента <div id="nnn" style="overflow:hidden; width:100%;'> я вызываю функцию closeitem("nnn",'begin');

Анимированный эффект в браузерах IE и Opera при этом получается говённый, большие задержки и время выполнения эффекта зависти от количества элементов на странице, к которым применяется эффект..

Как я уже догадался, функция рекурсивно ссылается саму на себя, что вызывает переполнение памяти. Замена на setInterval() здесь тоже наверно не подойдёт, т.к. причина в самом стилей выполнения анимации. Не знаю, как по другому выполняются данные функции, чтобы не вызывать переполнение памяти. По крайней мере на сайтах видел нормальную работающую анимацию без всяких задержек и глюков и знаю, что можно сделать более качественно. Помогите создать грамотный анимированный эффект.

Последний раз редактировалось paratrooper1981, 17.12.2009 в 17:06.
Ответить с цитированием
  #2 (permalink)  
Старый 17.12.2009, 18:17
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

http://javascript.ru/blog/Andrej-Par...cii-JavaScript
Ответить с цитированием
  #3 (permalink)  
Старый 17.12.2009, 18:49
Интересующийся
Отправить личное сообщение для paratrooper1981 Посмотреть профиль Найти все сообщения от paratrooper1981
 
Регистрация: 10.09.2009
Сообщений: 20

Сообщение от Kolyaj Посмотреть сообщение
http://javascript.ru/blog/Andrej-Par...cii-JavaScript
Я знал, что на этом сайте найдутся статьи на все случаи жизни
Ответить с цитированием
  #4 (permalink)  
Старый 17.12.2009, 19:19
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

почти в правильном направлении. а тебе не зря указали почитать
function closeitem(div_name){
  var d_apply=document.getElementById(div_name),h=d.offsetHeight-hstep;
  if (h>0) {
    d_apply.style.height = h+'px';
    setTimeout(function(){closeitem(div_name)},time_closepixel)
    }
    else removeitem(div_name);
  }

closeitem("nnn");

Последний раз редактировалось PeaceCoder, 17.12.2009 в 19:23.
Ответить с цитированием
  #5 (permalink)  
Старый 18.12.2009, 16:44
Интересующийся
Отправить личное сообщение для paratrooper1981 Посмотреть профиль Найти все сообщения от paratrooper1981
 
Регистрация: 10.09.2009
Сообщений: 20

Я статью только что прочитал. Очень полезная статья и она мне очень поможет продвинуться в изучении анимации движения. Спасибо автору.

Хотелось бы подробно знать, как можно избежать переполнения памяти при создании анимации, так как память обязательно будет переполняться, если функция рекурсивно ссылается сама на себя (или же это не так?). Как вообще избегать подобных утечек\переполнений памяти в браузерах?
Киньте кто-нибудь ссылку на статью (можно на английском), раскрывающей этот момент. Заранее спасибо.
Ответить с цитированием
  #6 (permalink)  
Старый 18.12.2009, 16:47
Аватар для PeaceCoder
Профессор
Отправить личное сообщение для PeaceCoder Посмотреть профиль Найти все сообщения от PeaceCoder
 
Регистрация: 15.12.2009
Сообщений: 742

в такие подробности не в давался, но вроде как ток заканчивается работа функции setTimeout, то из памяти она удаляется. если бы было как Вы говорите, то никакой браузер не выдержал бы хорошие анимации в течение 1 часа... да какого там часа, 15-20 минут и браузер зажрал бы всю оперативку
Вот если бы вы делали var id = setTimeout(...) то да оперативка бы жралась, но тоже не уверен, сборщик мусора все равно должен увидеть что переменные не используются...

Последний раз редактировалось PeaceCoder, 18.12.2009 в 16:50.
Ответить с цитированием
  #7 (permalink)  
Старый 18.12.2009, 16:49
Интересующийся
Отправить личное сообщение для paratrooper1981 Посмотреть профиль Найти все сообщения от paratrooper1981
 
Регистрация: 10.09.2009
Сообщений: 20

PeaceCoder, я буду дорабатывать функцию и делать её универсальной. Пока код пишу не очень профессиональный, надеюсь это временное явление. В конце что-то похожее на библиотеку должно получиться.
Ответить с цитированием
  #8 (permalink)  
Старый 18.12.2009, 16:49
Новичок на форуме
Отправить личное сообщение для Kolyaj Посмотреть профиль Найти все сообщения от Kolyaj
 
Регистрация: 19.02.2008
Сообщений: 9,177

Сообщение от paratrooper1981
если функция рекурсивно ссылается сама на себя
Там нет рекурсий.
Ответить с цитированием
  #9 (permalink)  
Старый 18.12.2009, 16:49
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

Сообщение от paratrooper1981
если функция рекурсивно ссылается сама на себя
а где вы нашли рекурсию?
setTimeout не создает рекурсии
к моменту запуска следующего вызова ф-ции, предыдущий уже полностью отработает
Ответить с цитированием
  #10 (permalink)  
Старый 18.12.2009, 16:50
Интересующийся
Отправить личное сообщение для paratrooper1981 Посмотреть профиль Найти все сообщения от paratrooper1981
 
Регистрация: 10.09.2009
Сообщений: 20

Сообщение от PeaceCoder Посмотреть сообщение
в такие подробности не в давался, но вроде как ток заканчивается работа функции setTimeout, то из памяти она удаляется. если бы было как Вы говорите, то никакой браузер не выдержал бы хорошие анимации в течение 1 часа... да какого там часа, 15-20 минут и браузер зажрал бы всю оперативку
У меня так и было В трее вылезло сообщение о нехватке памяти. Только тогда понял, что рекурсивно ссылаться здесь не нужно, только не знаю как по другому сделать.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сделать fullscreen -=1100=- Общие вопросы Javascript 8 30.07.2012 09:53
Многостраничная галерея на lightbox.js Как сделать? MASTER Общие вопросы Javascript 9 24.07.2009 14:38
Вопрос как сделать эту панельку Определённых размеров и свойств. jei jQuery 3 09.06.2009 19:14
Как сделать электронный каталог продукции? natarius Серверные языки и технологии 6 24.05.2009 20:56
Как сделать, чтобы 2 ссылки отображались как hover при наведении мышкой на любую? Ava Элементы интерфейса 5 19.05.2009 23:24