Я пытаюсь сделать <ul>
слайд вниз, используя CSS-переходы.
Начало <ul>
начинается в height: 0;
. При наведении высота установлена на height:auto;
. Тем не менее, это заставляет его просто появляться, а не переход,
Если я сделаю это от height: 40px;
до height: auto;
, то он будет скользить вверх height: 0;
, а затем внезапно прыгнет на правильную высоту.
Как еще я могу сделать это без использования JavaScript?
#child0 {
height: 0;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent0:hover #child0 {
height: auto;
}
#child40 {
height: 40px;
overflow: hidden;
background-color: #dedede;
-moz-transition: height 1s ease;
-webkit-transition: height 1s ease;
-o-transition: height 1s ease;
transition: height 1s ease;
}
#parent40:hover #child40 {
height: auto;
}
h1 {
font-weight: bold;
}
The only difference between the two snippets of CSS is one has height: 0, the other height: 40.
<hr>
<div id="parent0">
<h1>Hover me (height: 0)</h1>
<div id="child0">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
<hr>
<div id="parent40">
<h1>Hover me (height: 40)</h1>
<div id="child40">Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>Some content
<br>
</div>
</div>
css
css-transitions
Hailwood
источник
источник
height:auto/max-height
решение будет работать, только если вы расширяете область, которая больше, чемheight
вы хотите ограничить. Если у вас естьmax-height
оф300px
, но выпадающий список со списком, который может вернуться50px
, а затем вамmax-height
не поможет,50px
зависит от количества элементов, вы можете оказаться в невозможной ситуации, когда я не могу это исправить, потому чтоheight
нет Исправлено,height:auto
было решение, но я не могу использовать переходы с этим.Ответы:
Используйте
max-height
в переходе и нетheight
. И установите значение наmax-height
что-то большее, чем ваша коробка когда-либо получит.Посмотрите демонстрацию JSFiddle, предоставленную Крисом Джорданом в другом ответе здесь.
источник
Вместо этого вы должны использовать scaleY.
Я сделал версию вышеуказанного кода с префиксом поставщика на jsfiddle , и изменил ваш jsfiddle, чтобы использовать scaleY вместо height.
источник
В настоящее время вы не можете анимировать по высоте, если используется одна из высот
auto
, вам нужно установить две явные высоты.источник
this.$element[dimension](this.$element[dimension]())[0].offsetHeight
auto
...Решение , которое я всегда был первым Fade Out, а затем сжать
font-size
,padding
иmargin
значения. Это не выглядит так же, как стирание, но работает без статическогоheight
илиmax-height
.Рабочий пример:
источник
*
и применив другие изменения. Однако мой код должен был затронуть кнопки, если они были правильно оформленыem
.line-height: 0;
иborder-width: 0;
line-height
если вы правильно избегаете единиц в значении: developer.mozilla.org/en-US/docs/Web/CSS/…Я знаю, что это тридцатилетний ответ на этот вопрос, но я думаю, что оно того стоит. Это решение только для CSS со следующими свойствами:
transform: scaleY(0)
), поэтому он делает правильные вещи, если после свертываемого элемента есть контент.height: auto
) все содержимое всегда имеет правильную высоту (в отличие, например, если вы выбираете значение,max-height
которое оказывается слишком низко). А в свернутом состоянии высота равна нулю, как и должно быть.демонстрация
Вот демонстрация с тремя складными элементами разной высоты, которые используют один и тот же CSS. Возможно, вы захотите нажать «Полная страница» после нажатия «Запустить фрагмент». Обратите внимание, что JavaScript только переключает
collapsed
класс CSS, здесь нет измерения. (Вы можете сделать эту точную демонстрацию вообще без JavaScript, используя флажок или:target
). Также обратите внимание, что часть CSS, которая отвечает за переход, довольно коротка, и HTML требует только одного дополнительного элемента-оболочки.Как это работает?
На самом деле, есть два перехода, которые делают это возможным. Один из них переводит
margin-bottom
из 0px (в расширенном состоянии)-2000px
в свернутое состояние (аналогично этому ответу ). 2000 здесь - первое магическое число, оно основано на предположении, что ваша коробка не будет выше этой (2000 пикселей кажется разумным выбором).Использование
margin-bottom
одного перехода само по себе имеет две проблемы:margin-bottom: -2000px
он не будет скрывать все - будут видимые элементы даже в свернутом корпусе. Это небольшое исправление, которое мы сделаем позже.Исправление этой второй проблемы - это то, где вступает второй переход, и этот переход концептуально нацеливается на минимальную высоту оболочки («концептуально», потому что мы на самом деле не используем
min-height
свойство для этого; подробнее об этом позже).Вот анимация, которая показывает, как объединение перехода нижнего поля с переходом минимальной высоты, одинаковой длительности, дает нам комбинированный переход от полной высоты к нулевой высоте, которая имеет одинаковую длительность.
Левая полоса показывает, как отрицательное нижнее поле сдвигает нижнюю часть вверх, уменьшая видимую высоту. Средняя полоса показывает, как минимальная высота гарантирует, что в случае свертывания переход не заканчивается досрочно, а в случае растяжения переход не начинается поздно. Правая полоса показывает, как комбинация этих двух элементов приводит к тому, что блок переходит с полной высоты на нулевую высоту за правильное время.
Для моей демонстрации я выбрал 50px в качестве верхнего минимального значения высоты. Это второе магическое число, и оно должно быть ниже, чем высота коробки. 50px кажется разумным; кажется маловероятным, что вы очень часто захотите сделать складной элемент, который не имеет даже 50 пикселей в первую очередь.
Как видно из анимации, результирующий переход является непрерывным, но он не дифференцируем - в момент, когда минимальная высота равна полной высоте, скорректированной по нижнему краю, происходит внезапное изменение скорости. Это очень заметно в анимации, потому что она использует линейную функцию синхронизации для обоих переходов, и потому что весь переход очень медленный. В реальном случае (моя демонстрация вверху) переход занимает всего 300 мс, а переход нижнего поля не является линейным. Я поиграл с множеством различных функций синхронизации для обоих переходов, и те, с которыми я закончил, чувствовали, что они работают лучше всего для самых разных случаев.
Осталось решить две проблемы:
Мы решаем первую проблему, давая элемент контейнера a
max-height: 0
в свернутом случае с0s 0.3s
переходом. Это означает, что это не действительно переход, аmax-height
применяется с задержкой; применяется только после завершения перехода. Чтобы это работало правильно, нам также нужно выбрать числовое значениеmax-height
для противоположного, не свернутого состояния. Но в отличие от случая 2000px, где выбор слишком большого числа влияет на качество перехода, в этом случае это действительно не имеет значения. Таким образом, мы можем просто выбрать число, которое настолько высоко, что мы знаем что никакая высота никогда не приблизится к этому. Я выбрал миллион пикселей. Если вам кажется, что вам может потребоваться поддержка контента высотой более миллиона пикселей, то 1) извините и 2) просто добавьте пару нулей.Вторая проблема - причина, почему мы фактически не используем
min-height
для минимального перехода высоты. Вместо этого::after
в контейнере естьheight
псевдоэлемент с переходом от 50px к нулю. Это имеет тот же эффект, что и amin-height
: он не позволит контейнеру сжиматься ниже той высоты, которую в настоящее время имеет псевдоэлемент. Но поскольку мы используемheight
, а неmin-height
мы теперь можем использоватьmax-height
(снова применяя с задержкой), чтобы установить фактическую высоту псевдоэлемента в ноль после завершения перехода, гарантируя, что, по крайней мере, за пределами перехода, даже небольшие элементы имеют правильная высота. Потому чтоmin-height
это сильнее , чемmax-height
это не будет работать , если мы использовали контейнерmin-height
вместо псевдо-элементаheight
, Как иmax-height
в предыдущем абзаце, для этогоmax-height
также необходимо значение для противоположного конца перехода. Но в этом случае мы можем просто выбрать 50px.Протестировано в Chrome (Win, Mac, Android, iOS), Firefox (Win, Mac, Android), Edge, IE11 (за исключением проблемы с разметкой flexbox с моей демонстрацией, которая не беспокоила отладка) и Safari (Mac, iOS ). Говоря о flexbox, должна быть возможность сделать это без использования flexbox; на самом деле, я думаю, вы могли бы заставить почти все работать в IE7 - за исключением того факта, что у вас не будет переходов CSS, что делает это довольно бессмысленным упражнением.
источник
collapsible-wrapper
имеет абсолютную позицию.overflow: hidden
На родителя требуется для перехода , но препятствует абсолютно позиционируемых элементов.clip-path: polygon(...)
вместоoverflow: hidden
, потому что в отличие от последнего, вы можете переходить первый. В качестве запасного варианта для старых браузеров я использовал дополнительное преобразование масштабирования. См. Комментарий в верхней части github.com/StackExchange/Stacks/blob/develop/lib/css/components/…Вы можете, с небольшим количеством несемантических jiggery-pokery. Мой обычный подход состоит в том, чтобы анимировать высоту внешнего DIV, у которого есть единственный дочерний элемент, который является DIV без стилей и используется только для измерения высоты содержимого.
Хотелось бы просто иметь возможность обойтись без
.measuringWrapper
и просто установить высоту DIV на auto и иметь эту анимацию, но это не похоже на работу (высота устанавливается, но анимация не происходит).Моя интерпретация заключается в том, что для запуска анимации необходима явная высота. Вы не можете получить анимацию по высоте, когда есть высота (начальная или конечная высота)
auto
.источник
max-height
, нет необходимостиauto
, и особенно нет необходимости в Javascript! Просто две простые декларацииmargin-top
(иmargin-bottom
) относятся к ширине, когда она определена в процентах, да, это глупо, но это также объясняет, почему время анимации открытия и закрытия совершенно различно - это то же самое, что вы видите в ответе с самым высоким рейтингом, указывая жесткий максимальная высота Почему это так сложно сделать правильно?Визуальное обходное решение для анимации высоты с использованием CSS3-переходов состоит в том, чтобы вместо этого анимировать отступы.
Вы не совсем получаете эффект полного стирания, но игра со значениями длительности перехода и заполнения должна приблизить вас достаточно близко. Если вы не хотите явно устанавливать высоту / максимальную высоту, это должно быть то, что вы ищете.
http://jsfiddle.net/catharsis/n5XfG/17/ (сброшенный Stephband выше jsFiddle)
источник
Мой обходной путь - перевести max-height в точную высоту содержимого для хорошей плавной анимации, а затем использовать обратный вызов transitionEnd, чтобы установить max-height равным 9999px, чтобы содержимое могло свободно изменять размер.
источник
.stop
решить довольно сложную проблему цикла анимации. Теперь, когда вы анимируете высоту и цвет, но хотите прерывать только анимацию высоты, все становится немного сложнее ... Я понимаю вашу точку зрения.Принятый ответ работает в большинстве случаев, но не очень хорошо работает, когда вы
div
можете сильно различаться по высоте - скорость анимации не зависит от фактической высоты содержимого и может выглядеть нестабильно.Вы по-прежнему можете выполнять фактическую анимацию с помощью CSS, но вам нужно использовать JavaScript для вычисления высоты элементов, а не пытаться использовать
auto
. JQuery не требуется, хотя вам, возможно, придется немного изменить его, если вы хотите совместимости (работает в последней версии Chrome :)).источник
document.getElementById('mydiv')
или$('#mydiv').get()
), и функция переключается между скрытием / показом его. Если вы установили CSS-переходы, элемент будет анимирован автоматически.min-height
как в ожидаемом ответе, вызывает проблемы со скоростью анимации, когда размер списка может сильно варьироваться).Было мало упоминания о
Element.scrollHeight
свойстве, которое может быть полезно здесь и все еще может использоваться с чистым переходом CSS. Свойство всегда содержит «полную» высоту элемента, независимо от того, переполняется ли его содержимое в результате свернутой высоты (напримерheight: 0
).Таким образом, для
height: 0
(эффективно полностью свернутого) элемента его «нормальная» или «полная» высота все еще легко доступна через егоscrollHeight
значение (неизменно длину в пикселях ).Для такого элемента, предполагая, что он уже настроен на переход, как, например, (с использованием
ul
оригинального вопроса):Мы можем запустить желаемое анимированное «расширение» высоты, используя только CSS, что-то вроде следующего (здесь предполагается, что
ul
переменная ссылается на список):Вот и все. Если вам нужно свернуть список, подойдет любое из двух следующих утверждений:
Мой конкретный вариант использования вращался вокруг анимации списков неизвестной и часто значительной длины, поэтому мне было неудобно останавливаться на произвольной «достаточно большой»
height
илиmax-height
спецификации и рисковать обрезанным контентом или контентом, который вам вдруг нужно прокрутить (еслиoverflow: auto
, например) , Кроме того, ослабление и синхронизация нарушаются с помощьюmax-height
решений на основе, потому что используемая высота может достичь своего максимального значения гораздо раньше, чем потребуется дляmax-height
достижения9999px
. И с ростом разрешения экрана длина пикселей, как будто9999px
оставляет неприятный вкус во рту. Это частное решение, на мой взгляд, решает проблему элегантно.Наконец, здесь есть надежда, что будущие пересмотры авторов CSS-адресов должны делать такие вещи еще более элегантно - пересмотреть понятие «вычисленные» против «используемых» и «разрешенных» значений и рассмотреть, должны ли переходы применяться к вычисляемым значения, включая переходы с
width
иheight
(которые в настоящее время получают специальную обработку).источник
Element.scrollHeight
свойства требует JavaScript, и, как ясно указывает вопрос, они хотят сделать это без JavaScript.Используйте
max-height
с разным переходом замедления и задержки для каждого состояния.HTML:
CSS:
Смотрите пример: http://jsfiddle.net/0hnjehjc/1/
источник
999999px
. Это, с другой стороны, сместит вашу анимацию, потому что кадры рассчитываются из этого значения. Таким образом, у вас может получиться анимация «задержки» в одном направлении и действительно быстрый конец в другом направлении (corr: сроки-функции)Нет жестко закодированных значений.
Нет JavaScript.
Нет приближений.
Хитрость заключается в использовании скрытого и дублированного
div
чтобы браузер понял, что означает 100%.Этот метод подходит всякий раз, когда вы можете дублировать DOM элемента, который хотите анимировать.
источник
transform: scaleY(1)
, так как этот переход не удаляет пространство.Когда я публикую это, уже есть более 30 ответов, но я чувствую, что мой ответ улучшается по уже принятому ответу Джейка.
Я не был удовлетворен проблемой, которая возникает из-за простого использования
max-height
и переходов CSS3, так как, как отмечали многие комментаторы, вы должны установить вашеmax-height
значение очень близко к фактической высоте, иначе вы получите задержку. Смотрите это JSFiddle для примера этой проблемы.Чтобы обойти это (пока еще не используя JavaScript), я добавил еще один элемент HTML, который
transform: translateY
переводит значение CSS.Это означает, что оба
max-height
иtranslateY
используются:max-height
позволяет элементу нажимать на элементы ниже него, в то время какtranslateY
дает "мгновенный" эффект, который мы хотим. Проблема сmax-height
до сих пор существует, но ее влияние уменьшается. Это означает, что вы можете установить гораздо большую высоту для вашегоmax-height
значения и меньше беспокоиться об этом.Общее преимущество заключается в том, что при переходе обратно (обвале) пользователь сразу видит
translateY
анимацию, поэтому не имеет значения, сколько времениmax-height
занимает.Решение как скрипка
источник
translateY
дальше,scale
потому что мне не нравилось, какscale
давал этот эффект сжатия.Итак, я думаю, что придумал очень простой ответ ... нет
max-height
, используетrelative
позиционирование, работает надli
элементами и является чистым CSS. Я не тестировал ничего, кроме Firefox, хотя, судя по CSS, он должен работать во всех браузерах.FIDDLE: http://jsfiddle.net/n5XfG/2596/
CSS
HTML
источник
РЕДАКТИРОВАТЬ: Прокрутите вниз, чтобы получить обновленный ответ.
Я делал выпадающий список и видел этот пост ... много разных ответов, но я тоже решил поделиться своим выпадающим списком, ... Он не идеален, но по крайней мере он будет использовать только css для падать! Я использовал transform: translateY (y) для преобразования списка в представление ...
Вы можете увидеть больше в тесте
http://jsfiddle.net/BVEpc/4/
Я поместил div позади каждого li, потому что мой выпадающий список идет вверх, и чтобы показать их правильно, это было необходимо, мой код div:
и зависание это:
и потому, что ul ul установлен на содержимое, которое он может получить поверх содержимого вашего тела, поэтому я сделал это для ul:
и зависать:
второй раз после перехода задерживается, и он будет скрыт после того, как мой выпадающий список был закрыт анимацией ...
Надеюсь, позже кто-нибудь получит выгоду от этого.
РЕДАКТИРОВАТЬ: Я просто не могу поверить, что на самом деле люди используют этот прототип! это выпадающее меню только для одного подменю и все !! Я обновил лучшее, которое может иметь два подменю для направления ltr и rtl с поддержкой IE 8.
Fiddle for LTR
Fiddle for RTL,
надеюсь, кто-то найдет это полезным в будущем.
источник
Вы можете перейти с высоты: 0 на высоту: автоматически, при условии, что вы также указали минимальную высоту и максимальную высоту.
источник
Решение Flexbox
Плюсы:
Минусы:
Он работает так, что всегда имеет flex-based: auto для элемента с содержимым, а вместо этого переходят flex-grow и flex-shrink.
Редактировать: Улучшенный JS Fiddle вдохновлен интерфейсом Xbox One.
JS Fiddle
источник
Расширяя ответ @ jake, переход будет проходить до максимального значения высоты, вызывая очень быструю анимацию - если вы установите переходы для обоих: hover и off, вы можете затем контролировать сумасшедшую скорость немного больше.
Таким образом, li: hover - это когда мышь входит в состояние, а затем переходом свойства non-hovered будет отпуск мыши.
Надеюсь, это поможет.
например:
Вот скрипка: http://jsfiddle.net/BukwJ/
источник
Я думаю, что я нашел действительно твердое решение
ХОРОШО! Я знаю, что эта проблема так же стара, как Интернет, но я думаю, что у меня есть решение, которое я превратил в плагин, называемый мутант-переход . Мое решение устанавливает
style=""
атрибуты для отслеживаемых элементов всякий раз, когда происходит изменение в DOM. конечный результат заключается в том, что вы можете использовать хороший оле CSS для ваших переходов и не использовать хакерские исправления или специальный javascript. Единственное, что вам нужно сделать, это установить, что вы хотите отслеживать с помощью соответствующего элементаdata-mutant-attributes="X"
.Это оно! Это решение использует MutationObserver для отслеживания изменений в DOM. Из-за этого вам не нужно ничего настраивать или использовать javascript для ручной анимации. Изменения отслеживаются автоматически. Однако, поскольку он использует MutationObserver, он будет переходить только в IE11 +.
Скрипки!
height: auto
кheight: 100%
height: auto
при добавлении детейисточник
Вот способ перехода с любой начальной высоты, включая 0, на автоматический (полноразмерный и гибкий), не требующий жесткого набора кода для каждого узла или любого пользовательского кода для инициализации: https://github.com/csuwildcat / переход-авто . Я считаю, что это в основном святой Грааль для того, что вы хотите -> http://codepen.io/csuwldcat/pen/kwsdF . Просто вставьте следующий JS-файл на свою страницу, и все, что вам нужно после этого сделать, это добавить / удалить один логический атрибут
reveal=""
- из узлов, которые вы хотите расширить и сжать.Вот все, что вам нужно сделать как пользователь, как только вы включите блок кода, найденный под примером кода:
Вот блок кода, который нужно включить в вашу страницу, после этого все будет просто:
Перетащите этот файл JS на свою страницу - все это просто работает ™
/ * Код для высоты: авто; переход * /
/ * Код для ДЕМО * /
источник
clip
качестве своего фиктивного триггера свойства, и по какой-то причине IE прекратил разрешать анимацию клипа. Я переключился на прозрачность, и все снова работает: codepen.io/csuwldcat/pen/FpzGa . Я обновил код в ответе, чтобы соответствовать.Ответ Джейка на анимацию максимальной высоты великолепен, но я обнаружил, что задержка, вызванная установкой большой максимальной высоты, раздражает.
Можно переместить сворачиваемое содержимое во внутренний div и вычислить максимальную высоту, получив высоту внутреннего div (через JQuery это будет externalHeight ()).
Вот ссылка на jsfiddle: http://jsfiddle.net/pbatey/duZpT
Вот jsfiddle с минимально необходимым количеством кода: http://jsfiddle.net/8ncjjxh8/
источник
Я понимаю, что эта ветка стареет, но в некоторых поисках Google она занимает высокое место, поэтому я считаю, что ее стоит обновить.
Вы также просто получаете / устанавливаете собственную высоту элемента:
Вы должны выбросить этот Javascript сразу после закрывающего тега target_box во встроенном теге скрипта.
источник
Я был в состоянии сделать это. У меня есть
.child
&.parent
div. Дочерний элемент отлично вписывается в ширину / высоту родителя сabsolute
позиционированием. Затем я анимируюtranslate
свойство, чтобыY
уменьшить его значение100%
. Его очень плавная анимация, никаких сбоев и недостатков, как у любого другого решения.Как то так, псевдокод
Вы бы указать
height
на.parent
, вpx
,%
или оставить какauto
. Этот div затем маскирует.child
div, когда он скользит вниз.источник
Я опубликовал ответ с некоторым JavaScript и получил отрицательное голосование, поэтому был раздражен и попробовал снова, и взломал его только с помощью CSS!
Это решение использует несколько «техник»:
padding-bottom:100%
«hack», где проценты определены в терминах текущей ширины элемента. Подробнее об этой технике.В результате мы получаем эффективный переход с использованием только CSS и единой функции перехода для плавного достижения перехода; Святой Грааль!
Конечно, есть и обратная сторона! Я не могу понять, как контролировать ширину, на которой содержимое обрезается (
overflow:hidden
); из-за взлома padding-bottom, ширина и высота тесно связаны между собой. Хотя может быть способ, так что вернемся к нему.https://jsfiddle.net/EoghanM/n1rp3zb4/28/
источник
input[type="checkbox"]:checked
вместо»,:hover
если хотите (то есть вы не хотите использовать JavaScript для добавления классов)Вот решение, которое я только что использовал в сочетании с jQuery. Это работает для следующей структуры HTML:
и функция:
Затем вы можете использовать функцию щелчка, чтобы установить и удалить высоту, используя
css()
CSS:
источник
Я недавно перешел
max-height
наli
элементы, а не упаковкуul
.Смысл заключается в том , что задержка для малого
max-heights
гораздо менее заметна (если вообще) по сравнению с большимmax-heights
, и я также могу установить моеmax-height
значение относительноfont-size
из ,li
а не какого - то произвольного огромного числа с помощьюems
илиrems
.Если у меня размер шрифта
1rem
, я установлюmax-height
для него что-то вроде3rem
(для размещения обернутого текста). Вы можете увидеть пример здесь:http://codepen.io/mindfullsilence/pen/DtzjE
источник
Я не прочитал все подробно, но у меня недавно была эта проблема, и я сделал следующее:
Это позволяет вам иметь div, который сначала отображает содержимое до 200px высоты, а при наведении его размер становится как минимум таким же высоким, как и все содержимое div. Div не становится 3000px, но 3000px - это предел, который я навязываю. Убедитесь, что у вас есть переход на non: hover, иначе вы можете получить странный рендеринг. Таким образом,: hover наследуется от non: hover.
Переход не работает с px на% или на auto. Вам нужно использовать ту же единицу измерения. Это прекрасно работает для меня. Использование HTML5 делает его идеальным ....
Помните, что всегда есть работа вокруг ...; )
Надеюсь, кто-то найдет это полезным
источник
Решение по максимальной высоте от Джейка хорошо работает, если жестко заданное значение максимальной высоты не намного больше реальной высоты (потому что в противном случае возникают нежелательные задержки и проблемы с синхронизацией). С другой стороны, если жестко закодированное значение случайно не превышает реальную высоту, элемент не откроется полностью.
Следующее решение только для CSS также требует жестко заданного размера, который должен быть больше, чем большинство существующих реальных размеров. Однако это решение также работает, если реальный размер в некоторых ситуациях превышает жестко заданный размер. В этом случае переход может немного подскочить, но он никогда не оставит частично видимый элемент. Таким образом, это решение может также использоваться для неизвестного контента, например, из базы данных, где вы просто знаете, что контент обычно не больше, чем х пикселей, но есть исключения.
Идея состоит в том, чтобы использовать отрицательное значение для margin-bottom (или margin-top для слегка отличающейся анимации) и поместить элемент содержимого в средний элемент с переполнением: hidden. Отрицательное поле элемента содержимого уменьшает высоту среднего элемента.
В следующем коде используется переход на поле margin-bottom от -150px до 0px. Это само по себе работает нормально, если элемент содержимого не превышает 150 пикселей. Кроме того, он использует переход на max-height для среднего элемента от 0px до 100%. Это, наконец, скрывает средний элемент, если элемент содержимого выше 150px. Для максимальной высоты переход используется только для задержки его применения на секунду при закрытии, а не для получения плавного визуального эффекта (и, следовательно, он может работать от 0px до 100%).
CSS:
HTML:
Значение поля margin должно быть отрицательным и максимально приближенным к реальной высоте элемента содержимого. Если оно (абсолютное значение) больше, то возникают такие же проблемы с задержкой и синхронизацией, как и в решениях с максимальной высотой, которые, однако, могут быть ограничены, если размер в жестком коде не намного больше, чем реальный. Если абсолютное значение для margin-bottom меньше, чем реальная высота, переход немного увеличивается. В любом случае после перехода элемент содержимого либо полностью отображается, либо полностью удаляется.
Для получения дополнительной информации см. Мой пост в блоге http://www.taccgl.org/blog/css_transition_display.html#combined_height
источник
Вы можете сделать это, создав обратную анимацию (свернуть) с помощью clip-path.
источник
Это не совсем «решение» проблемы, а скорее обходной путь. Я уверен, что он работает только так, как написано с текстом, но его можно изменить для работы с другими элементами.
Вот пример: http://codepen.io/overthemike/pen/wzjRKa
По сути, вы устанавливаете размер шрифта в 0 и переводите его вместо высоты, или max-height, или scaleY () и т. Д. В достаточно быстром темпе, чтобы высота трансформировалась в то, что вы хотите. Преобразовать фактическую высоту с помощью CSS в auto в настоящее время невозможно, но преобразование содержимого внутри, следовательно, переход размера шрифта.
источник