【问题标题】:Positioning of elements in a horizontal timeline在水平时间轴中定位元素
【发布时间】:2017-02-27 16:53:49
【问题描述】:

我正在开发一个自定义时间线功能,但我一直不知道如何在边缘情况下解决我想要的某个定位问题。

在下面的 sn-p 中,我有 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。对于包含许多事件的时间线,将它们全部设置为具有flex: 1 属性将使它们自动均匀间隔,对于少数项目,您可以使用justify-content: space-between 将它们尽可能地间隔开。
  • @Coleman,由于 IE 支持,我仍然对使用 flexbox 有一点偏好,但如果这是唯一可行的解​​决方案,那绝对没问题。关心发布答案吗?谢谢。
  • 你能把设计附在帖子上吗?溢出 x 没有滚动呢?
  • @Chris 当然,我明白了。您可以使用 CSS 自动前缀来帮助解决该问题。它将为 IE 添加必要的属性。我也会发布答案。
  • @Pangloss,你指的是什么设计?隐藏的溢出用于禁用滚动。稍后我将使用 javascript 添加 &lt;&gt; 按钮到“滚动”。但这无关紧要。现在我只希望项目在每种情况下都能很好地对齐(很少或很多项目)。

标签: javascript html css


【解决方案1】:

如果您可以使用 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/

【讨论】:

  • 尚未对此进行测试,但看起来很有希望。不过,我将如何处理造型?时间线事件是从服务器获取的,我无法事先知道要应用哪种样式。我不能做任何逻辑,比如“如果超过 x 个项目,做...否则做..”,因为这会因视口而异。 :/ 需要比这更动态的解决方案。
  • 也许在较小的视口上,您可以切换到不同类型的视图,例如垂直时间轴?无论如何,水平的东西在手机大小的屏幕上不会最有意义。
猜你喜欢
  • 2021-08-08
  • 2021-07-11
  • 1970-01-01
  • 2020-10-18
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2011-09-15
  • 1970-01-01
相关资源
最近更新 更多