infuze-ebook
Version:
Interactive eBook UI including navigation, quiz loading, sidebar menu
312 lines (286 loc) • 9.13 kB
JavaScript
import { qs, $log, $on } from "./util";
import EventEmitter from 'events'
import Event from 'events'
export default class Timeline extends Event {
constructor(el, anim) {
super();
//console.log('????????? anim', anim);
this.elementsList = el;
this.animationJson = anim;
this.timeline;
this.status = null;
// Create a new event
//this.timelineStartedEvent = new Event('started');
}
getAnimProp(page, step, prop, defaultVal) {
//console.log('>>>>>>>>> page', page);
//console.log('>>>>>>>>> step', step);
//console.log('>>>>>>>>> prop', prop);
//console.log('getAnimProp: ', step);
//return defaultVal;
try {
//console.log('this.animationJson.screens[page]: ', this.animationJson.screens[page].steps[String(step)][prop]);
let returnValue = this.animationJson.screens[page].steps[String(step)][
prop
];
//if (ret) ret = ret[step];
//if (ret) ret = ret[prop];
//return defaultVal;
return returnValue;
} catch (e) {
//console.log('catch: ', e);
return defaultVal;
}
}
startAmnimation() {
//console.log('????????? setAnimations start');
//this.timeline.play();
this.timeline.reverse();
this.timeline.play();
}
replayAnimation() {
this.timeline.restart();
this.timeline.reverse();
}
setup() {
//console.log('????????? setAnimations setup');
let defaultDuration = this.animationJson.params
? this.animationJson.params.defaultDuration
: "300",
defaultType = "slide-left",
defaultOffset = this.animationJson.params
? +this.animationJson.params.defaultOffset
: 100,
nextOffset;
if (!this.elementsList.length) return;
this.timeline = anime.timeline({
//direction: 'reverse',
autoplay: false,
el: 's'
});
this.elementsList.forEach((el, index) => {
el.classList.add("hidden");
let animStep = el.dataset.animate,
animPage = el.pageNumber;
defaultType = "slide-left";
//console.log('*********** el.nodeName: ', el.nodeName);
if (/IMG/.test(el.nodeName)) {
//console.log('*********** el: ', qs('img', el).src);
let img = qs("img", el);
if (el.src) {
let [fileName, ...rest] = el.src.split("/").reverse();
//console.log('*********** fileName: ', fileName);
if (fileName && /^cir-.*\.svg$/.test(fileName)) {
//console.log('*********** CIRCLE: ', fileName);
defaultType = "zoom-out";
}
if (fileName && /^(dia|dec|hex|pen|squ)-.*\.svg$/.test(fileName)) {
//console.log('*********** DIAMOND: ', fileName);
defaultType = "roll-from-right";
}
if (fileName && /^.*\.(jpg|png)$/.test(fileName)) {
//console.log('*********** JPG: ', fileName);
defaultType = "zoom-in";
}
}
}
if (/DIV/.test(el.nodeName)) {
if (el.classList.contains("cell")) {
//defaultDuration = 100;
//defaultOffset = 30;
//el.style.borderColor = "white";
}
}
//document.querySelectorAll('#myDiv img')[0].src
//console.log('animStep: ', animStep);
//console.log('animPage: ', animPage);
//defaultOffset = defaultOffset + 500;
let offset =
el.dataset.offset ||
this.getAnimProp(animPage, animStep, "offset", defaultOffset),
duration =
el.dataset.duration ||
this.getAnimProp(animPage, animStep, "duration", defaultDuration),
type =
el.dataset.type ||
this.getAnimProp(animPage, animStep, "type", defaultType);
nextOffset = nextOffset === undefined ? 0 : (nextOffset += offset);
switch (type) {
case "loop-large-ccw":
this.timeline.add({
targets: el,
opacity: "0",
//translateX: '20em',
rotate: "1turn",
translateX: "800",
easing: "easeInQuad",
//direction: 'reverse',
duration: duration * 2,
offset: nextOffset,
scale: 3
//transformOrigin: "50% 50%"
});
break;
case "loop-large-cw":
this.timeline.add({
targets: el,
opacity: "0",
//translateX: '20em',
rotate: "-1turn",
translateX: "800",
easing: "easeInQuad",
//direction: 'reverse',
duration: duration * 2,
offset: nextOffset,
scale: 3
//transformOrigin: "50% 50%"
});
break;
case "zoom-in":
this.timeline.add({
targets: el,
opacity: "0",
easing: "easeInQuad",
duration: duration,
offset: nextOffset,
scale: 0.5
//transformOrigin: "50% 50%"
});
break;
case "zoom-out":
this.timeline.add({
targets: el,
opacity: "0",
easing: "easeInQuad",
duration: duration,
offset: nextOffset,
scale: el.dataset.scale || 2
//transformOrigin: "50% 50%"
});
break;
case "roll-from-right":
this.timeline.add({
targets: el,
opacity: "0",
translateX: "600",
//translateX: '20em',
rotate: "1turn",
easing: "easeInQuad",
//direction: 'reverse',
duration: duration,
offset: nextOffset
//scale: 4,
//transformOrigin: "50% 50%"
});
break;
case "roll-from-left":
this.timeline.add({
targets: el,
opacity: "0",
translateX: "-400",
//translateX: '20em',
rotate: "1turn",
easing: "easeInQuad",
//direction: 'reverse',
duration: duration,
offset: nextOffset
//scale: 4,
//transformOrigin: "50% 50%"
});
break;
case "slide-left":
this.timeline.add({
targets: el,
opacity: 0,
translateX: "300",
easing: "easeInQuad",
duration: duration,
//direction: 'reverse',
offset: nextOffset
});
break;
case "slide-right":
this.timeline.add({
targets: el,
opacity: 0,
translateX: "-300",
easing: "easeInQuad",
duration: duration,
//direction: 'reverse',
offset: nextOffset
});
break;
case "slide-up":
this.timeline.add({
targets: el,
opacity: 0,
translateY: "300",
easing: "easeInQuad",
duration: duration,
//direction: 'reverse',
offset: nextOffset
});
break;
case "slide-down":
this.timeline.add({
targets: el,
opacity: 0,
translateY: "-300",
easing: "easeInQuad",
duration: duration,
//direction: 'reverse',
offset: nextOffset
});
break;
case "left-roll":
this.timeline.add({
targets: el,
opacity: "0",
//translateX: '20em',
rotate: "2turn",
easing: "easeInQuad",
duration: duration,
//direction: 'reverse',
offset: nextOffset,
scale: 4,
translateX: "350"
/* rotate: {
value: 25,
duration: 2000,
easing: 'easeInOutSine'
} */
});
break;
}
});
console.log("#################### myTimeline this.timeline ", this.timeline);
this.timeline.begin = () => {
console.log("#################### myTimeline begin ");
this.status = 'started';
this.emit('started', 'started');
let wait = setTimeout(() => {
this.elementsList.forEach((el, index) => {
el.classList.remove("hidden");
});
}, 10);
};
this.timeline.complete = (e) => {
$log('timeline.complete ', e)
// TODO
//let wrapper = document.getElementsByClassName("wrapper")[0];
//wrapper.classList.remove('hidden');
//(document.getElementsByClassName("wrapper")[0]).classList.remove('hidden');
console.log("#################### myTimeline complete ");
this.status = 'complete';
this.emit('complete', 'complete');
[].slice
.call(document.getElementsByClassName("cell"))
.forEach(function (elem) {
//elem.classList.add('--bottom-border');
elem.style["border-right-color"] = null;
elem.style["border-left-color"] = null;
elem.style.borderColor = null;
});
};
}
}