2017-01-18 6 views
4

У меня есть раскрывающийся список, который я хочу, чтобы уменьшающая анимация отображалась, когда раскрывающееся меню открывается и закрывается. У меня есть CODEPEN here с кодом для вашего эксперимента.ng-show не справляется с ng-анимацией для уменьшения масштаба в выпадающем списке

Я замедлил его до 10-секундной анимации (а не конечной скорости, очевидно), чтобы вы могли видеть, что я имею в виду. Элементы уменьшаются с заданной скоростью (10 секунд), но элементы ниже не спускаются до завершения ng-анимации. Это вызывает перекрытие.

Это то, что я в моем HTML

<div class="cnt"> 
    <md-list ng-click="menuIsOpen = 1" layout="row" layout-padding="" class="layout-row" layout-align="start center" flex> 
     <span class="title flex" flex=""> Menu Item</span> 
     <i class="fa fa-chevron-down"></i> 
    </md-list> 
    <div class="sub-menu" ng-show="menuIsOpen===1" ng-animate="'animate'" > 
     <md-menu-item ng-repeat="item in data" > 
      <md-button> 
       <div layout="row" flex=""> 
        <a ui-sref="{{item.link}}"> 
         <p flex=""><i class="fa fa-{{item.icon}}"></i> {{item.title}}</p> 
        </a> 
       </div> 
      </md-button> 
     </md-menu-item> 
    </div> 

    <md-list ng-click="menuIsOpen = 2" layout="row" layout-padding="" class="layout-row" layout-align="start center" flex> 
     <span class="title flex" flex=""> Menu Item 2</span> 
     <i class="fa fa-chevron-down"></i> 
    </md-list> 
    <div class="sub-menu" ng-show="menuIsOpen===2" ng-animate="'animate'" > 
     <md-menu-item ng-repeat="item in data"> 
      <md-button> 
       <div layout="row" flex=""> 
        <a ui-sref="{{item.link}}"> 
         <p flex=""><i class="fa fa-{{item.icon}}"></i> {{item.title}}</p> 
        </a> 
       </div> 
      </md-button> 
     </md-menu-item> 
    </div> 
</div>  

И КСС

.ng-hide-remove { 
    -webkit-animation:2s scaleIn ease; 
    animation:2s scaleIn ease; 
} 

@-webkit-keyframes scaleIn { 
    From { 
     transform-origin: top; 
     -webkit-transform: scaleY(0); 
     -moz-transform: scaleY(0); 
     -ms-transform: scaleY(0); 
     -o-transform: scaleY(0); 
     transform: scaleY(0); 
    } 
    To { 
     transform-origin: top; 
     -webkit-transform: scaleY(1); 
     -moz-transform: scaleY(1); 
     -ms-transform: scaleY(1); 
     -o-transform: scaleY(1); 
     transform: scaleY(1); 
    } 
} 

@keyframes scaleIn { 
    From { 
      transform-origin: top; 
      -webkit-transform: scaleY(0); 
      -moz-transform: scaleY(0); 
      -ms-transform: scaleY(0); 
      -o-transform: scaleY(0); 
      transform: scaleY(0); 
    } 
     To { 
      transform-origin: top; 
      -webkit-transform: scaleY(1); 
     -moz-transform: scaleY(1); 
     -ms-transform: scaleY(1); 
     -o-transform: scaleY(1); 
     transform: scaleY(1); 
    } 
} 

Я по существу пытается воспроизвести ту же анимацию, как в угловом сайте материала видели here

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

Спасибо за помощь.

+0

Не совсем знакомы с угловыми, но демо, которые вы связали с анимированными атрибутами высоты, когда делаете это со шкалой. Кроме того, у вас есть анимация от 0 до 30, что является тем, что удерживает меню и делает его доступным. Он перемещается с высоты от 0 до 30 пикселей во время анимации, и как только класс анимации удаляется, он занимает свое место. –

+0

@SergChernata При настройке этих параметров я все равно не приближаюсь к желаемому эффекту. если я удалю 30px ничего не показывает. Если я изменю его на 100%, он откроется для центра наружу не сверху донизу. Я уверен, что что-то не так. Я не могу понять, что – LOTUSMS

+0

О, я знаю, я не могу заставить его работать либо LOL. Но это потому, что я не знаю, что такое Angular, и я не хочу публиковать вам jquery-решение или что-то случайное :) –

ответ

2

UPDATE:

После Литт битных проб и ошибок я думаю, что я нашел SOLUTION. Если вы анимируете не div вокруг (sub-menu), ваш md-menu-item s, но сам элемент, он будет работать.

Я просто добавил ng-if="menuIsOpen===1" к вашему md-menu-item (удалил ng-show="menuIsOpen===1 от sub-menu) и изменил анимацию следующим образом:

md-menu-item.ng-enter{ 
    -webkit-animation:3s move ease; 
    animation:3s move ease; 
} 

@-webkit-keyframes move { 
    From { 
     margin-bottom:-50px; 
    } 
    To { 
     margin-bottom:0px; 
    } 
} 


@keyframes move { 
    From { 
     margin-bottom:-50px; 
    } 
    To { 
     margin-bottom:0px; 
    } 
} 

Теперь размер каждого элемента в меню анимированы. Я немного обманул margin-bottom, но height все еще не работал.


У меня есть два варианта. (По крайней мере, я не могу придумать ничего более.) Или, может быть, три, см. Выше.

1.You может изменить высоту и добавить transform-origin: top; как здесь:

@keyframes scaleIn { 
    From { 
    transform-origin: top; 
    -webkit-transform: scaleY(0); 
    -moz-transform: scaleY(0); 
    -ms-transform: scaleY(0); 
    -o-transform: scaleY(0); 
    transform: scaleY(0); 
    height: 0px; 
    } 
    To { 
    transform-origin: top; 
    -webkit-transform: scaleY(1); 
    -moz-transform: scaleY(1); 
    -ms-transform: scaleY(1); 
    -o-transform: scaleY(1); 
    transform: scaleY(1); 
    height: 190px; 
    } 
} 

transform-origin С будет масштабироваться от вершины, а не с середины. Но тогда вы должны отрегулировать высоту каждый раз, когда вы меняете количество пунктов меню.

  1. Вы пишете это новое (возможно, не для вас, потому что вы не сильно измените). Я думаю, что есть определенно более простые решения, такие как ваш опубликованный пример. например см. HERE

Только стили отсутствуют и все работает.

Я тоже пытался изменить высоту на%, но это просто никогда не срабатывало. Даже добавьте некоторые div и измените некоторые положения, ничего не происходит. Так что, возможно, у кого-то есть лучшее решение.

+0

A для усилий, но не reeeaaally решение. И я только говорю это, потому что это касается того, как далеко я получил. –

+0

Я знаю, я много пытался выяснить, почему он не работает, но без какого-либо решения. Странно, что он работает только с px, а не с%. Я попробовал его с 'margin-top' вместо' height' и там% работал довольно хорошо. Но в любом случае я действительно не знаю, почему он делает все это настолько сложным. В угловом режиме существует гораздо более легкое решение. (Но, возможно, он нуждается в этом так сложно) Мне любопытно другое лучшее решение! – theoretisch

+0

Я не могу использовать пример, который вы отправили из Plunker, потому что ему нужен Bootstrap, чтобы получить эту функцию краха. Вместо этого в этой системе используется Material Design. Мне не хотелось бы загружать всю структуру только для одной маленькой вещи. – LOTUSMS

2

Надеюсь, я не должен был замедляться, просто получил время, чтобы посмотреть на это должным образом.

Edited Codepen

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

Так что я сделал это изменить классы:

.sub-menu{ 
    background: #333; 
    max-height: 500px; 
    position: relative; 
    display: block; 
    overflow:hidden; 
} 
.sub-menu.ng-hide{ 
max-height: 0; 
} 

.sub-menu.ng-hide-remove { 
    transition: max-height 700ms cubic-bezier(0.35, 0, 0.25, 1); 
} 

.sub-menu.ng-hide-add { 
    transition: max-height 600ms cubic-bezier(0.35, 0, 0.25, 1); 
} 

Они теперь используют transisiton. Также как max-height, а не height, так что для полного отображения значения height значение должно быть дано submenu. Также используйте cubic-bezier для более плавного перехода.

Также я удалил директивы ng-animate="'animate'" на элементы, поскольку он не нужен, это старый способ добавления анимаций. Все классы теперь управляются директивой ng-show и нет директивы ng-animate. current ngAnimate docs может предоставить дополнительную информацию о классах.

Единственное, что было сделано, это переместить ng-show в div с классом submenu, что было просто лишним классом для <ul>.

+0

Я проверяю его на своем телефоне, и пока он выглядит хорошо. Я посмотрю на это дальше, когда доберусь до офиса. Спасибо – LOTUSMS

+0

Выглядит неплохо на рабочем столе! Но мне интересно, если кто-то знает, почему% не работает. Что-то не хватает? – theoretisch

+1

Для того, чтобы проценты работали, в их месте должна быть фиксированная высота. Это означает, что каждому подменю нужен контейнер с фиксированной высотой вокруг него. Таким образом, он может расширяться до 100% этого контейнера с фиксированной высотой. – Callum

 Смежные вопросы

  • Нет связанных вопросов^_^