Как я делаю анимацию модальных окон

Поделиться
HTML-код
  • Опубликовано: 5 окт 2024

Комментарии • 124

  • @it-sin9k
    @it-sin9k  2 года назад +520

    500 лайков за видео о дебаге анимации в хроме

    • @darkside2436
      @darkside2436 2 года назад +3

      500 лайков на этом видео или на комменте?

    • @it-sin9k
      @it-sin9k  2 года назад +4

      @@darkside2436 на комменте)

    • @vtiunov
      @vtiunov Год назад +1

      Может, 314 лайков хватит? )

    • @it-sin9k
      @it-sin9k  Год назад

      @@vtiunov Нет) я пока другие видео сделаю))

    • @nikolaykasparov8387
      @nikolaykasparov8387 Год назад

      Ждем-с

  • @it-sin9k
    @it-sin9k  2 года назад +378

    500 лайков за видео о CSSTransition

  • @mouse_and_fox
    @mouse_and_fox Год назад +4

    Костыль с useMount и setTimeout тут лишний, CSSTransition и так из коробки может делать mountOnEnter и unmountOnExit - этого достаточно. Лишний useState на animationIn, достаточно сделать просто in={opened}. Лишний CSSTransition, достаточно одного над container'ом, а разные анимации для content и overlay делаются в CSS - .transition-enter .overlay { ... }, .transition-enter .content { ... } и т.д. _Каскадные_ таблицы стилей, ага.
    В общем, перед тем как кого-то пытаться учить, надо бы сначала самому разобраться и подготовить качественный материал, что бы не учить плохому.

    • @it-sin9k
      @it-sin9k  Год назад +5

      Если бы еще пример подготовили, который можно потестировать, было бы вообще замечательно! а то на словах все герои, а как сделать, что то нужно, все перестают отвечать :)

    • @mulfyx
      @mulfyx Год назад +1

      ​@@it-sin9kкое-кто обиделся( а ещё в коде memo лишний, ведь children у нас при каждом рендере будет новый 🤫

  • @bebeto123g
    @bebeto123g 2 года назад +4

    Спасибо! Хоть в работе анимации не требуются, но кейсы полезные) Всем мирного неба над головой)

  • @smith-dev
    @smith-dev 2 года назад +16

    Спасибо за видео! Было бы круто разобрать анимацию перехода между двумя страницами, когда например из какого-то небольшого блока появляется вся страница, обычно так делают в мобильных приложениях. Конечно, чтобы все было синхронизировано с роутером.

    • @it-sin9k
      @it-sin9k  2 года назад +8

      Тема интересная) и браузер вроде движется в эту сторону, чтобы это стало легче, может и сделаю

    • @АлександрОкатьев-р4с
      @АлександрОкатьев-р4с 2 года назад +2

      да ну в целом это довольно просто, если делать в реакте, можно просто задать анимацию при маунте компонентов

    • @it-sin9k
      @it-sin9k  2 года назад +1

      хз, честно говоря так и не пробовал никогда)

    • @smith-dev
      @smith-dev 2 года назад +1

      @@АлександрОкатьев-р4с да это вообще ни разу не просто. Допустим у вас есть компонент на странице, который является шапкой на другой странице. Вы на него кликаете и он разворачивается в полноценную страницу. Как это все анимировать и связать с роутером (чтоб можно было нажать назад хотяб), будет ли это тот же самый компонент в итоге, а если нет, то в какой момент подменять один на другой, в общем нюансов очень много, это не тривиальная задача. Ведь цель не забить гвоздями, а сделать какое универсальное решение.

    • @andreyosipov7806
      @andreyosipov7806 2 года назад

      Для подобных анимаций могу порекомендовать взглянуть на пакет и подход react-flip-toolkit. Сам не пробовал но выглядит грамотно)

  • @Spirtikyss
    @Spirtikyss 2 года назад +2

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

    • @it-sin9k
      @it-sin9k  2 года назад +1

      Чаще всего я Confirm диалоги вставляю в разметку возле кнопки, которая их вызывает. Т.е. делаю "жирную разметку". Это достаточно просто поддерживать, хоть и больше JSX кода

  • @Ramosok
    @Ramosok 2 года назад +3

    Всегда с нетерпением жду от тебя новых видео.

    • @it-sin9k
      @it-sin9k  2 года назад +2

      Я тоже)) радуюсь каждый раз, когда видео уже опубликовано)

  • @pashastrayt8928
    @pashastrayt8928 2 года назад +1

    Daamn... Все было так просто... Я, как посмотрел ролик про порталы, сразу радостно побежал прикручивать туда react transition group с тем же setTimeout. Уже не помню, что у меня там не получилось, но стал ждать этот ролик)
    Спасибо за подробное объяснение, хоть кейс и не особо сложный, иногда можно затупить и в таком случае)))

    • @it-sin9k
      @it-sin9k  2 года назад +3

      Рад, что не зря столько времени потратил на это видео))

    • @Evgeny..
      @Evgeny.. 2 года назад +2

      @@it-sin9k точно не зря

  • @andreiribac6284
    @andreiribac6284 2 года назад +1

    Как всегда просто БОЖЕСТВЕННЫЙ УРОК! Огромное спасибо!

  • @ДмитрийСвиридов-ж8ф

    Лайк !!! Единственное что я изменил бы, так это вместо react-transition-group использовал компонент Phased из библиотеки reCONDITION. Компонент в 50 строчек позволяет отслеживать жизненный цикл и передает в качестве пропа фазы рендеринга. Следовательно получаем тот же самый transition только весом в 200 раз меньше)

  • @ДенисПручковский-ы5ф
    @ДенисПручковский-ы5ф 2 года назад +1

    Спасибо за видео :)
    Вместо setTimeout есть вариант использовать onAnimatinoEnd. Но событие onAnimatinoEnd срабатывает так, что модалка успеет вернуться в исходное состояние. Так что надо в анимации заюзать animation-fill-mode: forwards

  • @fx-ry5iu
    @fx-ry5iu 6 месяцев назад +1

    Спасибо большое, прикольно, что думаешь касательно использования паттерна месседжинг через кастомные ивенты и класса Modal Controller как source of truth. Потом просто передавая управление модальным окном через useImperativeHandler, который является интерфейсом для методов, которые диспатчат кастомные ивенты, что и приводит через несколько слоев абстракции ко всем изменениям. Как-по мне, с точки зрение универсальности и расширяемости, это лучший вариант (еще раз, это не какого-либо рода критика, а вопрос)

    • @it-sin9k
      @it-sin9k  6 месяцев назад

      Спасибо за комментарий) а как Modal получает, какой компонент ему нужно отрисовать?

    • @fx-ry5iu
      @fx-ry5iu 6 месяцев назад

      @@it-sin9kчерез children, все как у вас, только реализовано через шаблоны контроллер и меседжинг для уменьшения зависимостей, увеличения расширяемости и избежания ререндеров (стейт не меняется)

    • @it-sin9k
      @it-sin9k  6 месяцев назад

      а можно пример? как интерфейс всего этого выглядит?

    • @fx-ry5iu
      @fx-ry5iu 5 месяцев назад

      Извините, что не отвечал: не увидел этот комментарий. Сейчас школой занят, как со всем разберусь - загружу код @@it-sin9k

  • @cei_digrey
    @cei_digrey 2 года назад +1

    Вы сами монтажите видео? Очень круто! Особенно временная шкала понравилась.

    • @it-sin9k
      @it-sin9k  2 года назад +1

      Все сами) Все такие комментарии скриню и сбрасываю во внутренний чатик показываю Диме (человек, кто все это рисует и монтирует)

  • @NoName-zh7cc
    @NoName-zh7cc 2 года назад

    Контент - бомба, спасибо!

  • @ВикторОрлянский-я5ц

    Инфа огонь! Спасибо.

  • @go_better
    @go_better 7 месяцев назад

    Офигеть, чувак. Я тебя люблю

    • @it-sin9k
      @it-sin9k  7 месяцев назад

      Добро пожаловать на канал!

  • @denydavydov9290
    @denydavydov9290 2 года назад

    Сталкивался с таким кейсом при работе с модальным окном, когда контент внутри этого модального окна - динамический. И при закрытии окна надо было что то сделать с этим контентом. А так как есть анимация закрытия (т.е. мы будем видеть содержимое, пока длится анимация), то видно, как контет меняется внутри окна. Лечилось добавлением метода doАfterСlosе, который вызвался если и окно закрыто и анимация завершилась.

  • @andreyosipov7806
    @andreyosipov7806 2 года назад +2

    Чтобы не костылить дополнительное состояние animationIn, можно использоват пропы appear и appearActive

    • @it-sin9k
      @it-sin9k  2 года назад

      Я вот с ними игрался. Чет у меня с ними не получилось :( Если демку рабочую сбросите, был бы признателен

    • @andreyosipov7806
      @andreyosipov7806 2 года назад

      @@it-sin9k КОДСЭНДБОКС/s/epic-pare-30g9ry
      Там надо ещё дополнительно флаг appear проставлять, мб про него забыл
      А ещё там не всегда обязательно прокидывать рефы)

    • @YaniaRZ
      @YaniaRZ Год назад

      Да, Я тоже так делала, и кстати без рефов и просто использовала Transition компонент. Не поняла зачем был timeout, так при использовании CSS Transition group и соответствующих пропсов все итак сработает и при открытии и закрытии.
      Жаль, что не увидела видео когда сама делала, никак что-то со стилями, точнее с их переназванием не получалось😅

  • @669pain
    @669pain 2 года назад

    Даёшь видос про дебаггер анимаций в хроме! Спасибо за видос)

  • @_oxios_
    @_oxios_ 2 года назад

    Топ контент. Спасибо!

  • @sergeymild
    @sergeymild Год назад

    Проблема с абстрактным именем Layout в том, что если у тебя он будет не один а десяток, то это усложняет поддержку и приводит к ошибкам импортов, так как приходится внимательнее смотреть что ты импортируешь, а так же если делать переход в Idea в файл кликом по компоненту, тебе будет предложено перейти в кучу всех этих layout и не понятно куда именно, вообщем как по мне имена компонентов должны быть либо уникальные либо все таки говорить где они используются

  • @АлександрОкатьев-р4с
    @АлександрОкатьев-р4с 2 года назад +1

    на мой взгляд можно было обойтись без cssTransition, но чтобы точно сказать - надо самому попробовать с ними и без них

  • @boldureans
    @boldureans 2 года назад

    Не я один, кажется, лайкнул оба комментария. Саша, спасибо за видео!

    • @it-sin9k
      @it-sin9k  2 года назад

      лайки собираются активнее, чем я думал)

    • @boldureans
      @boldureans 2 года назад

      @@it-sin9k пора заранее готовить видео)

    • @it-sin9k
      @it-sin9k  2 года назад +1

      @@boldureans не) пока есть в планах другое видео запилить)

  • @skynetif
    @skynetif 2 года назад +1

    Глобальная константа кмк зло. Т.к. нельзя кастомизировать отдельный попап. Все конечно зависит от задачи, но значение можно передавать в хук useMounted из самого компонента

    • @it-sin9k
      @it-sin9k  2 года назад

      Я уже не пытался покрыть все нюансы, реальные проекты они могут вообще тянуть константу чуть ли не из Remote Config сервисов

    • @skynetif
      @skynetif 2 года назад

      @@it-sin9k Я к тому что глобальные переменные зло ;)

  • @Сергей-о5е7в
    @Сергей-о5е7в 2 года назад

    можно вместо времени анимации в useMount использовать transitionend событие, для переключения mounted

    • @it-sin9k
      @it-sin9k  2 года назад

      мысль хорошая) не подумал)

  • @YaniaRZ
    @YaniaRZ Год назад

    А почему нет clenup и удаления timerID в useEffect, насколько я понимаю, что лучше удалять таймер? Или нет?

  • @fallout407
    @fallout407 Год назад

    Спасибо за ссылку на гитхаб) уже скопипастил себе в UI kit, и зарефакторил на ts) скоро переделаю на css in js (emotion), если кому надо - пишите, могу залить в отдельный репо)

    • @it-sin9k
      @it-sin9k  Год назад

      Ого) круто)

    • @fallout407
      @fallout407 Год назад

      @@it-sin9k Очень круто) Можно будет менять длительность анимации в одной константе) А вообще, делаю это в качестве развлечения) В реальной работе, я бы воспользовался готовым и протестированным npm пакетом)

  • @Elator11777
    @Elator11777 3 месяца назад

    Приветствую, а куда исчезли уроки по трюкам реакт-роутера для попап окон? На медеуме есть статья, но ссылки на видео - приватные. Очень бы хотелось увидеть ваш подход.Заранее благодарю и снимаю шляпу перед автором.

    • @it-sin9k
      @it-sin9k  3 месяца назад

      кажется они уже устарели и задумывался о перезапуске этого плейлиста :)

    • @Elator11777
      @Elator11777 3 месяца назад

      @@it-sin9k Устарели, я делал по вашей статье, роутер начал ругаться, что нельзя так делать. Плиз - перезапустите, по модальным окнам, чтобы контент отображалеся в урле - огонь!

  • @aboba86468
    @aboba86468 2 года назад

    Оффтоп, но про модалки:
    antd, модалка написана так, что она всегда в доме, просто не видна, и вроде бы на это есть свои причины ("так правильнее", но я хз почему)
    Кейс - компонент, в котором в том числе есть модалка, может сильно менять свой внешний вид и состояние модалки по бизнес-логике должно сбрасываться, но этого естессна не происходит. Приходится костылять и обнулять все useState вручную. Проклацали модалку, закрыли её без сохранения, компонент изменил внешний вид (там чет типа таба), но модалка всё ещё с тем же стейтом - приходится обнулять ручками.
    Это норма, такой подход?)

    • @it-sin9k
      @it-sin9k  2 года назад +1

      В следующем видео я как раз дам ответ на ваш вопрос) придется набраться терпения))

  • @levapveeskela4327
    @levapveeskela4327 Год назад

    Синяк, не думал вместо setTimout в useEffect заюзать useTransition, или данный кейс не подходит для отслеживания отложенного состояния?

    • @it-sin9k
      @it-sin9k  Год назад

      Честно говоря, я еще не знаком с этим хуком, надо потестировать как он работает :(

  • @amelianceskymusic
    @amelianceskymusic 2 года назад

    06:33 - а почему вместо ANIMATION_TIME не заюзать иветнлисенер с аніматіонЕнд/транзішнЕнд? Я вроде как-то так делал

    • @it-sin9k
      @it-sin9k  2 года назад

      Хороший комментарий, я особо им не пользовался, но видимо стоит начать) спасибо!

    • @amelianceskymusic
      @amelianceskymusic Год назад

      @@it-sin9k переделывал учебное задание, и вообще все переигралось, заюзал animationend прямо на компоненте

  • @tutnichegonet
    @tutnichegonet 2 года назад

    Привет, хорошее видео)Немного нубский вопрос, а нельзя было сделать просто вот так?
    if(opened) {setTimeout(() => return false), 300)}
    чтобы не делать еще одну переменную для этого?

    • @it-sin9k
      @it-sin9k  2 года назад

      Привет :)
      React так к сожалению не работает)

  • @ash1089
    @ash1089 10 месяцев назад

    Ты завернул модалку в мемо, но пропсом передаёшь функцию без useCallback, есть ли смысл в мемо?

    • @it-sin9k
      @it-sin9k  10 месяцев назад +1

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

  • @pashastrayt8928
    @pashastrayt8928 2 года назад

    По поводу костыля с animationIn: попробовал его убрать, все так же прекрасно работает

    • @it-sin9k
      @it-sin9k  2 года назад +1

      хмм, любопытно. Надо попробовать :)

  • @sweet_keksik
    @sweet_keksik Год назад

    Недавно понадобилось сделать попапы и вспомнил про это видео, неплохо так помогло. Много кода пришлось переписать конечно, но это скорее в плюс мне как начинающему разработчику - больше разобрался в теме и самой либе.
    Но вот столкнулся с проблемой, что при открытии попапа с клавиатуры, фокус остаётся под оверлеем. То есть сначала через таб я должен пробежаться по всем компонентам страницы, а только потом фокус попадает на модалку. Это же и на демке воспроизводится: если открыть первую модалку, а потом нажать tab -> enter, откроется вторая модалка. Есть ли какие - то не слишком костыльные варианты переместить фокус при открытии модалки на неё и как бы заблокировать в пределах разметки с контентом?

    • @it-sin9k
      @it-sin9k  Год назад

      Погуглите такой термин Focus Trap. Это как раз то что вам нужно) я его в видео решил не добавлять, думал отдельное видео сделать, но так и не добрался)

    • @sweet_keksik
      @sweet_keksik Год назад

      ​@@it-sin9k О, это как раз нужная мне тема. Пофиксил эту проблему и теперь модалки вообще огонь. Спасибо большое за ответ :)

  • @lord8360
    @lord8360 2 года назад

    о а я писал фабрику контейнеров для виджетов, как модалку, примерное апи (для ui рендера использовал solidjs, но можно и реакт):
    const AwesomeWidget = createViewWidget({
    variant: Primary(),
    connector: ... , // здесь можно соединить с каким-то стейт-менеджером, например я использовал effector
    plugins: [ClickOutside({ ignoreNodes: [Node1, Node2], events: ['touchstart,' ...] })],
    })
    const ClickOutside = createPlugin({
    creator([ element, config ]) => ({ onMount,(){...}, unMount() {...} }) // тут различная логика
    })
    можно создавать плагины со своими анимациями, блок скролла, dnd
    и с помощью коннектора со стейт-менеджером могу вне ui-части дергать и смотреть открыт виджет (модалка) или нет🙃

    • @it-sin9k
      @it-sin9k  2 года назад

      Выглядит в стиле effector, не похоже на обычный React)

  • @FailValiev
    @FailValiev Год назад

    Папап

  • @LRXAORLOV
    @LRXAORLOV 2 года назад

    Интересно как они сделали не просто дырку через children в element компонента Route, а именную

    • @it-sin9k
      @it-sin9k  2 года назад

      Я все подумываю записать пару видео про новый роутер)

  • @enslit
    @enslit Год назад

    Так, ну-ка проставили лайки на оба коммента! Да и на все что видите на канале)

  • @suspiciouscandy1678
    @suspiciouscandy1678 Год назад

    Перед входом на конференцию будет расположен мобильный призывной пункт с кадыровскими собаками.

  • @alexeyfilippov42
    @alexeyfilippov42 2 года назад

    Синяк расскажи как легко выучить CSS и на чем потренироваться

    • @it-sin9k
      @it-sin9k  2 года назад

      Я честно говоря не знаю источников где хорошо учить. Наверное только html academy. Лучше чем просто много верстать, варианта я не видел)

  • @Вбелом-й3з
    @Вбелом-й3з 2 года назад

    не пиши opend. пиши open, setOpen

  • @alexeyfilippov42
    @alexeyfilippov42 2 года назад

    Эх как сложно джуну мне этого понять:)

    • @videoaudio7669
      @videoaudio7669 2 года назад

      Да он специально так снимает, чтобы было не понятно

    • @it-sin9k
      @it-sin9k  2 года назад

      Сорян) я больше делаю упор на тех кто уже имеет пару лет опыта)

    • @danykdev
      @danykdev 2 года назад

      @@it-sin9k для начинающих и так полон интернет. спасибо вам!

    • @pashastrayt8928
      @pashastrayt8928 2 года назад

      @@videoaudio7669 вы рофлите? Как раз наоборот все максимально подробно объяснено и красиво на монтаже показано

  • @proletarian
    @proletarian 2 года назад

    Вот почему я ничего не обещаю

  • @vitaliynoveles6626
    @vitaliynoveles6626 2 года назад

    Госпаде, ну и наворотил jsx-a) Можно немного легче сделать, вот пример) ruclips.net/video/eS0GL73tkmw/видео.html&ab_channel=ArchakovBlog на 10:20 , не реклама)

    • @izzy7541
      @izzy7541 2 года назад

      Такое кроме как в хэлоу ворлд нельзя делать. Посмотрел бы я на проект где все модалки в доме лежат отрендеренные и без фокус трапа

    • @it-sin9k
      @it-sin9k  2 года назад

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

    • @vitaliynoveles6626
      @vitaliynoveles6626 2 года назад

      @@it-sin9k Окей, понял)

    • @Xelson1337
      @Xelson1337 2 года назад

      @@it-sin9k а какие накладные расходы у лишних DOM деревьев, которых нет в rendering tree?

    • @it-sin9k
      @it-sin9k  2 года назад

      @@Xelson1337 Честно говоря, я не очень понял вопрос. Если чего то нет в рендеринге реакта, это не несет никаких расходов

  • @twelve4244
    @twelve4244 Год назад

    Я не понял за 7 месяцев не набралось 500 лайков Вы че ах там Впадлу вниз спуститься и кликнуть 14 к просмотров Вбите 20 лайков еще зб

    • @twelve4244
      @twelve4244 Год назад

      Эй эй бро Гани видево про дебаг анимации Заждался уже там еще 500 тел ждут (наверно) И если есть возможность раз жуй порядок загрузки CSS JS html в самом дебаге имеется ввиду вкладка performance

    • @twelve4244
      @twelve4244 Год назад

      p.s В курсе что есть другие видео Но после твоих реально становиться понятно А не так что ну типа понял а по факту нх не понял )

  • @Fodintsov
    @Fodintsov 2 года назад +1

    Из этого видео узнал, что ты белорус. )

    • @it-sin9k
      @it-sin9k  2 года назад

      это да) а где в этом видео я спалился?))

    • @Fodintsov
      @Fodintsov 2 года назад

      @@it-sin9k 5:40 )

    • @it-sin9k
      @it-sin9k  2 года назад +1

      а что там не так?) я не понимаю)

    • @Fodintsov
      @Fodintsov 2 года назад +2

      @@it-sin9k "С большего" - только в вашей несмерживаемой ветке русского языка используется это выражение. Четкий маркер. Пока не подводил.

    • @it-sin9k
      @it-sin9k  2 года назад +3

      Лол) и вправду это наша тема) Раскопал в просторах интернета)
      "С бóльшего: в Беларуси употребляется в значении 'в основном'. Заимствование из белорусского языка (з большага). На мой взгляд, оценивается как просторечие."

  • @secondname_lastmane
    @secondname_lastmane Год назад

    @it-sin9k в вашем случае анимация срабатывает только при закрытии модалки

    • @it-sin9k
      @it-sin9k  Год назад

      так при открытии так же есть анимация, там же дэмка есть рабочая