|
|
-
- 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);
- })
|