노력이 좋아서
<step37>'js_동기 비동기'
zoaseo
2022. 5. 11. 10:36
1) slideLeft.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {margin: 0; padding: 0; box-sizing: border-box;}
li { list-style: none;}
#divView {
width: 600px;
height: 400px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
overflow: hidden;
}
#divs {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition: 0.5s;
}
.imgdiv {
position: absolute;
top: 0;
}
</style>
</head>
<body>
<div id="divView">
<div id="divs">
<div class="imgdiv"><img src="../과제/img/story_img01.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img02.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img03.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img04.jpg" alt=""></div>
</div>
</div>
<script>
const imgDivs = document.querySelectorAll('.imgdiv');
let divLeft = 0;
imgDivs.forEach((imgdiv,index) => {
imgdiv.style.left = `${index*100}%`;
});
// setInterval(함수,시간)
setInterval(function(){
//3초마다 이미지 전환
//dom요소 divs의 left값이 0%, -100%, -200%, -300%, 0, -100%...
divLeft = divLeft === -3? 0 : divLeft - 1; //삼항연산자 사용
document.querySelector('#divs').style.left = `${divLeft * 100}%`;
},3000)
</script>
</body>
</html>
2) slideLeft_2.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {margin: 0; padding: 0; box-sizing: border-box;}
li { list-style: none;}
#divView {
width: 600px;
height: 400px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
overflow: hidden;
}
#divs {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition: 0.5s;
}
.imgdiv {
position: absolute;
top: 0;
}
span {
position: absolute;
color: #fff;
font-size: 50px;
}
.le {
top: 50%;
transform: translateY(-50%);
left: 0;
}
.ri {
top: 50%;
transform: translateY(-50%);
right: 0;
}
</style>
</head>
<body>
<div id="divView">
<div id="divs">
<div class="imgdiv"><img src="../과제/img/story_img01.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img02.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img03.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img04.jpg" alt=""></div>
</div>
<span class="le" >o</span>
<span class="ri" >o</span>
</div>
<script>
const imgDivs = document.querySelectorAll('.imgdiv');
let divLeft = 0;
imgDivs.forEach((imgdiv,index) => {
imgdiv.style.left = `${index*100}%`;
});
// setInterval(함수,시간)
setInterval(function(){
//3초마다 이미지 전환
//dom요소 divs의 left값이 0%, -100%, -200%, -300%, 0, -100%...
divLeft = divLeft === -3? 0 : divLeft - 1; //삼항연산자 사용
moveDiv(divLeft);
},3000)
function moveDiv(left){
document.querySelector('#divs').style.left = `${left * 100}%`;
document.querySelector('.ri').addEventListener('click', function(){
document.querySelector('#divs').style.left = `${(left-1) * 100}%`;
});
document.querySelector('.le').addEventListener('click', function(){
document.querySelector('#divs').style.left = `${(left+1) * 100}%`;
});
}
</script>
</body>
</html>
3) slideLeft_2_teach.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {margin: 0; padding: 0; box-sizing: border-box;}
li { list-style: none;}
#divView {
width: 600px;
height: 400px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
overflow: hidden;
}
#divs {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transition: 0.5s;
}
.imgdiv {
position: absolute;
top: 0;
}
.le {
top: 50%;
transform: translateY(-50%);
left: 0;
}
.ri {
top: 50%;
transform: translateY(-50%);
right: 0;
}
.btn {
width: 60px;
height: 60px;
background: tomato;
color: #fff;
border-radius: 50%;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);
text-align: center;
line-height: 60px;
}
#prev {
margin-left: -250px;
}
#next {
margin-left: 250px;
}
#indi {
position: absolute;
bottom: 10px;
/* background: lightblue; */
width: 100%;
text-align: center;
padding: 10px;
}
#indi span {
display: inline-block;
width: 10px;
height: 10px;
background: tomato;
border-radius: 50%;
margin: 0 3px;
font-size: 0;
}
#indi span.on {
background: #000;
}
</style>
</head>
<body>
<div id="divView">
<div id="divs">
<div class="imgdiv"><img src="../과제/img/story_img01.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img02.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img03.jpg" alt=""></div>
<div class="imgdiv"><img src="../과제/img/story_img04.jpg" alt=""></div>
</div>
<div id="prev" class="btn">이전</div>
<div id="next" class="btn">다음</div>
<div id="indi"></div>
</div>
<script>
const imgDivs = document.querySelectorAll('.imgdiv'); //노드리스트 유사배열
const next = document.querySelector('#next');
const prev = document.querySelector('#prev');
const indiDiv = document.querySelector('#indi');
let divLeft = 0;
let current;
let indiStr = "";
//setInterval을 담을 변수
let timer;
imgDivs.forEach((imgdiv,index) => {
imgdiv.style.left = `${index*100}%`;
indiStr = indiStr + `<span>${index}</span>`
});
indiDiv.innerHTML = indiStr;
let indi = document.querySelectorAll('#indi span');
indi[0].classList.add('on');
console.log(indi);
// 인디케이터 이벤트 연결
indiDiv.addEventListener('click',function(e){
let targetNum = e.target.innerHTML;
moveDiv(targetNum);
})
// 이전, 다음 버튼 이벤트 연결
prev.addEventListener('mouseenter',function(){
stopIt();
})
prev.addEventListener('mouseleave',function(){
startIt();
})
prev.addEventListener('click', function(){
//현재의 이전값을 구함
let prevNum = current == 0? imgDivs.length-1 : current - 1;
moveDiv(prevNum);
})
next.addEventListener('mouseenter',function(){
stopIt();
})
next.addEventListener('mouseleave',function(){
startIt();
})
next.addEventListener('click', function(){
//현재의 다음값을 구함
let nextNum = current == imgDivs.length-1 ? 0 : current + 1;
//다음값으로 이동
moveDiv(nextNum);
})
//div를 이동시키는 함수
function moveDiv(left){
document.querySelector('#divs').style.left = `${-(left * 100)}%`;
current = left;
indi.forEach(ind =>ind.classList.remove('on'));
indi[current].classList.add('on');
}
//자동이미지 전환 실행함수(setInterval)
function startIt(){
timer = setInterval(function(){
//3초마다 이미지 전환
//dom요소 divs의 left값이 0%, -100%, -200%, -300%, 0, -100%...
divLeft = current === imgDivs.length-1 ? 0 : divLeft + 1; //삼항연산자 사용
moveDiv(divLeft);
},3000)
}
//자동이미지 전환 멈춤함수(clearInterval)
function stopIt(){
clearInterval(timer);
}
startIt();
</script>
</body>
</html>