Transition не работает при добавлении класса

CSS Transition работает при добавлении класса, но не при его удалении

Прежде всего, просто хотел упомянуть, что я прочитал эту ветку:

И решение там не работает для меня. У меня есть навигация, которая скрыта, когда браузер находится в пределах небольшой точки останова, и открывается при нажатии на элемент. Щелчок по элементу добавляет класс через jQuery. После открытия есть кнопка закрытия, которая при нажатии удаляет класс. Класс складывается и вычитается, как и ожидалось, но по какой-то причине переход работает только при добавлении класса .open, а не при его удалении. Вот мой код:

CSS (Compass + Sass):

Я здесь довольно тупой. Имейте в виду, что я использую Компас и что первоначальный переход работает как ожидалось.

2 ответа

Как упоминалось в комментариях, проблема в том, что height: 0 сразу же скрывает элемент при удалении класса. Непрозрачность все еще меняется, но вы ее не видите.

К сожалению, поскольку height: auto не является переходным значением, добавление высоты к переходу не поможет. Вы можете сделать это с фиксированной высотой, если вы установите задержку, когда открытый класс отсутствует, но удалите задержку, когда она добавлена.

В качестве альтернативы фиксированному height , если вы не полагаетесь на компоновку элемента при раскрытии, вы можете использовать visibility , который может переходить (ну, вы все равно можете отложить его переходом), тот же метод выше.

Читайте также:  Как настроить окно печати

Однако это означает, что высота элемента всегда будет одинаковой. Если вам нужно, чтобы элемент имел переменную высоту, вы можете использовать JavaScript для вычисления высоты цели и установить его на фиксированную высоту на время анимации.

Попробуйте это, вы просто забыли «» в элементе вашего тела и поместили элементы внутрь () Вот так:

Источник

При добавлении класса анимация с keyframes работает, а при удалении нет, хотя transition задано

В этом примере все достаточно очевидно и отрабатывает правильно

Но мне необходимо усложнить анимацию, как это сделать правильно? При добавлении keyframes анимация отрабатывает только при добавлении класса, а при удалении все происходит без анимации.

Как мне необходимо организовать код, чтобы анимация по клику отрабатывала «в обе стороны»?

2 ответа 2

Анимации (animation), в отличие от переходов (transition), работают только в одну сторону. Переключение направления нормально не поддерживается.

Вообще-то существует свойство animation-direction , но оно не поможет, потому что, если имя анимации не меняется, то элемент продолжает «проигрывать» одну и ту же последовательность. Если изменить направление, то анимация будет всё ещё в завершённом состоянии, и просто изменится конечное значение, которое браузер и применит моментально. И удаление имени анимации animation-name не поможет, потому что в этом случае сбросится и конечное значение, что вас не устроит ( animation-fill-mode у вас both ). Что касается переходов, то они существуют отдельно от анимаций, анимировать одни и те же свойства двумя способами бессмысленно, а свойства переходов на анимации не влияют.

Если хотите анимировать в обе стороны, то нужно использовать или анимации с двумя отдельными @keyframes для каждого направления, или переходы, которые поддерживают изменение направления.

Источник

Почему transition-group не работает?

Ничего вы из массива не удаляете (если только про код не наврали).

Нужно или нет — я без понятия. Вы почему-то предпочли умолчать о том, что пытаетесь сделать.

как это не было удаления, если я «сразу же элемент добавил обратно»?

Vue не выполняет рендеринг сразу же после изменения данных.

С точки зрения js я удалил элемент

Нет. Фильтрация + присваивание удалением не является. Так что никаких домыслов, говорю как есть.

«не работает» — нормальный разговор, если есть конкретный пример

Нет, не нормальный. Ещё раз — задавая вопрос, следует рассказывать, какого поведения вы пытаетесь добиться. Да и «конкретного примера» не было — так, огрызки кода. «Конкретный пример» — это ссылка на песочницу.

Источник

CSS переход не работает по клику

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

Вот скрипка Что не так с кодом?

8 ответов

Вот рабочий результат.

Я изменил несколько вещей:

  1. Я изменил notification-alert на класс, потому что это хорошая практика — использовать классы для переходов CSS, потому что классы представляют разные состояния, в которые ваш элемент будет переходить и переходить.
  2. Кроме того, я добавил новый класс notification-alert—shown , который представляет состояние этого элемента, когда он отображается.
  3. Я использовал jquery для добавления класса notification-alert—shown при нажатии кнопки, чтобы инициировать переход.

Теперь нам нужно объяснить, как работают CSS-переходы:

CSS-переходы работают путем добавления фреймов в различные классы CSS и из них (это хорошая практика). Чтобы осуществить переход, вам нужно как минимум два класса. В данном случае это notification-alert и notification-alert—shown . Эти классы отличаются (т. Е. Имеют конфликтующие свойства) только свойствами transform и opacity .

Так как эти свойства различаются в двух классах, я могу указать CSS для перехода (то есть добавления фреймов между ними) к двум классам при их изменении.

Поэтому, когда я добавляю класс notification-alert—shown , я говорю браузеру добавить кадры для перехода из состояния в новое состояние

И я говорю браузеру, что хочу перевести все другое свойство, добавив all в transition: all . .

Вы также подняли несколько вопросов в комментариях:

Это работает отлично. Но это только эффект затухания. Но почему этот вид анимации не работает? Функция перехода-тайминга: кубический Безье (0,175, 0,885, 0,32, 1,275);

И это заставляет меня думать, что у вас есть небольшое недопонимание относительно свойства transition-timing-function . transition-timing-function не связан с точным перемещением элемента — он касается только того, как запрашиваемый переход применяется во времени. Вы можете узнать больше о свойстве времени перехода здесь .

И вы также попросили еще одну вещь:

Отлично смотрится сейчас! Как я могу исчезнуть через несколько секунд?

Для этого вы можете использовать window.setTimeout для запуска некоторого кода для удаления класса через определенное время.

Я обновил пример, чтобы продемонстрировать.

Вы не можете передать свойство display, оно либо видимое, либо нет, никаких промежуточных шагов. Однако вы можете легко добиться необходимого визуального эффекта с помощью анимированной прозрачности:

Обратите внимание, что вам нужно запланировать запуск фазы анимации в следующем цикле рендеринга, для этого вы можете установить задержку с помощью setTimeout .

Наконец, зачем использовать оба display: none и opacity: 0 ? Что ж, мы не хотим, чтобы пользователь случайно нажал «невидимое» предупреждение, что произошло бы, если бы вы использовали только opacity . Поэтому нам также нужно действительно скрыть предупреждение с помощью display: none (или другим способом, например, отрицательной позицией).

Источник

Как запускать CSS-анимацию при прокрутке страницы

В этом пошаговом руководстве будет рассмотрено создание CSS-анимации с нуля и её включение при скролле (прокрутке вверх-вниз) страницы, когда HTML-элемент находится в поле зрения — видимой части окна, с помощью Intersection Observer API.

Настройка CSS-анимации с помощью ключевых кадров

Начнем с создания CSS-анимации, которая определяется ключевыми кадрами @keyframes .

Анимацию можно назвать как угодно, пусть будет wipe-enter . Здесь HTML-элемент будет увеличиваться в ширину, а затем в высоту.

После того, как определены ключевые кадры, можно использовать анимацию для элемента, установив свойству animation-name название ключевых кадров: wipe-enter . Кроме этого необходимо установить animation-duration — продолжительность анимации и animation-iteration-count — счетчик итераций, указывающий, сколько раз анимация должна воспроизводиться, например — бесконечно.

CSS-класс .square пусть будет заключён в медиа-запрос prefers-reduce-motion: no-preference . Это обеспечит запуск анимации только в том случае, если пользователь не ограничил её и не включил параметр «уменьшить движение» в своей операционной системе.

В этом примере будет анимирован HTML-элемент квадратной формы:

Для CSS-анимации можно использовать сокращённое написание свойства animation , например:

Управление анимацией с помощью CSS-класса

Допустим, не нужно, чтобы анимация воспроизводилась сразу. Воспроизведением анимации можно управлять, добавляя HTML-элементу CSS-класс переключатель только анимации, который не используется для остальной стилизации элемента.

CSS-анимация будет воспроизводиться, когда HTML-элементу будет добавлен CSS-класс .square-animation :

В этом примере CSS-анимация воспроизводится не каждый раз при нажатии на кнопку, а только тогда, когда HTML-элементу будет добавлен CSS-класс .square-animation .

Несмотря на то, что анимация должна показывать появление элемента, элемент отображается и до добавления класса .square-animation . Это сделано для того, чтобы при первой загрузке элемент был виден пользователю, даже если JavaScript заблокирован или не работает.

Добавление CSS-класса, когда элемент появляется при скролле (прокрутке страницы вверх-вниз)

В примере выше была реализована CSS-анимация, которая запускается при добавлении HTML-элементу CSS-класса. Вместо перехвата события нажатия кнопки, для добавления и удаления CSS-класса можно использовать несколько вариантов обнаружения состояния, когда элемент при скролле появляется в видимой части окна.

Вот три способа определить, когда элемент находится в видимой области окна:

  1. Использовать Intersection Observer API
  2. Измерять смещение элемента при скролле страницы
  3. Использовать стороннюю JavaScript-библиотеку, которая реализует №1 или №2

Для базовой анимации с запуском при скролле, оптимально использование Intersection Observer API, потому что он требует меньше кода, удобнее и лучше с точки зрения производительности.

API-интерфейс Intersection Observer позволяет отслеживать момент пересечения одного элемента с другим, и сообщает, когда это происходит. Этот способ идеально подходит для запуска CSS-анимации при скролле страницы. Всё, что нужно знать — когда HTML-элемент пересекается с окном просмотра. Если он пересекается, значит — находится в видимой области окна и в этот момент надо запустить CSS-анимацию.

Intersection Observer API можно рассматривать, как обычный слушатель событий, но с некоторыми дополнительными опциями. Вместо того, чтобы прикреплять прослушивание событий к HTML-элементу, надо заставить наблюдателя отслеживать элемент и его положение на странице.

Начнём с создания наблюдателя и заставим его отслеживать HTML-элемент:

По умолчанию корневым элементом, который будет проверяться на пересечение, является окно браузера, поэтому наблюдателю нужно только сообщить об анимируемом HTML-элементе.

Когда функция обратного вызова (callback) запускается, она возвращает массив записей из целевых (target) элементов, которые были запрошены, а также некоторую дополнительную информацию о них. В функцию всегда будет возвращаться массив, даже если наблюдение ведётся только за одним элементом, как здесь.

В функции обратного вызова можно перебрать массив записей, чтобы указать, что с ними нужно сделать. Каждая запись имеет свойство isIntersecting , которое может быть true или false . Если оно возвращает true , это означает, что элемент находится в видимой области окна (viewport).

Собираем всё вместе. Обратите внимание, что entry — это объект, предоставленный наблюдателем, а entry.target — это фактический элемент, за которым который ведется наблюдение, поэтому именно ему нужно добавить CSS-класс для запуска анимации.

Теперь, когда HTML-элемент пересекает границы окна браузера, ему будет добавлен CSS-класс, который будет воспроизводить анимацию.

Если нужно, чтобы анимация запускалась каждый раз, когда HTML-элемент входит в видимую область окна, необходимо удалять CSS-класс запуска анимации, когда он находится за пределами видимой области окна.

Если элемент при анимации изменяет размер или положение, браузеру может быть сложно решить, находится ли элемент в данный момент в области просмотра или нет. Лучше всего поместить анимируемый элемент в контейнер, который не изменяет размер или положение и использовать его для наблюдения за скролллом.

Теперь надо наблюдать за HTML-элементом c CSS-классом square-wrapper а класс для анимации применять к элементу с классом square , как и прежде. Когда элемент-оболочка находится за пределами видимой области, нужно удалять CSS-класс у элемента .square , чтобы анимация перезапускалась каждый раз, когда элемент появляется в окне при скролле.

Чтобы элемент-оболочку было видно, для примера, ему добавлена пунктирная рамка. Попробуйте прокрутить вверх и вниз документ в окне ниже:

Теперь — порядок! Добавляя и удаляя CSS-класс каждый раз, когда при скролле страницы HTML-элемент входит в область просмотра, запускается CSS-анимация.

Запуск CSS-transition при скролле

Если для анимации используется только один шаг и не требуется применение @keyframes , например, достаточно изменения прозрачности HTML-элемента от 0 до 1, можно использовать CSS-transition вместо CSS-animation.

Метод по сути тот же. Вместо определения ключевых кадров ( @keyframes ) для CSS-класса анимации указаны свойства для transition .

Заставим HTML-элемент появляться, когда он перемещается в видимую область просмотра. Для этого в момент появления в окне при скролле ему надо добавить CSS-класс square-transition . Так пользователь, у которого заблокирован или не загружается JavaScript, должен всё-равно увидеть HTML-элемент в его окончательном состоянии.

Это особенно важно, поскольку анимация начинается с opacity: 0 . Если бы не было настройки CSS-класса square-transition и JavaScript не работал, пользователь вообще не увидел бы HTML-элемент! Но если эффект перехода заключается в том, чтобы что-то исчезло, наверное, это не понадобится делать.

При первом запуске JavaScript нужно удалить CSS-класс, чтобы затем, его можно было добавить обратно, когда действительно нужно запустить transition . Это должно быть сделано вне метода обработки наблюдения за скроллом, желательно в начале JavaScript. Вот полный код:

В этом примере CSS-transition запускается, когда элемент-оболочка при скролле появляется в окне. Если Javascript не запустился, элемент всё-равно будет виден.

Как видите, эту технику можно расширять разными способами, чтобы создать множество эффектов анимации.

Источник

Оцените статью