У меня есть элемент DOM с некоторыми / всеми из следующих эффектов:
#elem {
-webkit-transition: height 0.4s ease;
-moz-transition: height 0.4s ease;
-o-transition: height 0.4s ease;
transition: height 0.4s ease;
}
Я пишу плагин jQuery, который изменяет размеры этого элемента, мне нужно временно отключить эти эффекты, чтобы я мог плавно изменить его размер.
Каков самый элегантный способ временно отключить эти эффекты (а затем повторно включить их), учитывая, что они могут применяться от родителей или не применяться вообще.
javascript
jquery
css
Сэм Шафран
источник
источник
.notransition
класс. Было бы разумнее сделать это наоборот, то есть нацелиться#elem.yestransition
на css и удалить этот класс. Это устраняет наличие неприятных*
s в вашем css.Ответы:
Короткий ответ
Используйте этот CSS:
Плюс либо этот JS (без jQuery) ...
Или этот JS с JQuery ...
... или эквивалентный код с использованием любой другой библиотеки или фреймворка, с которым вы работаете.
объяснение
Это на самом деле довольно тонкая проблема.
Во-первых, вы, вероятно, захотите создать класс «notransition», который вы можете применить к элементам для установки их
*-transition
атрибутов CSSnone
. Например:(Незначительно, обратите внимание на отсутствие
-ms-transition
там. Вам это не нужно. Первой версией Internet Explorer, которая вообще поддерживала переходы, был IE 10, который поддерживал их без префикса.)Но это просто стиль, и это легко. Когда вы попытаетесь использовать этот класс, вы попадете в ловушку. Ловушка в том, что такой код не будет работать так, как вы могли бы наивно ожидать:
Наивно, вы можете подумать, что изменение высоты не будет анимированным, потому что это происходит, когда применяется класс notransition. В действительности, однако, это будет анимированным, по крайней мере, во всех современных браузерах, которые я пробовал. Проблема заключается в том, что браузер кэширует изменения стиля, которые необходимо внести до завершения выполнения JavaScript, а затем вносит все изменения в одном перекомпоновании. В результате он выполняет перекомпоновку, где нет чистого изменения того, разрешены ли переходы, но есть чистое изменение высоты. Следовательно, он оживляет изменение высоты.
Вы могли бы подумать, что разумным и чистым способом обойти это было бы завершение удаления класса «notransition» за 1 мс, например:
но это также не работает надежно. Я не смог сделать приведенный выше разрыв кода в браузерах WebKit, но в Firefox (как на медленных, так и на быстрых машинах) вы иногда (казалось бы, наугад) будете вести себя так же, как и при использовании наивного подхода. Я предполагаю, что причина этого заключается в том, что выполнение JavaScript может быть достаточно медленным, чтобы функция тайм-аута ожидала выполнения к тому моменту, когда браузер бездействует, и в противном случае могла бы подумать о выполнении оппортунистического перекомпоновки, и если этот сценарий произойдет, Firefox выполняет функцию из очереди до перекомпоновки.
Единственное решение, которое я нашел для этой проблемы, состоит в том, чтобы принудительно перекомпоновать элемент, сбрасывая изменения CSS, внесенные в него, перед удалением класса notransition. Существуют различные способы сделать это - посмотрите здесь для некоторых. Наиболее близким к «стандартному» способу сделать это является чтение
offsetHeight
свойства элемента.Одно из решений, которое действительно работает,
Вот сценарий JS, который иллюстрирует три возможных подхода, которые я описал здесь (как один успешный, так и два неудачных): http://jsfiddle.net/2uVAA/131/
источник
Я бы выступил за отключение анимации в соответствии с предложением DaneSoul, но сделав переключение глобальным:
.notransition
затем может быть применен кbody
элементу, эффективно перекрывая любую анимацию перехода на странице:источник
Добавьте дополнительный класс CSS, который блокирует переход, а затем удалите его, чтобы вернуться в предыдущее состояние. Это делает код CSS и JQuery коротким, простым и понятным.
CSS :
!important
было добавлено, чтобы быть уверенным, что это правило будет иметь больший «вес», потому что идентификатор обычно более специфичен, чем класс.JQuery :
источник
Для чистого решения JS (без CSS-классов) просто установите
transition
в'none'
. Чтобы восстановить переход, указанный в CSS, установитеtransition
пустую строку.Если вы используете префиксы вендоров, вам тоже нужно их установить.
источник
Вы можете отключить анимацию, переход, trasforms для всех элементов на странице с помощью этого кода CSS
источник
Я думаю, что вы могли бы создать отдельный класс CSS, который вы можете использовать в этих случаях:
Тогда в jQuery вы бы переключили класс следующим образом:
источник
Если вам нужно простое решение без jquery для предотвращения всех переходов:
источник
Если вы хотите удалить CSS-переходы, преобразования и анимации с текущей веб-страницы, вы можете просто выполнить этот небольшой скрипт, который я написал (в консоли браузера):
Он использует vanillaJS для загрузки этого css-файла . Здесь также есть репозиторий github на случай, если вы захотите использовать его в контексте скребка (Ruby-Selenium): remove-CSS-animations-repo
источник
делает
в твоих js это убить?
очевидно, повторить для каждого.
источник
Я хотел бы иметь класс в вашем CSS, как это:
а затем в вашем JQuery:
источник
#elem.no-transition
на свой CSS, вы просто нацелились.no-transition
. Возможно, вы хотели написать#elem.no-transition
в своем CSS?