Angular: анимация пользовательского состояния не работает должным образом

У меня есть два div (родительский и дочерний), и я хочу сделать специальную анимацию на основе настраиваемого состояния (close => open && open => close):

  • когда состояние идет от закрытого => открытого:
    Я хочу, чтобы непрозрачность родительского div изменилась от 0 до 1, а дочерняя по шкале от 0,3 до 1.
  • когда состояние переходит из открытого => закрытого:
    Я хочу, чтобы атрибуты css вернулись к своим исходным значениям (непрозрачность 0 для родительского элемента и масштаб (0,3) для дочернего элемента)

Хорошей новостью является то, что анимация работает должным образом (для обоих div), когда состояние равно => close => open.

Плохая новость заключается в том, что анимация не работает (только для дочернего div), когда состояние меняется с open => close.

Хватит говорить, вот что я сделал:

Просмотр HTML:

<div [@openClose] = "opened ? 'open' : 'close'" class = "parent">
    <div [@animateChild] = "opened ? 'open' : 'close'" class = "child">
     <p>Child content</p>
    </div>
</div>

В компоненте.ts:

@Component({
  selector: 'app-my-component',
  templateUrl: './my.component.html',
  styleUrls: ['./my.component.css'],
  animations: [
    trigger('openClose', [
        state('open', style({
           opacity: 1,
           visibility: 'visible',
        })),
        // when we go from close to open do these steps
        transition('close => open', [
          query(':self', [// animate div itself
              animate('200ms ease-in', style({
                opacity: 1,
                visibility: 'visible',
              }))
          ]),
          query('@animateChild', animateChild())// then animate children (.child)
        ]),

        transition('open => close', [
          query(':self', animate('200ms ease-in')),
          query('@animateChild', animateChild()),
        ]),
    ]),
    trigger('animateChild', [
       state('open', style({ opacity: 1, transform: 'scale(1)' })),
       transition('close => open', [
         animate('100ms ease-out')
       ]),

       transition('open => close', [
         style({ transform: 'scale(0.3)', opacity: 0 }),
         animate('100ms ease-out')
       ])
    ])
  ]
})
export class MyComponent implements OnInit {
  opened: boolean;
  constructor() { }

  ngOnInit() {}

  open(){
    this.opened = true;
  }

  close(){
    this.opened = false;
  }
}

В файле CSS:

.parent{
  width: 100%;
  height: 100vh;
  background: black;
  opacity: 0;/* initialize opacity to 0 for the parent */
}
.child{
   width: 50%;
   background: white;
   transform: scale(0.3);/* initialize scale to 0.3 for the child */
   opacity: 0; /* and opacity to 0 to be invisible when component initialized */
}

Это пример на Stackblitz:
https://stackblitz.com/edit/angular-bjuzyr

Что я здесь сделал не так?

вы можете загрузить пример на stackblitz.com? Я обязательно посмотрю, если смогу взглянуть на рабочий пример.

Tomasz Kula 31.03.2018 10:24

@TomaszKula Я отредактировал свой вопрос со ссылкой на Stackblitz, пожалуйста, посмотрите.

SlimenTN 31.03.2018 10:59
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
0
2
1 105
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Хорошо, я нашел решение:
Мне просто нужно установить стиль состояния close в триггере animateChild:

trigger('animateChild', [
    state('open', style({ opacity: 1, transform: 'scale(1)' })),
    state('close', style({ opacity: 0, transform: 'scale(0.3)' })),// I had to add this line
    transition('close => open', animate('100ms ease-out')),
    transition('open => close', animate('100ms ease-out'))
])
Ответ принят как подходящий

Не могли бы вы попробовать приведенный ниже код анимации:

  animations: [
trigger('openClose', [
    state('open', style({
       opacity: 1,
       visibility: 'visible',
    })),
    state('close', style({
       opacity: 0,
       visibility: 'visible',
    })),
    // when we go from close to open do these steps
    transition('* => *', [
      animate('200ms ease-in'),
    ]),
]),
trigger('animateChild', [
   state('open', style({ opacity: 1, transform: 'scale(1)' })),
   state('close', style({ opacity: 0, transform: 'scale(0.3)' })),
   transition('* => *', [
     animate('100ms ease-out')
   ])
])
]

Спасибо за ответ, но я только что опубликовал свой ответ :), мне просто нужно было добавить эту строку state('close', style({ opacity: 0, transform: 'scale(0.3)' })), в триггер animateChild

SlimenTN 31.03.2018 13:50

Другие вопросы по теме