更新された質問:
次の図に示すように、イベントをタイムラインに表示したいと考えています。
イベント データ項目には「開始時間」と「長さ」の 2 つの属性があるため、データは次のようなテーブルとして想像できます。
event name | start | length
-----------+-------+-------
1 | 0 | 200
1.1 | 30 | 100
1.1.1 | 40 | 50
1.2 | 140 | 50
2 | 205 | 100
2.1 | 220 | 20
2.2 | 250 | 20
2.3 | 280 | 20
... | ... | ...
データにはいくつかの特徴があります。
- イベント名は任意です (ここでの番号は説明のためのものです)
- 別のイベントの境界内で開始および終了するイベントは、それらの子イベントです。
→上の表の「1.1」は「1」の子イベントになります。 - 子供は子イベントを持つことができます。
次のようにイベントが重複することはありません…</p>
+---------+ +---------+ | A | | C | +---------+ +---------+ +---------+ or +---------+ | B | | D | +---------+ +---------+
…B は A の子になりますが、A が終了する前に終了する必要があるためです。C は D 内で始まるので、D は C の親になります (そして C の上に表示する必要があります) が、A と B の場合と同じ問題があります。
- 明示的なネスティング情報は利用できませんが、暗黙的なネスティング情報は開始時間と長さによって提供されます。
- イベントは開始時刻の昇順で並べ替えられます。
したがって、イベントを表示する方法は 1 つだけです。
現在、私はこのようにしようとしています: x 位置は で設定されてmargin-left
いますが、他の属性も問題ありません。s は、div
x 値によって並べ替えられます。
<div class="container">
<div class="item" style="margin-left:0; width: 200px;">
1
</div>
<div class="item" style="margin-left:30px; width: 100px;">
1.1
</div>
<div class="item" style="margin-left:40px; width: 50px;">
1.1.1
</div>
<div class="item" style="margin-left:140px; width: 50px;">
1.2
</div>
<div class="item" style="margin-left:205px; width: 100px;">
2
</div>
<div class="item" style="margin-left:220px; width: 20px;">
2.1
</div>
<div class="item" style="margin-left:250px; width: 20px;">
2.2
</div>
<div class="item" style="margin-left:280px; width: 20px;">
2.3
</div>
</div>
.container {
padding: 0.5rem 0 1.5rem 0;
background-color: #EEE;
border: 1px solid #888;
overflow-x: auto;
}
.item {
height: 2rem;
margin-bottom: -1rem;
font-size: 60%; font-family: sans-serif;
background-color: #BBB;
border: 1pt solid #EEE;
overflow: hidden;
}
これが現在の結果です (この場合、イベント名は数字ですが、任意の文字列にすることができます):
各行に 1 つだけあるdiv
ため、後続の各行div
はその前の行の下にあります。
要素の y 位置を計算することなく、純粋な CSS でこれを行う方法はありますか?
サンプル コードは、http: //jsfiddle.net/hiddenbit/PvBjt/から入手できます。