parent
44d75a05e3
commit
27167fbec2
@ -0,0 +1,67 @@ |
|||||||
|
const rootSelectorTabs = '[data-js-tabs]'; |
||||||
|
|
||||||
|
class Tabs{ |
||||||
|
// элементы для поиска
|
||||||
|
selectors = { |
||||||
|
root: rootSelectorTabs, |
||||||
|
button: '[data-js-tabs-button]', |
||||||
|
content: '[data-js-tabs-content]', |
||||||
|
} |
||||||
|
// класс отображения состояния
|
||||||
|
stateClasses = { |
||||||
|
isActive: 'active', |
||||||
|
} |
||||||
|
|
||||||
|
constructor(rootElement){ |
||||||
|
this.rootElement = rootElement; |
||||||
|
this.buttonElements = this.rootElement.querySelectorAll(this.selectors.button); |
||||||
|
this.contentElements = this.rootElement.querySelectorAll(this.selectors.content); |
||||||
|
this.state = { |
||||||
|
activeMenuIndex: [...this.buttonElements] |
||||||
|
.findIndex((buttonElement) => buttonElement.classList.contains(this.stateClasses.isActive)), |
||||||
|
}; |
||||||
|
this.limitTabsIndex = this.buttonElements.length - 1; |
||||||
|
this.bindEvents(); |
||||||
|
} |
||||||
|
|
||||||
|
updateUI(){ |
||||||
|
const { activeMenuIndex } = this.state; |
||||||
|
|
||||||
|
this.buttonElements.forEach((buttonElement, index) => { |
||||||
|
const isActive = index === activeMenuIndex; |
||||||
|
|
||||||
|
buttonElement.classList.toggle(this.stateClasses.isActive, isActive); |
||||||
|
}) |
||||||
|
|
||||||
|
this.contentElements.forEach((contentElement, index) => { |
||||||
|
const isActive = index === activeMenuIndex; |
||||||
|
|
||||||
|
contentElement.classList.toggle(this.stateClasses.isActive, isActive); |
||||||
|
}) |
||||||
|
} |
||||||
|
|
||||||
|
onButtonClick(buttonIndex){ |
||||||
|
this.state.activeMenuIndex = buttonIndex; |
||||||
|
this.updateUI(); |
||||||
|
} |
||||||
|
|
||||||
|
bindEvents(){ |
||||||
|
this.buttonElements.forEach((buttonElement, index) => { |
||||||
|
buttonElement.addEventListener('click', () => this.onButtonClick(index)) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class TabsCollection { |
||||||
|
constructor(){ |
||||||
|
this.init(); |
||||||
|
} |
||||||
|
|
||||||
|
init(){ |
||||||
|
document.querySelectorAll(rootSelectorTabs).forEach((element) => { |
||||||
|
new Tabs(element); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default TabsCollection; |
@ -0,0 +1,91 @@ |
|||||||
|
const rootSelectorToggles = '[data-js-toggle]'; |
||||||
|
|
||||||
|
class Toggle{ |
||||||
|
// элементы для поиска
|
||||||
|
selectors = { |
||||||
|
root: rootSelectorToggles, |
||||||
|
button: '[data-js-toggle-button]', |
||||||
|
wrapper: '[data-js-toggle-wrapper]', |
||||||
|
content: '[data-js-toggle-content]', |
||||||
|
} |
||||||
|
// класс отображения состояния
|
||||||
|
stateClasses = { |
||||||
|
isActive: 'active', |
||||||
|
} |
||||||
|
|
||||||
|
constructor(rootElement){ |
||||||
|
this.rootElement = rootElement; |
||||||
|
this.buttonElements = this.rootElement.querySelectorAll(this.selectors.button); |
||||||
|
this.wrapperElements = this.rootElement.querySelectorAll(this.selectors.wrapper); |
||||||
|
this.contentElements = this.rootElement.querySelectorAll(this.selectors.content); |
||||||
|
this.state = { |
||||||
|
activeToggleIndex: [...this.buttonElements] |
||||||
|
.findIndex((buttonElement) => buttonElement.classList.contains(this.stateClasses.isActive)), |
||||||
|
}; |
||||||
|
this.bindEvents(); |
||||||
|
} |
||||||
|
|
||||||
|
updateUI(newHeight){ |
||||||
|
const { activeToggleIndex } = this.state; |
||||||
|
|
||||||
|
this.buttonElements.forEach((buttonElement, index) => { |
||||||
|
const isActive = index === activeToggleIndex; |
||||||
|
|
||||||
|
buttonElement.classList.toggle(this.stateClasses.isActive, isActive); |
||||||
|
}) |
||||||
|
|
||||||
|
this.wrapperElements.forEach((wrapperElement, index) => { |
||||||
|
const isActive = index === activeToggleIndex, |
||||||
|
newHeight = this.contentElements[index].offsetHeight; |
||||||
|
|
||||||
|
wrapperElement.classList.toggle(this.stateClasses.isActive, isActive); |
||||||
|
|
||||||
|
if (isActive) { |
||||||
|
console.log(this.contentElements[index]); |
||||||
|
|
||||||
|
wrapperElement.style.height = `${newHeight}px`; |
||||||
|
|
||||||
|
setTimeout(() => { |
||||||
|
if (wrapperElement.classList.contains('active')) { |
||||||
|
wrapperElement.style.height = `auto`; |
||||||
|
} |
||||||
|
}, 300); |
||||||
|
}else{ |
||||||
|
wrapperElement.style.height = `${newHeight}px`; |
||||||
|
|
||||||
|
setTimeout(() => { |
||||||
|
if (!wrapperElement.classList.contains('active')) { |
||||||
|
wrapperElement.style.height = `${0}px`; |
||||||
|
} |
||||||
|
}, 10); |
||||||
|
} |
||||||
|
}) |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
onButtonClick(buttonIndex){ |
||||||
|
this.state.activeToggleIndex = (buttonIndex === this.state.activeToggleIndex) ? -1 : buttonIndex; |
||||||
|
|
||||||
|
this.updateUI(); |
||||||
|
} |
||||||
|
|
||||||
|
bindEvents(){ |
||||||
|
this.buttonElements.forEach((buttonElement, index) => { |
||||||
|
buttonElement.addEventListener('click', () => this.onButtonClick(index)) |
||||||
|
}) |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
class TogglesCollection{
|
||||||
|
constructor(){ |
||||||
|
this.init(); |
||||||
|
} |
||||||
|
|
||||||
|
init(){ |
||||||
|
document.querySelectorAll(rootSelectorToggles).forEach((element) => { |
||||||
|
new Toggle(element); |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
export default TogglesCollection; |
File diff suppressed because one or more lines are too long
Loading…
Reference in new issue