diff --git a/css/style.css b/css/style.css index 435c249..80beb9f 100644 --- a/css/style.css +++ b/css/style.css @@ -21,9 +21,24 @@ img { display: flex; } +.slide:hover { + will-change: transform; +} + .slide li { flex-shrink: 0; width: 80vw; max-width: 800px; margin: 0 20px; + + border-radius: 4px; + overflow: hidden; + box-shadow:0 2px 4px rgba(0,0,0,.4) ; + opacity: .8; + transform: scale(.8); +} + +.slide li.active { + opacity: 1; + transform: scale(1); } \ No newline at end of file diff --git a/index.html b/index.html index edfea06..0a1595d 100644 --- a/index.html +++ b/index.html @@ -13,7 +13,6 @@
  • -
  • diff --git a/js/debounce.js b/js/debounce.js index a1031fb..a715416 100644 --- a/js/debounce.js +++ b/js/debounce.js @@ -1,4 +1,4 @@ -/* export default function debounce(callback, delay) { +export default function debounce(callback, delay) { let timer; return (...args) => { if (timer) clearTimeout(timer); @@ -7,4 +7,4 @@ timer = null; }, delay); }; -} */ +} diff --git a/js/script.js b/js/script.js index d7bf332..7591a8a 100644 --- a/js/script.js +++ b/js/script.js @@ -4,4 +4,5 @@ const slide = new Slide('.slide', '.slide-wrapper'); slide.init(); console.log(slide); -slide.changeSlide(3) \ No newline at end of file +slide.changeSlide(3); +slide.activePrevSlide(); \ No newline at end of file diff --git a/js/slide.js b/js/slide.js index 7bb9281..c60c58a 100644 --- a/js/slide.js +++ b/js/slide.js @@ -1,8 +1,15 @@ +import debounce from './debounce.js'; + export default class Slide { constructor(slide, wrapper) { this.slide = document.querySelector(slide) this.wrapper = document.querySelector(wrapper); this.dist = { finalPosition: 0, startX: 0, movement: 0 } + this.activeClass = 'active'; + } + + transition(active) { + this.slide.style.transition = active ? 'transform .3s' : ''; } moveSlide(distX) { @@ -26,6 +33,7 @@ export default class Slide { movetype = 'touchmove'; } this.wrapper.addEventListener(movetype, this.onMove); + this.transition(false); } onMove(event) { @@ -38,6 +46,18 @@ export default class Slide { const movetype = (event.type === 'mouseup') ? 'mousemove' : 'touchmove'; this.wrapper.removeEventListener(movetype, this.onMove); this.dist.finalPosition = this.dist.movePosition; + this.transition(true); + this.changeSlideOnEnd(); + } + + changeSlideOnEnd() { + if (this.dist.movement > 120 && this.index.next !== undefined) { + this.activeNextSlide(); + } else if (this.dist.movement < -120 && this.index.prev !== undefined) { + this.activePrevSlide(); + } else { + this.changeSlide(this.index.active); + } } addSlideEvents() { @@ -47,12 +67,6 @@ export default class Slide { this.wrapper.addEventListener('touchend', this.onEnd); } - bindEvents() { - this.onStart = this.onStart.bind(this); - this.onMove = this.onMove.bind(this); - this.onEnd = this.onEnd.bind(this); - } - // Slides config slidePosition(slide) { @@ -81,12 +95,47 @@ export default class Slide { this.moveSlide(activeSlide.position); this.slidesIndexNav(index); this.dist.finalPosition = activeSlide.position; + this.changeActiveClass(); + } + + changeActiveClass() { + this.slideArray.forEach(item => item.element.classList.remove(this.activeClass)); + this.slideArray[this.index.active].element.classList.add(this.activeClass); + } + + activePrevSlide() { + if (this.index.prev !== undefined) this.changeSlide(this.index.prev); + } + + activeNextSlide() { + if (this.index.next !== undefined) this.changeSlide(this.index.next); + } + + onResize() { + setTimeout(() => { + this.slidesConfig(); + this.changeSlide(this.index.active); + }, 1000); + } + + addResizeEvent() { + window.addEventListener('resize', this.onResize); + } + + bindEvents() { + this.onStart = this.onStart.bind(this); + this.onMove = this.onMove.bind(this); + this.onEnd = this.onEnd.bind(this); + + this.onResize = debounce(this.onResize.bind(this), 200); } init() { this.bindEvents(); + this.transition(true); this.addSlideEvents(); this.slidesConfig(); + this.addResizeEvent(); return this; } } \ No newline at end of file