Home clone-soylent-4
Post
Cancel

clone-soylent-4

clone 내용

section

파악하기

  • 구현된 목록

  • 4가지 탭을 선택할 수 있다
  • 탭마다 다른 문구와 슬라이드가 보여진다
  • 슬라이드는 3개씩 보여진다

  • 구현해볼 목록

  • 페이지 네이션이 있으며 자체 클릭이 가능하다
  • 페이지 버튼이 있으며 max 로 가면 클릭 불가 상태가 된다
  • 라디오 버튼 모양 만들기
  • 라디오 버튼 클릭시 하단의 표시내용 변경
  • 날짜 텀 드롭다운으로 선택 가능하게
  • + - 버튼, 숫자 5까지 선택 가능
  • (클릭 + 드레그)로 슬라이드 넘기기 기능

구조 만들기

  • radiobox
    • radios(정규 구독 구매)
    • radios(한번만 구매)
  • radios(정규 구독 구매)
    • input type radio
    • 라벨, 가격
    • quantity
  • quantity
    • select-box
      • (구독 텀)duration
      • count-box
        • +,- 버튼
        • add cart 버튼
  • radios(한번만 구매)
    • input type radio
    • 라벨, 가격
    • quantity
  • quantity
    • select-box
      • count-box
        • +,- 버튼
        • add cart 버튼

주의 사항

  • 라디오 박스 넘버링
  • [슬라이드 박스 번호][페이지 번호][슬라이드 번호(누적)]

  • +, - 구현
1
2
3
4
5
6
7
<div class="number">
  <button class="mi"
    onclick="this.parentNode.querySelector('input[type=number]').stepDown()">-</button>
  <button class="pl"
    onclick="this.parentNode.querySelector('input[type=number]').stepUp()">+</button>
  <input type="number" name="num" value="1" step="1" min="1" max="5">
</div>

스타일 만들기

라디오 박스 체크 모양

  • 라디오박스 체크모양 변경
    • 라벨 앞에 요소를 만들어 준다
    • 체크 되었을 때의 모양을 만들어 준다
    • 두 요소의 위치를 맞추어 준다
    • 결과 동그라미 안의 동그라미가 완성
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
.radiobox input,
.radiobox input:checked{
  appearance: none;
  position: absolute;
}
.radiobox .radios label{
  position: absolute;
  top: -5px;
  left: 6px;
  font-size: 18px;
}
.radiobox .radios label::before{
  content: '';
  display: inline-block;
  width: 18px;
  height: 18px;
  border: 1px solid #181A19;
  border-radius: 100%;
  position: relative;
  left: -4px;
  top: 3px;
}
.radiobox input:checked{
  width: 12px;
  height: 12px;
  border-radius: 100%;
  background: #181A19;
  position: absolute;
  top: -1px;
  left: 1px; 
}

선택에 따른 보여지는 내용 변경

  • 라디오 박스 선택에 따라
    • 구독형, 비구독형을 보여줌
    • visual 클래스로 관리
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
.radios .quantity{
  display: none;
}
.radios .quantity2{
  display: none;
}
.radios .quantity.visual{
  display: flex;
  position: absolute;
  flex-direction: column;
  width: 100%;
  top: 75px;
  left: 0px;
}
/* quantitiy2 설정은 여기선 생략 */

select 태그 초기화

1
2
3
4
5
6
7
8
9
10
11
12
13
.select-box .terms select{
  -moz-appearance: none;
  -webkit-appearance: none;
  appearance: none;
  display: inline-block;
  padding: 16px 21px 15px 14px;
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 1.5px;
  background-color: transparent;
  border: 1.5px solid #181A19;
}

input 태그 초기화

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
.select-box .count-box .number input[type="number"] {
  -webkit-appearance: textfield;
  -moz-appearance: textfield;
  appearance: textfield;
  display: block;
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  text-align: center;
  width: 30px;
  height: 20px;
  color: #fff;
  background-color: transparent;
  border:none; 
  box-shadow:none;
}

Javascript

  • 반복문을 활요한 슬라이드 라디오 버튼에 따른 폼 변경
  • 각각의 라디오 박스는 독립적인 name을 가지고 있기 때문에
    각각의 요소에 반응하여야 한다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
for(let s=1; s < slideboxELs.length; s++){
  let pages = document.querySelectorAll(`.sliderbox${s} .page`);
  let slides = 0;
  let a = 0;
  for (let p=1; p <= pages.length; p++){
    slides += (pages[p-1].childElementCount);
    for (let i = 1 + a; i <= slides; i++){
      let radiobox = document.querySelector(`.radiobox${s}${p}${i}`);
      let subarea = document.querySelector(`.radiobox${s}${p}${i} .quantity`);
      let oncearea = document.querySelector(`.radiobox${s}${p}${i} .quantity2`);
      radiobox.addEventListener('click', function (){
        if (document.querySelector(`.radiobox${s}${p}${i} input[name="${s}${p}${i}"]:checked`).value == 'once'){
          subarea.classList.remove('visual');
          oncearea.classList.add('visual');
        } else {
          oncearea.classList.remove('visual');
          subarea.classList.add('visual');
        }
      });
    };
    a = slides
  };
}

느낀점

  • js를 더 원활하게 다룰 수 있다면
    js쪽에서 html 요소를 만들게 만드는게 맞다고 생각했다
  • 일단은 구사 가능한 기술로 구현해보았다
    • html에서의 작성이 매우 복잡하고 많아졌다
    • 각 요소를 일일이 만들어 주어야하고 넘버링도 해야하기 때문
This post is licensed under CC BY 4.0 by the author.