Alexanevsky
@Alexanevsky
Любительская web-разработка

Как правильно и кроссбраузерно сделать подобную структуру с анимацией?

Здравствуйте!

Чисто технически, ничего сложного, всё очень просто, но интересует максимально правильное решение нижеследующий проблемки.

P.S. Извините за длиннопост с большим количеством графики, но мне кажется, что так моя проблема будет выглядеть нагляднее (для тех, кто лучше воспринимает графику).

Есть четыре блока (жёлтые), находящиеся в одном родителе (зелёный) и стоящие в ряд, у всех фиксированная высота (на примере ширина каждого - 140px, высота - 100px и по 5px с каждой стороны). За ними следует ещё один блок с каким-нибудь контентом (серый). Очень популярная ситуация. Правда, между ними находится кнопочка, с которой связано всё самое интересное.

59783ac6c3394d0189ef8c50023009d8.pngИзображение 1 - Начальное положение

По нажатию на кнопочку должно происходить примерно следующее: блоки должны спускаться вниз так, чтобы по горизонтали был только один блок, а потом должны все:
  1. Выстроится по левой стороне вплотную к линии;
  2. Иметь стопроцентную ширину;
  3. После этого в каждом из блоков расхайдится контент и они перестают быть одинаковой высоты.


При этом, анимация должна быть плавно. Если поэтапно, то выглядеть должно это примерно так:

575b90ee9a5e4bf4af02c367c33aadfa.pngИзображение 2 - Этап первый - блоки спускаются вниз

890a648bc881442591f56977b0f2fca9.pngИзображение 3 - Этап второй - блоки отодвигаются влево

731c4ac2bc2e46dc8c2618793687cd66.pngИзображение 4 - Этап третий - блоки получают стопроцентную ширину

25541fd647214b89822aac7b1d59d17b.pngИзображение 5 - Этап последний - появляется дополнительный контент, высота не фиксирована

Реализацию я вижу следующую. Чтобы блоки в дальнейшем без проблем спускались вниз, они все position: absolute.
Если подробнее (относится к Изображению 1):
.parent {
	position: relative;
	height: 400px;
	width: 600px;
	background: green;
}
.parent .block {
	position: absolute;
	top: 0;
	height: 100px;
	width: 140px;
	background: yellow;
}
.parent .block#block-1 {left: 5px;}
.parent .block#block-2 {left: 155px;}
.parent .block#block-3 {left: 305px;}
.parent .block#block-4 {left: 455px;}


На кнопку вешаем маленький скрипт. Здесь, по сути, есть два варианта, один из которых - при клике повесить на родителя .parent ещё какой-нибудь класс, а потом через transition их все плавно опустить. А ля так (относится к Изображению 2):
.parent.animate {height: 400px; transition: height .2s linear;}

.parent.animate .block {transition: top .2s linear;}
.parent.animate .block#block-2 {top: 100px;}
.parent.animate .block#block-3 {top: 200px;}
.parent.animate .block#block-4 {top: 300px;}


Затем через transition-delay сделать всё так, как показано на Изображениях 3-5.

На пятом изображении контент показываетя посредством снятия display: none; с одно из внутренних блоков. На примере это только текст, на самом деле у меня там могут быть и линии, и ещё какие-то блоки и т.п. И на пятом изображении добавил красные линии для наглядности примера и убрал кнопку за ненадобностью.

А можно не делать посредством добавления класса родителю со всеми вышеописанным танцами, можно сделать всю анимацию в самом JS с добавлением delay() и т.п.

Резюмируя вышесказанное, проблемы у меня такие.
  • Во-первых, как всё-таки лучше делать анимацию? Через добавление класса или в самом JS?
  • Во-вторых, полагаю, что на последнем этапе с блоков надо снять position: absolute, а родителю, как, в прочем, и дочерним блокам, снять фиксированную высоту. В таком случае вариант с добавлением класса родителю сильно всё усложняет, т.е. лучше анимировать всё в самом JS.


Важно ещё то, что ниже всех этих блоков есть ещё какое-то содержание, отображение которого не должно изменяться.

Буду благодарен за любую помощь в устранении данных проблем.

С уважением,
Александр.
  • Вопрос задан
  • 2303 просмотра
Решения вопроса 1
я бы сделал все на js
по клику все блоки едут вниз + меняем высоту родителя, как доехали, второй шаг движение влево до упора, приехали, - меняем высоту с 100px на auto с одновременным изменением высоты родителя, а потом уже можно и position absolute убрать,
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы