[JS]Building a Slider Component, Lifecycle DOM events, defer and async
コースソース:完全JavaScript Course 2022 Jonas(Udemy)
Building a Slider Component
スライダアセンブリの一般的な論理
1.スライドを平行位置に移動します.indexとtransformを使います!
2.スライドの構造を左右のキーで移動します.(transform)
3.グローバル変数let curslide=0を設定し、現在のスライドを決定します.eventでcurselid++またはcurselid--を使用してcurselid値を変更します.この値は変換時にも使用できます.
ex) slides.forEach((s, i) => (s.style.transform = translateX(${100 * (i - slide)}%))
);
4.再使用したコードは必ず関数として再構築してください!
5.初期に直ちに実行する必要がある関数については、init関数を単独で作成し、一度に読み込みます!
++論理を記述するときは、各要素のインデックスとデータセットの番号を同じにして、それらをよりよく利用します.
ex)各スライドでアクティブにする必要があるボタンの各データセットのスライドを、実際のスライドのインデックス番号const btn 1=documentとする.querySelector(.btn[data-slide= '1')
HTMLページでは、ライフサイクルに3つの重要なイベントがあります.
DOMContentLoaded, load, beforeunload/unload
Regular vs Async vs Defer
Regular in the end of body Scripts are fetched and executed after the HTML is completely parsed. Async in head Scripts are fetched asynchronously and executed immediately. Usually the DOMContentLoaded event waites for all scripts to execute, except for async scripts so DOMContentLoaded does not wait for an async script. Scripts not guaranteed to execute in order. Use for 3rd-party scripts where order doesn't matter. ex) google Analytics) Defer in head Scripts are fetched asychronously and executed after the HTML is completely parsed DOMContentLoaded event after defer script is executed Scripts are executed in order This is overall the best solution! Use for your own scripts and when order matters.
Building a Slider Component
スライダアセンブリの一般的な論理
1.スライドを平行位置に移動します.indexとtransformを使います!
2.スライドの構造を左右のキーで移動します.(transform)
3.グローバル変数let curslide=0を設定し、現在のスライドを決定します.eventでcurselid++またはcurselid--を使用してcurselid値を変更します.この値は変換時にも使用できます.
ex) slides.forEach((s, i) => (s.style.transform = translateX(${100 * (i - slide)}%))
);
4.再使用したコードは必ず関数として再構築してください!
5.初期に直ちに実行する必要がある関数については、init関数を単独で作成し、一度に読み込みます!
++論理を記述するときは、各要素のインデックスとデータセットの番号を同じにして、それらをよりよく利用します.
ex)各スライドでアクティブにする必要があるボタンの各データセットのスライドを、実際のスライドのインデックス番号const btn 1=documentとする.querySelector(.btn[data-slide= '1')
// Slider
const slider = function () {
const slides = document.querySelectorAll('.slide');
const btnLeft = document.querySelector('.slider__btn--left');
const btnRight = document.querySelector('.slider__btn--right');
const dotContainer = document.querySelector('.dots');
let curSlide = 0;
const maxSlide = slides.length;
// const slider = document.querySelector('.slider');
// slider.style.transform = 'scale(0.2) translate(-800px)';
// slider.style.overflow = 'visible';
//0%, 100%, 200%, 300%
//Functions
// 각 slide마다 dot 만들기
const createDots = function () {
slides.forEach(function (_, i) {
dotContainer.insertAdjacentHTML(
'beforeend',
`<button class="dots__dot" data-slide="${i}"></button>`
);
});
};
const activateDot = function (slide) {
document
.querySelectorAll('.dots__dot')
.forEach(dot => dot.classList.remove('dots__dot--active'));
document
.querySelector(`.dots__dot[data-slide="${slide}"]`)
.classList.add('dots__dot--active');
};
const goToSlide = function (slide) {
slides.forEach(
(s, i) => (s.style.transform = `translateX(${100 * (i - slide)}%)`)
);
};
// Next slide
const nextSlide = function () {
if (curSlide === maxSlide - 1) {
curSlide = 0;
} else {
curSlide++;
}
goToSlide(curSlide);
activateDot(curSlide);
};
const prevSlide = function () {
if (curSlide === 0) {
curSlide = maxSlide - 1;
} else {
curSlide--;
}
goToSlide(curSlide);
activateDot(curSlide);
};
const init = function () {
createDots();
activateDot(0);
goToSlide(0);
};
init();
//Event handlers
btnRight.addEventListener('click', nextSlide);
btnLeft.addEventListener('click', prevSlide);
document.addEventListener('keydown', function (e) {
e.key === 'ArrowLeft' && prevSlide();
e.key === 'ArrowRight' && nextSlide();
});
dotContainer.addEventListener('click', function (e) {
if (e.target.classList.contains('dots__dot')) {
const { slide } = e.target.dataset; // const slide = e.target.dataset.slide
goToSlide(slide);
activateDot(slide);
}
});
};
slider();
Lifecycle DOM EventsHTMLページでは、ライフサイクルに3つの重要なイベントがあります.
DOMContentLoaded, load, beforeunload/unload
document.addEventListener('DOMContentLoaded', function (e) {
console.log('HTML parsed and DOM tree built!');
});
// script을 html 뒤에 적어두어서 html이 다 parse가 된 후에 js file을 읽기 때문에 이 event필요 없음.
window.addEventListener('load', function (e) {
console.log('Page fully loaded', e);
});
window.addEventListener('beforeunload', function (e) {
e.preventDefault();
console.log(e);
//e.returnValue = ''; // 새로고침을 할 때 팝업이 뜬다.
});
Efficient Script Loading : defer and asyncRegular vs Async vs Defer
Regular in the end of body
<script src ="script.js">
Parsing HTML->Fetch Script->Execute(execute完了後にDOMContent Loadを実行)<script async src ="script.js">
Parsing HTMLとFetching Scriptが同時に表示されます.Fetchが終了したスクリプトはすぐに実行され、実行中にhtmlが待機し、再実行が終了した後もhtml解析を継続します.DOMContentLoadedを実行します.<script defer src ="script.js">
Parsing HTMLとFetching Scriptが同時に表示されます.Parsingが終了するとスクリプトが実行され、DOMContentLoadedが表示されますReference
この問題について([JS]Building a Slider Component, Lifecycle DOM events, defer and async), 我々は、より多くの情報をここで見つけました https://velog.io/@hoje15v/Building-a-Slider-Component-Lifecycle-DOM-events-defer-and-asyncテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol