From 91ec8b538c69b3049df5c4812ab5ba4cb0edb9b2 Mon Sep 17 00:00:00 2001 From: Tony Air Date: Wed, 21 Sep 2022 19:43:28 +0200 Subject: [PATCH] UPD: Carousel --- src/js/main/css-screen-size.js | 1 + src/js/main/funcs.js | 16 ++++++++++++++++ src/js/main/index.js | 1 + src/js/ui/carousel.js | 23 ++++++++++++++++++----- src/scss/ui/carousel.scss | 6 +++--- 5 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/js/main/css-screen-size.js b/src/js/main/css-screen-size.js index 161846c..d4ae41f 100644 --- a/src/js/main/css-screen-size.js +++ b/src/js/main/css-screen-size.js @@ -48,6 +48,7 @@ export default ((W) => { return curEnv } + W.detectCSSScreenSize = detectCSSScreenSize W.addEventListener(`${Events.LOADED}`, detectCSSScreenSize) W.addEventListener(`${Events.RESIZE}`, detectCSSScreenSize) diff --git a/src/js/main/funcs.js b/src/js/main/funcs.js index e8879f6..cb402b2 100644 --- a/src/js/main/funcs.js +++ b/src/js/main/funcs.js @@ -31,5 +31,21 @@ funcs.getParents = (elem, selector) => { return parents } +funcs.ucwords = (strInitial) => { + let str = strInitial.toLowerCase(); + const words = str.split(' '); + str = ''; + for (var i = 0; i < words.length; i++) { + let word = words[i]; + word = word.charAt(0).toUpperCase() + word.slice(1); + if (i > 0) { str = str + ' '; } + str = str + word; + } + + return str +} + + +window.globalF = funcs module.exports = funcs module.exports.default = funcs diff --git a/src/js/main/index.js b/src/js/main/index.js index e1e159f..b2a3371 100644 --- a/src/js/main/index.js +++ b/src/js/main/index.js @@ -4,4 +4,5 @@ import './visibility' import './touch' import './css-screen-size' +import './funcs' import './main' diff --git a/src/js/ui/carousel.js b/src/js/ui/carousel.js index 8d0b45a..74db1e9 100644 --- a/src/js/ui/carousel.js +++ b/src/js/ui/carousel.js @@ -1,4 +1,5 @@ import Events from '../_events' +import Consts from '../_consts' import Carousel from 'bootstrap/js/src/carousel' const CarouselUI = ((window) => { @@ -103,13 +104,25 @@ const CarouselUI = ((window) => { // fix animation glitch inner.style.left = '0px' + const getNumToDisplay = (el) => { + const screenSize = window.detectCSSScreenSize() + let curNum = parseInt(el.dataset['length'+window.globalF.ucwords(screenSize)]); + if(!curNum){ + curNum = parseInt(el.dataset.length); + } + + return Math.min(curNum, numberOfItems) + } + const calculate = (entries) => { const entry = entries[0] const el = entry.target const rect = entry.contentRect - const width = rect.width + //const width = rect.width + const width = el.querySelector('.carousel-inner-container').clientWidth + // const height = rect.height - const numToDisplay = Math.min(parseInt(el.dataset.length), numberOfItems) + const numToDisplay = getNumToDisplay(el) const itemWidth = width / numToDisplay el.dataset.itemWidth = itemWidth @@ -121,7 +134,7 @@ const CarouselUI = ((window) => { }) if (numberOfItems === numToDisplay) { - el.classList.add('js-carousel-no-slide') + el.classList.add(`${NAME}-no-slide`) carousel.pause() } }; @@ -150,7 +163,7 @@ const CarouselUI = ((window) => { el.addEventListener('slide.bs.carousel', (e) => { // infinite scroll - const numToDisplay = Math.min(parseInt(el.dataset.length), numberOfItems) + const numToDisplay = getNumToDisplay(el) console.log(`.${NAME}: ${e.to} ${numberOfItems / 2}`); if(numberOfItems - numToDisplay < e.to){ @@ -177,7 +190,7 @@ const CarouselUI = ((window) => { el.classList.add(`${NAME}-multislide-active`) } else { if (items.length === 1) { - el.classList.add('js-carousel-no-slide') + el.classList.add(`${NAME}-no-slide`) } } diff --git a/src/scss/ui/carousel.scss b/src/scss/ui/carousel.scss index 53db19e..c5d7dc6 100644 --- a/src/scss/ui/carousel.scss +++ b/src/scss/ui/carousel.scss @@ -118,14 +118,14 @@ $carousel-slide-img-loading-max-height: 25vh !default; .carousel-inner { display: flex; - flex-direction: column; + flex-direction: row; align-items: center; justify-content: center; transition: all 1s ease; - @media (min-width: map-get($grid-breakpoints, "md")) { + /*@media (min-width: map-get($grid-breakpoints, "md")) { flex-direction: row; - } + }*/ } }