This repository has been archived on 2020-04-18. You can view files and clone it, but cannot push or open issues or pull requests.
index/pop/js/main.js

230 lines
6.8 KiB
JavaScript

//{
class Details {
constructor() {
this.DOM = {};
const detailsTmpl = `
<div class="details__bg details__bg--down">
<button class="details__close"><i class="fas fa-2x fa-times icon--cross tm-fa-close"></i></button>
<div class="details__description"></div>
</div>
`;
this.DOM.details = document.createElement('div');
this.DOM.details.className = 'details';
this.DOM.details.innerHTML = detailsTmpl;
// DOM.content.appendChild(this.DOM.details);
document.getElementById('tm-wrap').appendChild(this.DOM.details);
this.init();
}
init() {
this.DOM.bgDown = this.DOM.details.querySelector('.details__bg--down');
this.DOM.description = this.DOM.details.querySelector('.details__description');
this.DOM.close = this.DOM.details.querySelector('.details__close');
this.initEvents();
}
initEvents() {
// close page when outside of page is clicked.
document.body.addEventListener('click', () => this.close());
// prevent close page when inside of page is clicked.
this.DOM.bgDown.addEventListener('click', function(event) {
event.stopPropagation();
});
// close page when cross button is clicked.
this.DOM.close.addEventListener('click', () => this.close());
}
fill(info) {
// fill current page info
this.DOM.description.innerHTML = info.description;
}
getProductDetailsRect(){
var p = 0;
var d = 0;
try {
p = this.DOM.productBg.getBoundingClientRect();
d = this.DOM.bgDown.getBoundingClientRect();
}
catch(e){}
return {
productBgRect: p,
detailsBgRect: d
};
}
open(data) {
if(this.isAnimating) return false;
this.isAnimating = true;
this.DOM.details.style.display = 'block';
this.DOM.details.classList.add('details--open');
this.DOM.productBg = data.productBg;
this.DOM.productBg.style.opacity = 0;
const rect = this.getProductDetailsRect();
this.DOM.bgDown.style.transform = `translateX(${rect.productBgRect.left-rect.detailsBgRect.left}px) translateY(${rect.productBgRect.top-rect.detailsBgRect.top}px) scaleX(${rect.productBgRect.width/rect.detailsBgRect.width}) scaleY(${rect.productBgRect.height/rect.detailsBgRect.height})`;
this.DOM.bgDown.style.opacity = 1;
// animate background
anime({
targets: [this.DOM.bgDown],
duration: (target, index) => index ? 800 : 250,
easing: (target, index) => index ? 'easeOutElastic' : 'easeOutSine',
elasticity: 250,
translateX: 0,
translateY: 0,
scaleX: 1,
scaleY: 1,
complete: () => this.isAnimating = false
});
// animate content
anime({
targets: [this.DOM.description],
duration: 1000,
easing: 'easeOutExpo',
translateY: ['100%',0],
opacity: 1
});
// animate close button
anime({
targets: this.DOM.close,
duration: 250,
easing: 'easeOutSine',
translateY: ['100%',0],
opacity: 1
});
this.setCarousel();
window.addEventListener("resize", this.setCarousel);
}
close() {
if(this.isAnimating) return false;
this.isAnimating = true;
this.DOM.details.classList.remove('details--open');
anime({
targets: this.DOM.close,
duration: 250,
easing: 'easeOutSine',
translateY: '100%',
opacity: 0
});
anime({
targets: [this.DOM.description],
duration: 20,
easing: 'linear',
opacity: 0
});
const rect = this.getProductDetailsRect();
anime({
targets: [this.DOM.bgDown],
duration: 250,
easing: 'easeOutSine',
translateX: (target, index) => {
return index ? rect.productImgRect.left-rect.detailsImgRect.left : rect.productBgRect.left-rect.detailsBgRect.left;
},
translateY: (target, index) => {
return index ? rect.productImgRect.top-rect.detailsImgRect.top : rect.productBgRect.top-rect.detailsBgRect.top;
},
scaleX: (target, index) => {
return index ? rect.productImgRect.width/rect.detailsImgRect.width : rect.productBgRect.width/rect.detailsBgRect.width;
},
scaleY: (target, index) => {
return index ? rect.productImgRect.height/rect.detailsImgRect.height : rect.productBgRect.height/rect.detailsBgRect.height;
},
complete: () => {
this.DOM.bgDown.style.opacity = 0;
this.DOM.bgDown.style.transform = 'none';
//this.DOM.productBg.style.opacity = 1;
this.DOM.details.style.display = 'none';
this.isAnimating = false;
}
});
}
// Slick Carousel
setCarousel() {
var slider = $('.details .tm-img-slider');
if(slider.length) { // check if slider exist
if (slider.hasClass('slick-initialized')) {
slider.slick('destroy');
}
if($(window).width() > 767){
// Slick carousel
slider.slick({
dots: true,
infinite: true,
slidesToShow: 4,
slidesToScroll: 3
});
}
else {
slider.slick({
dots: true,
infinite: true,
slidesToShow: 2,
slidesToScroll: 1
});
}
}
}
}; // class Details
class Item {
constructor(el) {
this.DOM = {};
this.DOM.el = el;
this.DOM.product = this.DOM.el.querySelector('.product');
this.DOM.productBg = this.DOM.product.querySelector('.product__bg');
this.info = {
description: this.DOM.product.querySelector('.product__description').innerHTML
};
// console.log(this.info.description)
this.initEvents();
}
initEvents() {
this.DOM.product.addEventListener('click', () => this.open());
}
open() {
DOM.details.fill(this.info);
// console.log(this)
DOM.details.open({
productBg: this.DOM.productBg
});
}
}; // class Item
const DOM = {};
DOM.grid = document.querySelector('.grid');
DOM.content = DOM.grid.parentNode;
DOM.gridItems = Array.from(DOM.grid.querySelectorAll('.grid__item'));
let items = [];
DOM.gridItems.forEach(item => items.push(new Item(item)));
//
DOM.details = new Details();
function initShow(){
DOM.gridItems.forEach(item => items.push(new Item(item)));
// DOM.details = new Details();
}
// };