Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- typescript
- 개발콘텐츠
- javascript
- React.js
- 타입스크립트
- 누구나 자료구조와 알고리즘
- react
- 제네릭
- NonNullable
- returnType
- CSS
- const 단언문
- 타입좁히기
- click and drag
- 공통컴포넌트
- vue.js
- 티스토리꾸미기
- 커스텀
- reactjs
- Chart.js
- 2022
- 반복줄이기
- React Native
- utilty type
- JS console
- 성능최적화
- 폰트적용하기
- 리액트
- 레이아웃쪼개기
- TSDoc
Archives
- Today
- Total
몽땅뚝딱 개발자
[Javascript] 썸네일 인터랙션 구현하기 본문
📄 JS
const infos = document.querySelectorAll('.info')
infos.forEach((info) => {
addEvent(info.querySelector('ul'))
})
function addEvent(target) {
const handleClass = (slideEl) => {
slideEl.forEach((slide, index) => {
slide.style.left = `${28 * index}px`
if (index === 1 || index === 2 || index === 3) {
slide.classList.add('active')
} else {
slide.classList.remove('active')
}
})
}
// 이미지를 섞어야하는 경우 이 함수를 사용한다.
const shuffle = (images) => {
images.sort(() => Math.random() - 0.5);
}
// 이미지 url을 작성하고 이미지 목록을 가져온다.
// 내가 사용한 이미지는 img_01, img_02, img_03... 형식이라 숫자가 한자리인 경우 padStart를 사용하여 0을 붙여주었다.
let imageArr = Array.from({length: 25}).map((obj, index) => {
return `//[imgUrl]/img_${(index + 1).toString().padStart(2, '0')}.png`
})
shuffle(imageArr)
target.querySelectorAll('li').forEach((slide, index) => {
slide.style.backgroundImage = `url(${imageArr[index]})`
})
setInterval(() => {
let slides = target
let slideEl = target.querySelectorAll('li')
handleClass(slideEl)
slides.prepend(slideEl[5])
handleClass(slideEl)
}, 1500)
}
📄 HTML
<div class="info">
<ul class="slides" id="slides">
<li class="slide slide-1"></li>
<li class="slide slide-2 active"></li>
<li class="slide slide-3 active"></li>
<li class="slide slide-4 active"></li>
<li class="slide slide-5"></li>
<li class="slide slide-6"></li>
</ul>
<p class="home-tab-panel__item-text">지금 0명이 보고 있어요</p>
</div>
📄 CSS
<style>
.info {
margin-top: 7px;
display: flex;
gap: 8px;
}
.slide_wrapper {
padding: 0;
margin: 0;
}
.slides {
position: relative;
display: flex;
left: 0;
top: 0;
padding: 0;
margin: 0;
transition: all 0.5s;
width: 110px;
overflow: hidden;
height: 32px;
}
.slide {
position: absolute;
width: 32px;
height: 32px;
background-size: 32px;
list-style: none;
margin-left: -7px;
opacity: 0;
transform: scale(20%);
transition: all 0.5s;
background-size: contain;
border: 1px solid #fff;
border-radius: 8px;
background-color: #fff;
box-sizing: border-box;
}
.slide.active {
opacity: 1;
transform: scale(100%);
}
.slide:nth-child(1) {
z-index: 5;
left: 0;
}
.slide:nth-child(2) {
z-index: 4;
left: 28px;
}
.slide:nth-child(3) {
z-index: 3;
left: 56px;
}
.slide:nth-child(4) {
z-index: 2;
left: 84px;
}
.slide:nth-child(5) {
z-index: 1;
left: 112px;
}
</style>
'Development > Javascript' 카테고리의 다른 글
[Javascript] 교차 출처일 때 제한되는 메서드와 속성 (0) | 2024.01.27 |
---|---|
[Javascript] readyState란? (feat. DOMContentLoaded) (0) | 2024.01.27 |
reverse() vs. reversed() (0) | 2024.01.14 |
[Javascript] 듀얼 모니터에서 팝업 중앙에 띄우기 (0) | 2024.01.09 |
[Swiper] 세로형 슬라이드 배너 제작하기 / vertical (1) | 2023.08.12 |
Comments