67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
|  | 
 | ||
|  | class ChapterToggle { | ||
|  | 
 | ||
|  |     constructor(elem) { | ||
|  |         this.elem = elem; | ||
|  |         this.isOpen = elem.classList.contains('open'); | ||
|  |         elem.addEventListener('click', this.click.bind(this)); | ||
|  |     } | ||
|  | 
 | ||
|  |     open() { | ||
|  |         let list = this.elem.parentNode.querySelector('.inset-list'); | ||
|  | 
 | ||
|  |         this.elem.classList.add('open'); | ||
|  |         list.style.display = 'block'; | ||
|  |         list.style.height = ''; | ||
|  |         let height = list.getBoundingClientRect().height; | ||
|  |         list.style.height = '0px'; | ||
|  |         list.style.overflow = 'hidden'; | ||
|  |         list.style.transition = 'height ease-in-out 240ms'; | ||
|  | 
 | ||
|  |         let transitionEndBound = onTransitionEnd.bind(this); | ||
|  |         function onTransitionEnd() { | ||
|  |             list.style.overflow = ''; | ||
|  |             list.style.height = ''; | ||
|  |             list.style.transition = ''; | ||
|  |             list.removeEventListener('transitionend', transitionEndBound); | ||
|  |         } | ||
|  | 
 | ||
|  |         setTimeout(() => { | ||
|  |             list.style.height = `${height}px`; | ||
|  |             list.addEventListener('transitionend', transitionEndBound) | ||
|  |         }, 1); | ||
|  |     } | ||
|  | 
 | ||
|  |     close() { | ||
|  |         let list = this.elem.parentNode.querySelector('.inset-list'); | ||
|  | 
 | ||
|  |         this.elem.classList.remove('open'); | ||
|  |         list.style.display =  'block'; | ||
|  |         list.style.height = list.getBoundingClientRect().height + 'px'; | ||
|  |         list.style.overflow = 'hidden'; | ||
|  |         list.style.transition = 'height ease-in-out 240ms'; | ||
|  | 
 | ||
|  |         let transitionEndBound = onTransitionEnd.bind(this); | ||
|  |         function onTransitionEnd() { | ||
|  |             list.style.overflow = ''; | ||
|  |             list.style.height = ''; | ||
|  |             list.style.transition = ''; | ||
|  |             list.style.display =  'none'; | ||
|  |             list.removeEventListener('transitionend', transitionEndBound); | ||
|  |         } | ||
|  | 
 | ||
|  |         setTimeout(() => { | ||
|  |             list.style.height = `0px`; | ||
|  |             list.addEventListener('transitionend', transitionEndBound) | ||
|  |         }, 1); | ||
|  |     } | ||
|  | 
 | ||
|  |     click(event) { | ||
|  |         event.preventDefault(); | ||
|  |         this.isOpen ?  this.close() : this.open(); | ||
|  |         this.isOpen = !this.isOpen; | ||
|  |     } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | module.exports = ChapterToggle; |