# 추후 도전 과제
# git link : imgSlide
# 개발 환경 : HTML5, CSS, Vanilla JS, Webpack, fontawesome
- webpack basic setting & plugin
npm i --save @fortawesome/fontawesome-free
- webpack.config.js
{
test: /\.jpeg$/,
type: 'asset/inline',
}
- html (lodash 문법 적용)
<img src="<%= require('./file/root') %>" />
npx install-peerdeps --dev eslint-config-airbnb
"extends": ["airbnb","plugin:prettier/recommended"]
export default class ImageSlider {
#currentPosition = 0;
#slideNumber = 0;
...
constructor() {
this.assignElement();
this.initSliderNumber();
this.initSlideWidth();
this.initSliderListWidth();
this.addEvent();
}
assignElement() {
this.sliderWrapEl = document.getElementById('slider-wrap');
this.sliderListEl = this.sliderWrapEl.querySelector('#slider');
...
}
initSliderNumber() {...}
initSlideWidth() {...}
initSliderListWidth() {...}
addEvent() {
this.nextBtnEl.addEventListener('click', ...);
...
}
moveToRight() {
this.#currentPosition += 1;
if (this.#currentPosition === this.#slideNumber) {
this.#currentPosition = 0;
}
this.sliderListEl.style.left = `-${
this.#slideWidth * this.#currentPosition
}px`;
}
moveToLeft() {
this.#currentPosition -= 1;
if (this.#currentPosition === -1) {
this.#currentPosition = this.#slideNumber - 1;
}
this.sliderListEl.style.left = `-${
this.#slideWidth * this.#currentPosition
}px`;
}
}
export default class ImageSlider {
...
indicatorWrapEl;
constructor() {
...
this.createIndicator();
this.setIndicator();
}
assignElement() {
...
this.indicatorWrapEl = this.sliderWrapEl.querySelector('#indicator-wrap');
}
addEvent() {
...
this.indicatorWrapEl.addEventListener('click', ...);
}
onClickIndicator(event) {
const indexPosition = parseInt(event.target.dataset.index, 10);
if(Number.isInteger(indexPosition)){
this.#currentPosition = indexPosition;
this.sliderListEl.style.left = `-${
this.#slideWidth * this.#currentPosition
}px`;
this.setIndicator();
}
}
createIndicator() {
const docFragment = document.createDocumentFragment();
for (let i = 0; i < this.#slideNumber; i += 1) {
const li = document.createElement('li')
li.dataset.index = i;
docFragment.appendChild(li);
}
this.indicatorWrapEl.querySelector('ul').appendChild(docFragment)
}
setIndicator() {
this.indicatorWrapEl
.querySelector('li.active')
?.classList.remove('active');
this.indicatorWrapEl
.querySelector(`ul li:nth-child(${this.#currentPosition + 1})`)
.classList.add('active');
}
}
export default class ImageSlider {
...
#intervalId;
#autoPlay = true;
controlWrapEl;
constructor() {
...
this.initAutoplay();
}
assignElement() {
...
this.controlWrapEl = this.sliderWrapEl.querySelector('#control-wrap');
}
initAutoplay() {
this.#intervalId = setInterval(this.moveToRight.bind(this), 3000);
}
addEvent() {
...
this.controlWrapEl.addEventListener('click', ...);
}
togglePlay(event) {
if(event.target.dataset.status === 'play') {
this.#autoPlay = true;
this.controlWrapEl.classList.add('play');
this.controlWrapEl.classList.remove('pause');
this.initAutoplay()
} else if(event.target.dataset.status === 'pause') {
this.#autoPlay = false;
this.controlWrapEl.classList.remove('play');
this.controlWrapEl.classList.add('pause');
clearInterval(this.#intervalId);
}
}
moveToRight() {
...
if(this.#autoPlay) {
clearInterval(this.#intervalId);
this.#intervalId = setInterval(this.moveToRight.bind(this), 3000);
}
...
}
moveToLeft() {
...
if(this.#autoPlay) {
clearInterval(this.#intervalId);
this.#intervalId = setInterval(this.moveToRight.bind(this), 3000);
}
...
}
}
#변수명