У меня возникла идея объединить flex и grid для достижения того, что вы ищете.
Добавлен фрагмент кода, и я постарался сохранить код максимально чистым, добавил комментарии к некоторым из них, чтобы код мог говорить сам за себя. Не изменил структуру DOM вообще. Но подождите, посмотрите на это:
Кроме того, есть еще одна проблема: когда окно маленькое (можно увидеть на коде), появляется горизонтальная прокрутка (ожидаемая и необходимая). Но разъем не занимает всю ширину прокрутки.
Чтобы решить вышесказанное, я обернул .timeline__container
в .timeline__wrapper
. удалено position: relative;
из .timeline__container
.
И добавил position: relative;
к .timeline__wrapper
.
В коде достаточно комментариев, поэтому, пройдя через это, вы сможете понять. Вы можете изучить свойства сетки, используемые здесь, чтобы понять, как на самом деле это было сделано.
Также я добавил небольшое отступление на классы шкалы времени вверх / вниз, чтобы игнорировать визуальный конфликт с соединителем (или серой линией)
Не стесняйтесь добавлять / удалять элементы списка, чтобы высота элементов временной шкалы увеличивалась / уменьшалась, и вы можете проверить, соответствует ли это ожиданиям.
Почти забыл упомянуть, это отлично работает и на сафари.
Наконец, фрагмент:
* {
/* you can ignore the pseudo elements here */
margin: 0;
padding: 0;
box-sizing: border-box;
}
.timeline__wrapper {
position: relative;
/* to fix the timeline connector */
}
.timeline__container {
background: #c0ffee;
overflow-x: auto;
/* element with an overflow can't display an absolute positioned element, that's why the wrapper up there */
display: flex;
}
.timeline__connector {
position: absolute;
width: 100%;
left: 0;
top: calc(50% - 4px);
height: 8px;
background: #ccc;
}
.timeline__item {
background: gold;
min-width: 85px;
justify-content: center;
display: grid;
grid-auto-flow: row;
grid-auto-rows: 1fr;
/* this keeps the upper and lower portion same height */
}
.timeline__item:nth-child(2n) .timeline__down {
/* these styles reverses the expected rows */
grid-row-start: 2;
grid-row-end: 1;
}
.timeline__up {
display: flex;
align-items: flex-end;
justify-content: center;
padding: 10px;
}
.timeline__item:nth-child(2n) .timeline__up {
align-items: flex-start;
}
.timeline__down {
display: flex;
align-items: flex-start;
padding: 10px;
}
.timeline__month {
-webkit-transform: rotate(-90deg);
transform: rotate(-90deg);
display: inline-block;
}
.timeline__month-up {
margin-bottom: 20px;
align-self: flex-end;
}
.timeline__month-down {
align-self: flex-start;
margin-top: 20px;
}
.timeline__count {
margin: auto;
}
.timeline__count-up {
margin-bottom: 20px;
}
.timeline__count-down {
margin-top: 20px;
}
.timeline__item-event {
min-width: 180px;
}
.timeline__event__list ul {
margin-left: 20px;
}
<div class="timeline__wrapper">
<div class="timeline__container">
<div class="timeline__connector"></div>
<div class="timeline__item">
<div class="timeline__up">
<div class="timeline__month timeline__month-down">JAN</div>
</div>
<div class="timeline__down">
<div class="timeline__count timeline__count-up">5</div>
</div>
</div>
<div class="timeline__item">
<div class="timeline__up">
<div class="timeline__month timeline__month-up">FEB</div>
</div>
<div class="timeline__down">
<div class="timeline__count timeline__count-down">15</div>
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">5th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>inventore nihil sint est.</li>
<li>Lorem ipsum dolor sit</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
<!-- <div class="timeline__count timeline__count-up">5</div> -->
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">15th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>inventore nihil sint est.</li>
<li>Lorem ipsum dolor sit</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
<div class="timeline__item timeline__item-event">
<div class="timeline__up">
<div class="timeline__event__list">
<div class="timeline__date">25th</div>
<ul>
<li>Lorem ipsum</li>
<li>Lorem ipsum</li>
<li>dolor sit</li>
</ul>
</div>
</div>
<div class="timeline__down">
</div>
</div>
</div>
</div>
Обновление: Добавлено больше элементов для просмотра в соответствии с комментариями.