WIZWID

μ „ν˜œλ¦°Β·2024λ…„ 4μ›” 18일
0

Portfolio

λͺ©λ‘ 보기
11/11

πŸ’» WIZWID 클둠 μ½”λ”©

μ‚¬μ΄νŠΈλͺ…: WIZWID
μ œμž‘κΈ°κ°„: 24.03.21 ~ 24.03.23(2일 μ†Œμš”)
μ‚¬μš©μ–Έμ–΄: html, css, js
λΆ„λ₯˜: μ μ‘ν˜• PC

πŸ” Main Point

  • 디데이 μΉ΄μš΄νŠΈλ‹€μš΄
  • Swiper pagination bullets custom
  • CSS λ§μ€„μž„ ν‘œμ‹œ

디데이 μΉ΄μš΄νŠΈλ‹€μš΄

μ‡Όν•‘λͺ° μ‚¬μ΄νŠΈμΈ WIZWIDμ—λŠ” μƒν’ˆμ˜ 남은 세일 기간을 ν‘œμ‹œν•΄μ£ΌλŠ” κΈ°λŠ₯이 μžˆμ–΄ λ‚˜λ„ κ΅¬ν˜„ν•΄ λ³΄μ•˜λ‹€.

function dayCount() {
  const h1El = document.querySelector('h1');

  const today = new Date();
  const dday = new Date(2024, 5, 19);
  const timeGap = dday.getTime() - today.getTime();

  // 남은 일수 카운트
  const remainDay = Math.ceil(timeGap / (1000 * 60 * 60 * 24));

  // 남은 μ‹œκ°„ 카운트
  const hours = String(Math.floor(timeGap / (1000 * 60 * 60) % 24)).padStart(2, '0');
  const minutes = String(Math.floor(timeGap / (1000 * 60) % 60)).padStart(2, '0');
  const seconds = String(Math.floor((timeGap / 1000) % 60)).padStart(2, '0');

  if(timeGap <= 0) {
    clearInterval(countdownInterval);
    h1El.textContent = 'λ§ˆκ°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.';
  }

  h1El.textContent = `${remainDay}일 ${hours}μ‹œ ${minutes}λΆ„ ${seconds}초`;
}

// 1μ΄ˆλ§ˆλ‹€ μ—…λ°μ΄νŠΈ
const countdownInterval = setInterval(dayCount, 1000);

1) 디데이 μ‹œμ μ—μ„œ 였늘 λ‚ μ§œλ₯Ό λΊ€ 남은 일수 κ΅¬ν•˜κΈ°

const today = new Date(); // Thu Apr 18 2024 19:11:46 GMT+0900 (ν•œκ΅­ ν‘œμ€€μ‹œ)
const dday = new Date(2024, 5, 19); // Wed Jun 19 2024 00:00:00 GMT+0900 (ν•œκ΅­ ν‘œμ€€μ‹œ)
const timeGap = dday.getTime() - today.getTime(); // 5287654281 (λ°€λ¦¬μ΄ˆ)
  • today λ³€μˆ˜λŠ” ν˜„μž¬ λ‚ μ§œμ™€ 정보λ₯Ό μ œκ³΅ν•˜λŠ” Date 객체
  • dday λ³€μˆ˜λŠ” 디데이 λ‚ μ§œ 정보λ₯Ό μ œκ³΅ν•˜λŠ” Date 객체

μ—¬κΈ°μ„œ μ€‘μš”ν•œ 것은 지정 λ‚ μ§œ = new Date(μ—°, μ›”-1, 일);
월은 -1을 ν•΄μ£Όμ–΄μ•Όν•œλ‹€!

getTime() λ©”μ„œλ“œλŠ” Date 객체의 μΈμŠ€ν„΄μŠ€μ— λŒ€ν•΄ ν•΄λ‹Ή λ‚ μ§œμ™€ μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λŠ” λ°€λ¦¬μ΄ˆ λ‹¨μœ„μ˜ 숫자 값을 λ°˜ν™˜ν•œλ‹€.

디데이 λ‚ μ§œμ—μ„œ ν˜„μž¬ λ‚ μ§œλ₯Ό λΉΌλ©΄ μ§€κΈˆλΆ€ν„° 남은 μ‹œκ°„μ„ λ°€λ¦¬μ΄ˆ λ‹¨μœ„λ‘œ ꡬ할 수 μžˆλ‹€.

2) 남은 일수 κ³„μ‚°ν•˜κΈ°

ν•΄λ‹Ή μ‹œμ κΉŒμ§€μ˜ λ‚ μ§œ 및 μ‹œκ°„μ„ λ°€λ¦¬μ΄ˆ λ‹¨μœ„μ˜ 숫자둜 ꡬ해왔닀면, κ·Έ 값을 μ‹œ/λΆ„/초/일둜 λ‚˜λˆ„μ–΄μ•Ό λͺ©ν‘œν•œ 일수λ₯Ό κ³„μ‚°ν•΄μ˜¬ 수 μžˆλ‹€.

남은 μ‹œκ°„μ„ 일 λ‹¨μœ„λ‘œ κ³„μ‚°ν•œ λ‹€μŒ 였늘 λ‚ μ§œκΉŒμ§€ ν¬ν•¨μ‹œν‚€κΈ° μœ„ν•˜μ—¬ Math.ceil() λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

Math.ceil(숫자) : μ†Œμˆ˜μ  첫째 μžλ¦¬μ—μ„œ 무쑰건 올림 ν•˜μ—¬ μ •μˆ˜λ₯Ό λ°˜ν™˜ν•œλ‹€.

// 남은 일수 카운트
const remainDay = Math.ceil(timeGap / (1000 * 60 * 60 * 24)); // 62

1초 = 1000ms μ΄λΌλŠ” 점을 ν™œμš©ν•˜λ©΄ 일, μ‹œ, λΆ„, μ΄ˆκΉŒμ§€ ꡬ할 수 μžˆλ‹€.

  • 초 : 1ms * 1000λŠ” 1초
  • λΆ„ : 1ms * 1000κ°€ 1μ΄ˆλ‹ˆκΉŒ μ—¬κΈ°μ„œ 60을 κ³±ν•˜λ©΄ 1λΆ„
  • μ‹œ : 1ms * 1000 * 60은 1λΆ„μ΄λ‹ˆκΉŒ, 60을 κ³±ν•˜λ©΄ 1μ‹œκ°„
  • 일 : 1ms * 1000 * 60 * 60은 1μ‹œκ°„μ΄λ‹ˆκΉŒ, 24λ₯Ό κ³±ν•˜λ©΄ 1일

3) 남은 μ‹œκ°„ κ³„μ‚°ν•˜κΈ°

// 남은 μ‹œκ°„ 카운트
const hours = String(Math.floor(timeGap / (1000 * 60 * 60) % 24)).padStart(2, '0');
const minutes = String(Math.floor(timeGap / (1000 * 60) % 60)).padStart(2, '0');
const seconds = String(Math.floor((timeGap / 1000) % 60)).padStart(2, '0');
계산할 λ‚ μ˜ λ°€λ¦¬μ΄ˆ / (1000 * 60 * 60 * 24) = 일
(계산할 λ‚ μ˜ λ°€λ¦¬μ΄ˆ / (1000 * 60 * 60)) % 24 = μ‹œ
(계산할 λ‚ μ˜ λ°€λ¦¬μ΄ˆ / (1000 * 60)) % 60 = λΆ„
(계산할 λ‚ μ˜ λ°€λ¦¬μ΄ˆ / 1000) % 60 = 초

4) setInterval ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ 숫자 μ—…λ°μ΄νŠΈ

화면에 1μ΄ˆλ§ˆλ‹€ μ—…λ°μ΄νŠΈν•˜μ—¬ ν‘œμ‹œν•  수 μžˆλ„λ‘ setInterval을 μ‚¬μš©ν•œλ‹€.

if(timeGap <= 0) {
  clearInterval(countdownInterval);
  h1El.textContent = 'λ§ˆκ°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.';
}

// 1μ΄ˆλ§ˆλ‹€ μ—…λ°μ΄νŠΈ
const countdownInterval = setInterval(dayCount, 1000);

πŸ“‚ μ™„μ„±μ½”λ“œ



Swiper pagination bullets custom

swiper의 default νŽ˜μ΄μ§•(pagination)은 νŒŒλž€μƒ‰ 점 λͺ¨μ–‘이닀. 이것은 swiperμ—μ„œ μ§€μ›ν•˜λŠ” νŽ˜μ΄μ§• νƒ€μž… 쀑 bullet의 κΈ°λ³Έ ν˜•νƒœμ΄λ‹€. ν•˜μ§€λ§Œ renderBullet λ§€κ°œλ³€μˆ˜λ‘œ 색닀λ₯΄κ²Œ μ»€μŠ€ν…€ ν•  수 μžˆλ‹€.

μˆ˜μ • μ „(Default)

νŽ˜μ΄μ§€λ„€μ΄μ…˜ νƒ€μž…μ€ 'progressbar', 'bullets', 'fraction', 'custom' 으둜 총 4가지이며, 기본값은 'bullets' 이닀.

renderBullet λ©”μ„œλ“œ

νŽ˜μ΄μ§• μ˜μ—­μ„ λ³€κ²½ν•  수 μžˆλŠ” renderBullet λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ»€μŠ€ν…€ ν•  수 μžˆλ‹€.

이 λ§€κ°œλ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ νŽ˜μ΄μ§€ 맀김 글머리 기호λ₯Ό μ™„μ „νžˆ μ‚¬μš©μž μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 여기에 νŽ˜μ΄μ§€ 맀김 글머리 기호 μˆ˜μ™€ ν•„μˆ˜ μš”μ†Œ 클래슀 이름(className) 을 ν—ˆμš©ν•˜λŠ” ν•¨μˆ˜λ₯Ό 전달해야 ν•©λ‹ˆλ‹€ . 'bullets'νŽ˜μ΄μ§€ 맀김 μœ ν˜• μ—λ§Œ ν•΄λ‹Ή - Swiper API

renderBullet λ©”μ„œλ“œ μ μš©ν•œ μ½”λ“œ

new Swiper('.swiper', {
  pagination: {
    el: '.swiper-pagination',
    clickable: true, // 클릭 κ°€λŠ₯ μ—¬λΆ€
    renderBullet: function (index, className) {
      const bulletName = ["WEEKLY CLOSET", "WHERE TO GO", "BRANDPEDIA", "KEYWORD#", "MARKETER'S DIARY", "SNACK FILM"];

      return `<span class="${className}">${bulletName[index]}</span>`;
    }
  }
});

πŸ“‚ μ™„μ„±μ½”λ“œ



CSS λ§μ€„μž„ ν‘œμ‹œ

ν•œ 쀄 λ§μ€„μž„(...) ν‘œμ‹œ

.text {
  white-space: nowrap; /* μ€„λ°”κΏˆ μ—†μ• κΈ° */
  overflow: hidden;  /* λ„˜μΉœ ν…μŠ€νŠΈ 자λ₯΄κΈ° */
  text-overflow: ellipsis; /* 잘린 ν…μŠ€νŠΈλ₯Ό λ‚˜νƒ€λ‚΄κΈ° μœ„ν•΄ 말 μ€„μž„(…)을 ν‘œμ‹œ */
}

μ—¬λŸ¬ 쀄 λ§μ€„μž„(...) ν‘œμ‹œ

.text {
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3; /* μ œν•œν•  ν…μŠ€νŠΈμ˜ 쀄 수 */
  overflow: hidden;
}


μ°Έκ³  μ‚¬μ΄νŠΈ
https://goddino.tistory.com/29
https://ziszini.tistory.com/49

profile
μ½”λ”©μͺΌμ•„

0개의 λŒ“κΈ€