Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.10.2014, 23:44
Интересующийся
Отправить личное сообщение для mixtape Посмотреть профиль Найти все сообщения от mixtape
 
Регистрация: 19.06.2014
Сообщений: 13

проблема с transition
хочу реализовать анимацию через css transition, но, к сожалению, элемент не анимируется. все передаваемые свойства в объекте opts верны. причём интересная штука: если для finish задать небольшой таймаут, около 10 мс, то всё отлично работает. такое ощущение, что он неуспевает изменять свойства в DOMе, или изменяет в другой последовательности, не в той, в которой директивы указаны в коде. вариант с таймаутом кажется топорным. из-за чего это происходит? и можно это как-то адекватно разрулить?
if(propertyIsSupported("transition")) {
      opts.obj.style.transitionProperty = opts.property;
      opts.obj.style.transitionDelay = opts.delay + "ms";
      opts.obj.style.transitionTimingFunction = "linear";
      opts.obj.style.transitionDuration = opts.duration + "ms";
      opts.obj.style[opts.property] = opts.start + "px";
      opts.obj.style[opts.property] = opts.finish + "px";
    }
Ответить с цитированием
  #2 (permalink)  
Старый 10.10.2014, 00:02
Профессор
Отправить личное сообщение для Sweet Посмотреть профиль Найти все сообщения от Sweet
 
Регистрация: 16.03.2010
Сообщений: 1,618

Это оптимизация браузера. Ты когда css-стили накатываешь, они накапливаются, а применяются по окончанию js-функции. Поэтому нужно вызвать событие пересчёта значений css. Например, можно "дёрнуть" геттер .clientWidth:
<div style="position: relative;">test</div>
<script>

var opts = {
	obj: document.querySelector("div"),
	property: "top",
	delay: 0,
	duration: 1000,
	start: 0,
	finish: 200

}

opts.obj.style.transitionProperty = opts.property;
opts.obj.style.transitionDelay = opts.delay + "ms";
opts.obj.style.transitionTimingFunction = "linear";
opts.obj.style.transitionDuration = opts.duration + "ms";
opts.obj.style[opts.property] = opts.start + "px";
opts.obj.clientWidth;
opts.obj.style[opts.property] = opts.finish + "px";

</script>
Ответить с цитированием
  #3 (permalink)  
Старый 10.10.2014, 01:23
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Если не секрет что мешает задавать стили не в JavaScript а в CSS а на JavaScript просто изменять классы у элемента?
Ответить с цитированием
  #4 (permalink)  
Старый 10.10.2014, 11:07
Интересующийся
Отправить личное сообщение для mixtape Посмотреть профиль Найти все сообщения от mixtape
 
Регистрация: 19.06.2014
Сообщений: 13

Sweet, спасибо.
MallSerg, да не секрет. анимация нужна для hide, show.
во-первых, у height может быть значение auto, явно или неявно заданное, с которым присвоение класса не сработает. а здесь я гарантированно вычисляю высоту средствами js и инлайново присваиваю. кроме того, после анимации она убирается, оставляя в инлайнах только display.
во-вторых, после анимации нужно парсить display с нужным значением. если на hide всё очевидно, то на show определяется нужное значение. придётся создавать в css каждый класс на все случаи, а если завтра выйдет новое значение display, то придётся сново класс добавлять.
в-третьих, каскадность. может для элемента задан высокоприоритетный класс (например, через id), в котором display:block, тогда в классах должен быть !important.
если бы требовалось чисто с анимировать, то так бы и поступил, но здесь немного другая ситуация.
Ответить с цитированием
  #5 (permalink)  
Старый 11.10.2014, 09:30
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Анимация неопределенной высоты и ширины относительно толерантно реализуется через анимацию min-width/min-height. В смысле через дефиниции CSS. Решение ограничено диапазоном возможных вариантов минимумов. Если скажем это 0 тире 500 - все шиколадно, а если 0 - 2000 - то будут лаги. Потому что транзишн шарашит на всем заданном протяжении.
Ответить с цитированием
  #6 (permalink)  
Старый 11.10.2014, 16:54
Аватар для utb
utb utb вне форума
Аспирант
Отправить личное сообщение для utb Посмотреть профиль Найти все сообщения от utb
 
Регистрация: 26.10.2011
Сообщений: 94

Используйте css:
.div {
top:0;
bla: bla;
}
.added {
top: 200px;
transition: top 3s linear;
}


и js (показываю на примере jquery):
$('.class').addClass('added');


Можно или даже нужно использовать css свойство animation. Зависит, что вы хотите сделать
Ответить с цитированием
  #7 (permalink)  
Старый 11.10.2014, 19:09
Профессор
Отправить личное сообщение для kostyanet Посмотреть профиль Найти все сообщения от kostyanet
 
Регистрация: 23.10.2010
Сообщений: 2,718

Я делал меню-гармошку неканонично - расширял ul по щелчку на li. Получалось все просто и красиво. Но именно из-за того что я не знаю сколько там в ul находится дочерних li, вычитал про способ через min-height. В CSS стало быть задается min-height:0 и min-height:600px. По 20 пикселов на item это 30 штук - пока хватает. Проверял и на 1000 и на 2000 - на 2000 уже заметны лаги. Потому что браузер считает до 2000, а по событию отсутствия переполнения расширение останавливается, а он все равно еще считает - анимация лагает.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
CSS3 анимация (transition) Magneto Events/DOM/Window 4 19.12.2014 11:39
Проблема с радио кнопками px379 Общие вопросы Javascript 8 29.07.2013 09:30
Проблема с Popup окном vovuslik jQuery 5 12.06.2010 16:12
Проблема с дизайном после отправки xmlhttprequest, Проблема с дизайном после отправки cyberx AJAX и COMET 3 01.05.2010 17:07
Проблема, в менюшке Большой джо Элементы интерфейса 0 12.07.2009 17:12