我正在尝试建立水平时间表。一个月中的任何一天都有很多事件。
因此,当事件更多时,列表项将无法容纳可用高度(来自:min-height
),并且出现垂直滚动。
如果我尝试删除min-height
的整个内容,则会失真。我希望容器在不进行垂直滚动的情况下占用任何数量的项目。
另外,还有一个问题,当窗口很小(可以在Codepen上看到)时,出现水平滚动(预期和需要)。但是,连接器并未占据整个滚动宽度。
*,
*::before,
*::after {
margin: 0;
padding: 0;
box-sizing: border-box;
}
.timeline__container {
background: #c0ffee;
overflow-x: auto;
display: flex;
position: relative;
}
.timeline__connector {
position: absolute;
width: 100%;
left: 0;
top: calc(50% - 4px);
height: 8px;
background: #ccc;
}
.timeline__item {
background: gold;
min-width: 85px;
min-height: 200px;
display: flex;
flex-direction: column;
justify-content: center;
}
.timeline__item:nth-child(2n) {
flex-direction: column-reverse;
}
.timeline__up {
height: 100%;
display: flex;
align-items: center;
justify-content: center;
}
.timeline__down {
height: 100%;
display: flex;
}
.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 {
height: 100%;
}
.timeline__event__list ul {
margin-left: 20px;
}
<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>
Codepen相同
答案 0 :(得分:7)
我想出了一个将 flex 和 grid 结合起来以实现您想要的东西的想法。
添加了一个片段,我试图保持代码尽可能整洁,在其中一些注释上添加了注释,以便代码可以自己说话。根本没有改变DOM结构。 但是,等等,
另外,还有一个问题,当窗口很小(可以在Codepen上看到)时,出现水平滚动(预期和需要)。但是,连接器并未占据整个滚动宽度。
为解决上述问题,我将.timeline__container
包裹在.timeline__wrapper
中。从position: relative;
中删除了.timeline__container
。
并将position: relative;
添加到.timeline__wrapper
。
该代码上有足够的注释,因此当您阅读此代码时,应该能够理解。您可以研究此处使用的网格属性,以了解实际上是如何完成的。
我还在时间轴上/下类中添加了一些填充,以忽略与连接器(或灰线)的视觉冲突
随意添加/删除列表项,以便时间线项的高度增加/减少,您可以检查这是否符合预期。
几乎忘了提及,这在safari上也很好用。
片段摘要:
* {
/* 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>
更新:根据评论在视图中添加了更多项目。
答案 1 :(得分:1)
我发现破坏布局的问题之一是ul
。其容器(即.timeline__up
)应具有自己的滚动条。
.timeline__up {
/* your existing styles... */
overflow: auto;
}
我希望会有所帮助。
答案 2 :(得分:1)
min-height
不考虑水平滚动轨道的高度。
因此 min-height + height of horizontal scroll = vertical overflow
。
我不确定您要如何处理此问题,但这有两个想法:
考虑将min-height
规则从项目移至容器,并设置足够高的值以清除滚动轨道。
.timeline__container {
background: #c0ffee;
overflow-x: auto;
display: flex;
position: relative;
min-height: 250px; /* new */
}
OR
请考虑添加一些底部填充以解决该问题。
.timeline__container {
background: #c0ffee;
overflow-x: auto;
display: flex;
position: relative;
padding-bottom: 10px; <--- add this
}
但是,此方法导致出现较大容器的背景色。如果您可以匹配它们,请在上面的代码中切换到background-color: gold
。
在第二个问题中,分隔线在视口边缘处被截断,这也是一个棘手的问题。您可能需要使用JavaScript作为解决方案。