我正在研究自定义时间轴功能,但我一直在研究如何在边缘情况下解决我想要的特定定位问题。
在下面的代码片段中,我有 3 个时间轴用于演示:
- 第一个是包含许多事件的时间表。时间线应该溢出那些不适合的。这由
li
的给定min-width
决定。 - 第二个和第三个事件很少。此处的定位需要使它们彼此之间的间距相等。
我还希望第一个和最后一个事件分别拉到左边和右边,而不是居中。
我目前拥有的:
每个元素的宽度是根据事件的数量计算的。 min-width
属性防止尺寸变得太小。溢出是有意的。
我想我可以通过使用 left/right: XX %
左右拉动它们来解决第一个和最后一个事件的间距问题,但这些元素的行为似乎就像它们是绝对定位的一样.我还尝试了 float
以及使用固定宽度并通过 margin
控制宽度,但这也没有用。
.timeline-container {
overflow: hidden;
position: relative;
margin: 20px 0;
}
.timeline-container ol {
list-style: none;
width: 100%;
height: 2px;
white-space: nowrap;
margin: 30px 0 0;
padding: 0;
background: #EEE;
display: inline-block;
position: relative;
}
.timeline-container ol li {
display: inline-block;
position: relative;
height: 9px;
min-width: 150px;
}
.timeline-container ol li:before {
content: "";
cursor: pointer;
width: 12px;
height: 12px;
border: 2px solid #3598DC;
display: inline-block;
position: absolute;
bottom: 0;
left: 50%;
transform: translateX(-50%);
background: white;
z-index: 100;
}
.timeline-container ol li a {
position: relative;
bottom: 30px;
display: block;
text-align: center;
padding: 0;
}
<div class="timeline-container">
<ol>
<li style="width: 9.09091%;"><a>Feb 8</a></li>
<li style="width: 9.09091%;"><a>Feb 9</a></li>
<li style="width: 9.09091%;"><a>Feb 11</a></li>
<li style="width: 9.09091%;"><a>Feb 13</a></li>
<li style="width: 9.09091%;"><a>Feb 17</a></li>
<li style="width: 9.09091%;"><a>Feb 18</a></li>
<li style="width: 9.09091%;"><a>Feb 19</a></li>
<li style="width: 9.09091%;"><a>Feb 21</a></li>
<li style="width: 9.09091%;"><a>Feb 22</a></li>
<li style="width: 9.09091%;"><a>Feb 26</a></li>
<li style="width: 9.09091%;"><a>Feb 28</a></li>
</ol>
</div>
<div class="timeline-container">
<ol>
<li style="width: 50%;"><a>Feb 8</a></li>
<li style="width: 50%;"><a>Feb 28</a></li>
</ol>
</div>
<div class="timeline-container">
<ol>
<li style="width: 25%;"><a>Feb 8</a></li>
<li style="width: 25%;"><a>Feb 9</a></li>
<li style="width: 25%;"><a>Feb 11</a></li>
<li style="width: 25%;"><a>Feb 13</a></li>
</ol>
</div>
期望的行为:(注意第一项和最后一项分别减少的左右边距)
最好是纯 css 解决方案,但 javascript 也可以。谢谢。
最佳答案
如果你对使用 flexbox 没问题,它可能看起来像这样:
对于许多时间线元素:
<div class="timeline many">
<div class="timeline__item"></div>
<div class="timeline__item"></div>
<div class="timeline__item"></div>
<div class="timeline__item"></div>
</div>
和 CSS:
.timeline {
display: flex;
flex-direction: row;
}
.many .timeline__item {
flex: 1
}
对于少数元素:
<div class="timeline few">
<div class="timeline__item"></div>
<div class="timeline__item"></div>
<div class="timeline__item"></div>
<div class="timeline__item"></div>
</div>
和 CSS:
.timeline {
display: flex;
flex-direction: row;
}
.few .timeline__item {
justify-content: space-between;
}
对于 IE 支持,您可以使用 Gulp 或 Webpack 等工具为您的样式添加前缀,或者将它们粘贴到此处的在线样式中:https://autoprefixer.github.io/
关于javascript - 在水平时间轴中定位元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42491338/