|
|
|
const TIME_TO_FILL_FPRINT = 2000; //ms
|
|
|
|
const $fprintPaths = document.querySelectorAll('.demo__fprint-path');
|
|
const $endingPaths = document.querySelectorAll('.demo__ending-path');
|
|
const fprintPathSelector = '.demo__fprint-path';
|
|
let fprintPaths = [];
|
|
let lastRafCallTimestamp = 0;
|
|
let curFprintPathsOffset = -1;
|
|
let fprintProgressionDirection = 1;
|
|
let isFprintAnimationInProgress = false;
|
|
let isFprintAnimationOver = false;
|
|
let fprintTick = 0;
|
|
let currentFprintProgresss = 0;
|
|
function offsetAllFprintPaths(ratio) {
|
|
fprintPaths.forEach(path => path.offset(ratio));
|
|
}
|
|
function fprintFrame(timestamp) {
|
|
if (!lastRafCallTimestamp) {
|
|
lastRafCallTimestamp = timestamp;
|
|
window.requestAnimationFrame(fprintFrame);
|
|
return;
|
|
}
|
|
let diff = timestamp - lastRafCallTimestamp;
|
|
fprintTick = (diff / TIME_TO_FILL_FPRINT) * 2;
|
|
lastRafCallTimestamp = timestamp;
|
|
curFprintPathsOffset += fprintTick * fprintProgressionDirection;
|
|
offsetAllFprintPaths(curFprintPathsOffset);
|
|
if (curFprintPathsOffset >= -1 && curFprintPathsOffset <= 1) {
|
|
window.requestAnimationFrame(fprintFrame);
|
|
}
|
|
else if (curFprintPathsOffset > 1) {
|
|
curFprintPathsOffset = curFprintPathsOffset - 2;
|
|
offsetAllFprintPaths(curFprintPathsOffset);
|
|
window.requestAnimationFrame(fprintFrame);
|
|
|
|
}
|
|
else if (curFprintPathsOffset < -1) {
|
|
curFprintPathsOffset = curFprintPathsOffset + 2;
|
|
offsetAllFprintPaths(curFprintPathsOffset);
|
|
window.requestAnimationFrame(fprintFrame);
|
|
}
|
|
}
|
|
|
|
function fprintFrameToProcess(timestamp) {
|
|
if (!lastRafCallTimestamp) {
|
|
lastRafCallTimestamp = timestamp;
|
|
window.requestAnimationFrame(fprintFrameToProcess);
|
|
return;
|
|
}
|
|
let diff = timestamp - lastRafCallTimestamp;
|
|
fprintTick = (diff / TIME_TO_FILL_FPRINT) * 2;
|
|
lastRafCallTimestamp = timestamp;
|
|
curFprintPathsOffset += fprintTick * fprintProgressionDirection;
|
|
offsetAllFprintPaths(curFprintPathsOffset);
|
|
if (curFprintPathsOffset >= -1 && curFprintPathsOffset <= currentFprintProgresss - 1) {
|
|
window.requestAnimationFrame(fprintFrameToProcess);
|
|
}
|
|
else if (curFprintPathsOffset > currentFprintProgresss - 1) {
|
|
curFprintPathsOffset = currentFprintProgresss - 1;
|
|
offsetAllFprintPaths(curFprintPathsOffset);
|
|
lastRafCallTimestamp = 0;
|
|
}
|
|
}
|
|
function setFprintProgress(progress) {
|
|
if (progress == 0) {
|
|
curFprintPathsOffset = -1;
|
|
offsetAllFprintPaths(curFprintPathsOffset);
|
|
}else {
|
|
currentFprintProgresss = progress;
|
|
window.requestAnimationFrame(fprintFrameToProcess);
|
|
}
|
|
}
|
|
|
|
class Path {
|
|
constructor(selector, index) {
|
|
this.index = index;
|
|
this.querySelection = document.querySelectorAll(selector)[index];
|
|
this.length = this.querySelection.getTotalLength();
|
|
this.$ = $(selector).eq(index);
|
|
this.setDasharray();
|
|
this.removesForwards = this.$.hasClass('demo__fprint-path--removes-forwards');
|
|
}
|
|
|
|
setDasharray() {
|
|
this.$.css('stroke-dasharray', `${this.length} ${this.length + 2}`);
|
|
return this;
|
|
}
|
|
offset(ratio) {
|
|
this.$.css('stroke-dashoffset', -this.length * ratio );
|
|
return this;
|
|
}
|
|
makeVisible() {
|
|
this.$.css('visibility', 'visible');
|
|
return this;
|
|
}
|
|
}
|
|
$(document).ready(() => {
|
|
for (let i = 0; i < document.querySelectorAll(fprintPathSelector).length; i++) {
|
|
fprintPaths.push(new Path(fprintPathSelector, i));
|
|
fprintPaths[i].offset(-1).makeVisible();
|
|
}
|
|
//window.requestAnimationFrame(fprintFrame);
|
|
})
|