웹프로그래밍/CSS

프로그래밍 언어 활용 18일차 (24/12/04)

wkun 2024. 12. 4. 13:09

CONTENTS

 

CSS 기능

1. display

2. label

3. slider

4. slide 실습

 

 

------------------------------

 

CSS 기능

 

1. display

 

display:flex; 작성

-정렬하려는 자식 요소들의 직계 부모 요소 선택

 

특징

-자식 요소들이 부모 요소보다 클 경우 1)자식 요소들이 짜부러지거나 2) flex-wrap 속성값 변경하여 줄바꿈이 됨

-해당 특징은 슬라이더에서 불편함, 추가 작업 필요

 

<display:flex; 사용하기>

 

html

<body>
  <div class="slidebox">
    <div class="slides">
      <div class="slide">1</div>
      <div class="slide">2</div>
      <div class="slide">3</div>
    </div>
  </div>
</body>

 

css

*{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

/*예제1) display:flex */
 
.slidebox{
  width: 100px;
  height: 100px;
  margin: 30px auto;
  background-color: pink;
}

.slides{
  display: flex;
}

.slide{
  width: 100px;
  height: 100px;
  border: 3px solid red;
}

 

◎ display:inline-block; 작성

-인라인요소의 특징을 가지면 됨, 정렬하려는 요소들 선택

 

◎특징

-인라인레벨요소의 특징 (가로로 쌓임), 블록레벨요소의 특징 (크기 지정 가능) 두 특성을 가질 수 있음

-단점은 자식요소가 부모요소보다 클 때 자동으로 줄바꿔짐->white-space:no-wrap;을 줘야함

-white-space:no-wrap;으로 줄바꿈 하지 않는다고 바꿔도 요소와 요소 사이 지정하지 않은 공백이 발생함

 (html 코드에서 줄바꿈이 공백으로 인식됨)-> 해당 요소들의 부모에다가 font-size:0; 작성 필요(글자 사라짐)

 

*공백도 문자로 인식

 

<display:inline-block;  사용하기>

/* 예제2) display:inline-block */
 
*{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

.slidebox{
  width: 100px;
  height: 100px;
  margin: 30px auto;
  background-color: pink;
  white-space: nowrap;
}

.slides{
  font-size: 0;
}

.slide{
  width: 100px;
  height: 100px;
  display: inline-block;
  border: 3px solid red;
  font-size: 20px;
}
/* font 주면 글자 보임 */

 

 

2. label

 

◎label 태그

-폼 요소에 대한 UI를 개선하기 위해 사용되는 요소

-입력 양식 요소와 주로 사용되며 입력 양식 요소의 목적을 명확하게 설명하거나 디자인, 스타일링 할 때 사용함

 

◎label 태그 사용방법

-특정 입력 필드와 연결: for 속성="연결할 입력 필드의 id값"

-연결한 결과: 라벨을 클릭하면 해당 입력 필드에 포커스가 이동함

*항상 잘 연결되었는지 확인 필요 

 

라벨 연결하기

 

html

<body>
  <input type="radio" name="gender" id="woman">
  <label for="woman">여자</label>
  <input type="radio" name="gender" id="man" checked>
  <label for="man">남자</label>
</body>

 

 

3. slider

 

◎슬라이더

-연속적인 콘텐츠를 하나의 콘텐츠로 보여주는 UI

-여러 이미지를 가로 또는 세로로 나열하여 사용자가 한 번에 하나의 이미지나 콘텐츠를 볼 수 있게 함

 주로 제품(상품) 및 이벤트 홍보나 주요 뉴스 정보 전달할 때 사용됨

 

◎슬라이더의 구성

1)슬라이드 박스: 콘텐츠가 실제로 보여지는 화면

2)슬라이드 아이템: 각 슬라이드에 해당하는 콘텐츠(이미지, 텍스트 등)

3)네비게이션 요소: 이전 및 다음 버튼(라벨) 등

 

 

◎슬라이더의 원리

1)크기 지정

-슬라이드 박스: 콘텐츠가 실제로 보여지는 화면의 크기 조정(width)

-슬라이드 아이템: 슬라이드 박스 사이즈의 100%로 크기 조정(width)

2)정렬 및 배치

-슬라이드 아이템들을 여백 없이 가로 정렬

-각 이미지별 라벨(왼쪽, 오른쪽) 위치 조정

3)기능 구현

-콘텐츠별 input:radio가 있고 좌,우 라벨이 존재함

 좌,우 라벨이 콘텐츠의 input:radio와 연결됨을 확인(리모콘으로 좌,우 버튼을 눌러 TV채널을 바꾸는 것과 같음)

-n번째 콘텐츠의 radio버튼이 체크되었을시, 모든 콘텐츠를 동시 선택하여 한번에 (n-1)*100%만큼 왼쪽으로 이동 

 

<슬라이더 html 기본 구성>

<body>
  <input type="radio" name="slide" id="s01">
  <input type="radio" name="slide" id="s02">
  <input type="radio" name="slide" id="s03">
  <div class="slidebox">
    <div class="slides">
      <div class="slide">
        <label for="s03" class="left">left</label>
        1
        <label for="s02" class="right">right</label>
      </div>
      <div class="slide">
        <label for="s01" class="left">left</label>
        2
        <label for="s03" class="right">right</label>
      </div>
      <div class="slide">
        <label for="s02" class="left">left</label>
        3
        <label for="s01" class="right">right</label>
      </div>
    </div>
  </div>
</body>

 

<슬라이더 css 크기 지정 및 정렬>

*{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

/* 슬라이더 css 크기 지정 및 정렬 */

.slidebox{
  width: 100px;
  height: 100px;
  margin: 30px auto;
  background-color: pink;
  white-space: nowrap; /* 여백 없이 가로 정렬 */
}  

.slides{
  font-size: 0;
}

.slide{
  font-size: 16px;
  width: 100px;
  height: 100px;
  display: inline-block;
  border: 3px solid red;
}

 

<슬라이더 css label 배치하기>

/* 슬라이더 css label 배치하기 */

.slide{
  font-size: 16px;
  width: 100px;
  height: 100px;
  display: inline-block;
  border: 3px solid red;
  position: relative;
}

label{
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

.left{
  left: 0;
}

.right{
  right: 0;
}

 

*position: relative; 부터 추가 사항

 

<슬라이더 css 기능부>

/* 슬라이더 css 기능부 */

#s01:checked ~ .slidebox .slide{
  transform: translateX(0%);
}

#s02:checked ~ .slidebox .slide{
  transform: translateX(-100%);
}

#s03:checked ~ .slidebox .slide{
  transform: translateX(-200%);
}

input{
  display: none;
}

 

 

4. slide 실습

 

html

<body>
    <input type="radio" name="slide" id="s01">
    <input type="radio" name="slide" id="s02">
    <input type="radio" name="slide" id="s03">
    <div class="slidebox">
      <div class="slides">
        <div class="slide">
          <label for="s03" class="left"><</label>
          <label for="s02" class="right">></label>
        </div>
        <div class="slide">
          <label for="s01" class="left"><</label>
          <label for="s03" class="right">></label>
        </div>
        <div class="slide">
          <label for="s02" class="left"><</label>
          <label for="s01" class="right">></label>
        </div>
      </div>
    </div>
</body>

 

css

*{
  margin:0;
  padding:0;
  text-decoration : none;
  list-style:none;
  box-sizing:border-box;
  color: inherit;
}

/* 크기, 정렬 */

.slide img{
  width: 100%;
}

.slidebox{
  width: 300px;
  height: 300px;
  margin: 30px auto;
  white-space: nowrap; /* 여백 없이 가로 정렬 */
  overflow: hidden; /* 넘치는 부분 이미지 지우기 */
}

.slides{
  font-size: 0;
}

.slide{
  font-size: 50px;
  width: 100%;
  display: inline-block;
  position: relative;
  /* border: 1px solid red; */  /* 영역 다차는지 확인 */
}                  

/* 배치 */

label{
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
}

.left{
  left: 0;
}

.right{
  right: 0;
}

/* 기능 */

#s01:checked ~ .slidebox .slide{
  transform: translate(0%);
}

#s02:checked ~ .slidebox .slide{
  transform: translate(-100%);
}

#s03:checked ~ .slidebox .slide{
  transform: translate(-200%);
}

input{
  display: none;
}

 

 

------------------------------