Как анимировать <tr> открытие / закрытие вверх и вниз с помощью автоматического расчета свойств

У меня есть строка таблицы, которая не отображается до тех пор, пока вы не нажмете кнопку "Просмотр сведений" в строке над ней. В настоящее время я использую *ngIf для отображения второй строки и изменяю логическое свойство связанного объекта при нажатии кнопки "Просмотреть подробности". Я прочитал страницу с анимациями в документации angular2 и попытался реализовать анимацию "свернуть / развернуть", чтобы, когда строка 2-ой таблицы стала видимой, она анимировалась с высоты 0px -> полностью расширенной высоты строки (*px).

Самый близкий пример того, что я хочу сделать, это анимация, которая убрала героя с высоты (* px) до 0px, и он плавно рухнул / скользнул вверх.

animations: [
 trigger('shrinkOut', [
  state('in', style({height: '*'})),
  transition('* => void', [
    style({height: '*'}),
    animate(250, style({height: 0}))
  ])
 ])
]

Я не могу заставить это работать для моей ситуации, описанной выше. Я попробовал это в сочетании с *ngIf, и это не сработало. (Строка просто мгновенно открывается / закрывается, как это было до добавления анимации.) Я попытался избавиться от *ngIf и связать свойство [hidden] безуспешно. Я также попытался удалить *ngIf и [hidden] и просто использовать анимацию, но это тоже не сработало (строка просто оставалась открытой и никогда не закрывалась).

Моя вторая строка таблицы HTML выглядит так:

<tr [@visibilityChanged]="visibility">
      <td  colspan="8" class="details-row">
          ...
      </td>
</tr>

Моя анимация выглядит так:

trigger('visibilityChanged', [
  state('hidden', style({height: '*'})),
  transition('* => void', [
    style({height: '*'}),
    animate(1000, style({height: 0}))
  ])
])

и переменная видимости - это строка в компоненте, которая изменяется с "скрытого" на "показанный" и наоборот, когда нажимается кнопка просмотра сведений.

Возможно ли то, что я пытаюсь достичь с помощью угловой анимации 2?

1 ответ

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

Поэтому добавьте привязки триггера к каждому td следующим образом: (только две ячейки показаны для экономии места)

<tr>
<td class="col3Destination" [@rowVisibleState]="row.isVisible">{{row.version}} 
/td>
<td class="col4Destination" [@rowVisibleState]="row.isVisible">{{row.dataType}}</td>
</tr>

А вот код компонента анимации:

animations: [
        trigger('rowVisibleState',
        [
            state('true',
                style({
                   height: '40px',
                   opacity: 1,
                   fontSize: '14px',
                   display: 'table-row'
                })),

            transition('0 => 1', [
                animate('500ms ease-in', keyframes([
                    style({ display: 'table-row', offset: 0 }),
                    style({ fontSize: 0, offset: 0 }),
                    style({ height: 0, offset: 0 }),
                    style({ opacity: 0, offset: 0.0 }),
                    style({ height: '40px',fontSize: '14px', display: 'table-row', opacity: 1, offset: 1.0 })
                ]))
            ]),
            state('false',
                style({
                    height: '0px',
                    opacity: 0,
                    display: 'none',
                    fontSize: 0
                })),
            transition('1 => 0', [
                animate('500ms ease-out', keyframes([
                    style({ opacity: 1, offset: 0 }),
                    style({ fontSize: '14px', offset: 0 }),
                  style({ height: '40px', offset: 0 }),
                  style({ fontSize: 0, height: 1, opacity: 0.5, offset: 0.9}),
                  style({ height: '0px', opacity: 1, display: 'none', offset: 1.0 })

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