javascript - 在水平时间轴中定位元素

标签 javascript html css

我正在研究自定义时间轴功能,但我一直在研究如何在边缘情况下解决我想要的特定定位问题。

在下面的代码片段中,我有 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>

期望的行为:(注意第一项和最后一项分别减少的左右边距)

enter image description here

最好是纯 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/

相关文章:

html - 为什么 W3C 建议将输入元素包装在 <p> 标签中?

javascript - Jquery 可调整大小仅适用于最近(最后)动态创建的 div

jQuery/HTML/CSS colspan 问题

css - 柔性布局中的 Angular Material 进度微调器大小

javascript - 只有一个 ajax 脚本可以工作,而我有两个

javascript - Ruby on Rails - Javascripts 文件夹

javascript - 自动转到下一个字段 html5 表单

javascript - 使用 sortable.js 时如何在 php 中返回一个新数组

javascript - 标题基于不断变化的图像?

javascript - 当另一个 Div 进入视口(viewport)时让 Div 出现