grid timeline simple (latest)
by ShaCP
HTML
<div id="unit">
</div>
<div id="timeline_container">
<p id="timeline_units"></p>
</div>
CSS
body {
width: 100%;
height: 100vh;
}
* {
box-sizing: border-box;
}
/* #overlay div p {
display: none;
}
#overlay div:hover {
background-color: red;
background-blend-mode: color;
}
#overlay div:hover p {
display: block;
mix-blend-mode: unset;
} */
.timeline_unit::before {
content: "";
position: absolute;
top: 0;
right: 0;
left: 0;
bottom: 0;
background: lightpink;
mix-blend-mode: hue;
z-index: 0;
}
.timeline_unit {
position: relative;
}
.unit_start {
right: 100%;
top: calc(50% - 3em);
}
.unit_end {
left: 100%;
bottom: calc(50% - 3em);
}
/* .timeline_unit::after {
position: absolute;
content: attr(data-unit);
display: inline-block;
} */
#unit {
width: 1vw;
height: 1vw;
background-color: lightskyblue;
}
#unit::before {
margin-left: 1em;
content: "unit";
display: inline-block;
}
#timeline_container {
overflow: auto;
display: inline-grid;
width: calc(100vw - 17px - 16px);
margin-top: 1em;
position: relative;
border-left: 1px solid black;
}
#timeline {
/* margin-top: 1.5em; */
display: inline-grid;
width: max-content;
/* grid-template-rows: 6em; */
height: 8em;
background-color: black;
/* grid-column-gap: 1px; */
--firstAndLastMarksThickness: 2px;
/* border: var(--firstAndLastMarksThickness) solid black; */
border-top: unset;
border-bottom: unset;
/* width: calc(100% + 4em); */
position: relative;
/* grid-gap: 1px; */
}
/* timeline horizontal middle line */
#timeline::before {
width: 100%;
position: absolute;
content: "";
height: 1px;
background-color: black;
top: calc(50% - 0.5px);
pointer-events: none;
z-index: 1;
}
.timeline_segment {
outline: 1px solid black;
background-color: lightskyblue;
position: relative;
/* cursor: pointer; */
}
.duration,
.time,
.unit_start,
.unit_end {
position: absolute;
z-index: 1;
background-color: whitesmoke;
padding: 0 0.5em;
font-size: 0.9rem;
width: max-content;
/* rethink...
JavaScript
/* create timeline */
console.clear();
var timelineLength;
var unitSize = 2;
var singleUnit = unitSize / 100 * window.innerWidth;
console.log(singleUnit, "singleUnit");
(() => {
var times = [0, 1, 3, 10, 25, 39, 40, 40.5];
console.log(times);
times = times.sort(function compareNumbers(a, b) {
return a - b;
});
console.log(times);
var unit = "ms"
var durations = times.reduce((result, time, i) => {
if (!i) {
return result;
}
var preciseDuration = convertBack(convert(time) - convert(times[--i]));
result.actualDurations.push(preciseDuration);
result.durationsWithCustomSize.push(preciseDuration * unitSize);
return result
}, {
actualDurations: [],
durationsWithCustomSize: []
});
var {
actualDurations,
durationsWithCustomSize
} = durations;
/* while ((time -parseFloat(times[--i])) * size < timelineMarkTextWidth) {
console.log(i);
timelineMarkClearance++
} */
console.log(durations);
var gridColumnWidths = durationsWithCustomSize.join("vw ") + "vw"
var timelineSegments = ""; /* times between each time mark */
var lastSegmentIndex = actualDurations.length - 1; /* index of time between last two time marks */
var lastTimeIndex = times.length - 1 /* index of last time mark */ ;
var lengthOfTimeLine = times[lastTimeIndex] - times[0]; /* time from first to last time mark */
var widthOfTimelineMarkText = 32 /* width (px) of text indicating time at mark */ ;
/* make local ? */
/* singleUnit = 0.01 * window.innerWidth this is equal to 1vw */
;
/* DELETE */
timelineLength = lengthOfTimeLine;
/* DELETE END */
actualDurations.forEach((duration, i) => {
console.log(duration);
/* var */
var isLastSegment = i === lastSegmentIndex;
var durationToTheEndInPixels = convertBack(convert(times[lastTimeIndex]) - convert(times[i]));
console.log(durationToTheEndInPixels, "durationToTheEndInPixels", i);
durationToTheEndInPixels =...