сделал подписку + js
This commit is contained in:
67
assets/js/tabs.js
Normal file
67
assets/js/tabs.js
Normal file
@@ -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;
|
||||
91
assets/js/toggle.js
Normal file
91
assets/js/toggle.js
Normal file
@@ -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;
|
||||
Reference in New Issue
Block a user