update line (#1298)
This commit is contained in:
+22
-26
@@ -431,6 +431,7 @@
|
|||||||
var nodes = Array.prototype.slice.call(timeline.querySelectorAll('.timeline-node'));
|
var nodes = Array.prototype.slice.call(timeline.querySelectorAll('.timeline-node'));
|
||||||
var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
var reduceMotion = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
|
||||||
var drawProgress = 0; // 0 to 1, how much of the line is drawn
|
var drawProgress = 0; // 0 to 1, how much of the line is drawn
|
||||||
|
var maxDrawProgress = 0;
|
||||||
var ticking = false;
|
var ticking = false;
|
||||||
|
|
||||||
// Build a rounded-corner path that threads through a list of points.
|
// Build a rounded-corner path that threads through a list of points.
|
||||||
@@ -490,22 +491,6 @@
|
|||||||
comet.style.opacity = 1;
|
comet.style.opacity = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Reveal a node once the drawn line has reached its anchor.
|
|
||||||
function revealNodes() {
|
|
||||||
var len = progress.getTotalLength();
|
|
||||||
var drawnLen = len * drawProgress;
|
|
||||||
nodes.forEach(function (node) {
|
|
||||||
if (node.classList.contains('is-visible')) return;
|
|
||||||
var marker = node.querySelector('.timeline-marker');
|
|
||||||
var r = (marker || node).getBoundingClientRect();
|
|
||||||
var box = timeline.getBoundingClientRect();
|
|
||||||
var pt = { x: r.left - box.left + r.width / 2, y: r.top - box.top + r.height / 2 };
|
|
||||||
// approximate the node's distance along the path
|
|
||||||
var nodeLen = lengthAtPoint(pt, len);
|
|
||||||
if (drawnLen >= nodeLen - 8) node.classList.add('is-visible');
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find roughly how far along the path a point sits (coarse sampling).
|
// Find roughly how far along the path a point sits (coarse sampling).
|
||||||
var _samples = null;
|
var _samples = null;
|
||||||
function lengthAtPoint(target, len) {
|
function lengthAtPoint(target, len) {
|
||||||
@@ -526,23 +511,34 @@
|
|||||||
return best;
|
return best;
|
||||||
}
|
}
|
||||||
|
|
||||||
function clamp(value, min, max) {
|
|
||||||
return Math.max(min, Math.min(max, value));
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateFromScroll() {
|
function updateFromScroll() {
|
||||||
ticking = false;
|
ticking = false;
|
||||||
var len = progress.getTotalLength();
|
var len = progress.getTotalLength();
|
||||||
var rect = timeline.getBoundingClientRect();
|
|
||||||
var viewport = window.innerHeight || document.documentElement.clientHeight;
|
var viewport = window.innerHeight || document.documentElement.clientHeight;
|
||||||
var start = viewport * 0.35;
|
var revealLine = viewport * 0.9;
|
||||||
var end = -rect.height + viewport * 0.45;
|
var targetProgress = maxDrawProgress;
|
||||||
var raw = (start - rect.top) / (start - end);
|
|
||||||
|
|
||||||
drawProgress = clamp(raw, 0, 1);
|
nodes.forEach(function (node, index) {
|
||||||
|
var cardRect = node.getBoundingClientRect();
|
||||||
|
if (cardRect.top > revealLine) return;
|
||||||
|
|
||||||
|
node.classList.add('is-visible');
|
||||||
|
|
||||||
|
var marker = node.querySelector('.timeline-marker');
|
||||||
|
var markerRect = (marker || node).getBoundingClientRect();
|
||||||
|
var box = timeline.getBoundingClientRect();
|
||||||
|
var pt = {
|
||||||
|
x: markerRect.left - box.left + markerRect.width / 2,
|
||||||
|
y: markerRect.top - box.top + markerRect.height / 2
|
||||||
|
};
|
||||||
|
var nodeProgress = index === nodes.length - 1 ? 1 : lengthAtPoint(pt, len) / len;
|
||||||
|
targetProgress = Math.max(targetProgress, nodeProgress);
|
||||||
|
});
|
||||||
|
|
||||||
|
maxDrawProgress = Math.max(maxDrawProgress, targetProgress);
|
||||||
|
drawProgress = maxDrawProgress;
|
||||||
progress.style.strokeDashoffset = len * (1 - drawProgress);
|
progress.style.strokeDashoffset = len * (1 - drawProgress);
|
||||||
updateComet(len);
|
updateComet(len);
|
||||||
revealNodes();
|
|
||||||
if (drawProgress >= 1) {
|
if (drawProgress >= 1) {
|
||||||
comet.style.opacity = 0;
|
comet.style.opacity = 0;
|
||||||
nodes.forEach(function (n) { n.classList.add('is-visible'); });
|
nodes.forEach(function (n) { n.classList.add('is-visible'); });
|
||||||
|
|||||||
Reference in New Issue
Block a user